一、新手 1+N 模式查询
题目: 查询价格大于 2000 元的商品及其栏目名称
1. 价格大于 2000 元的商品
select goods_id,goods_name,cat_id,shop_price from goods where shop_price>2000;
2. sql 执行之后 , 循环取出 cat_id;
$sql = 'select goods_id,goods_name,cat_id,shop_price from goods where shop_price>2000';
$rs = mysql_query($sql);
$data = array();
while($row = mysql_fetch_assoc($rs)) {
$data[] = $row;
}
foreach ($data as $key => $value) {
$sql = 'select cat_name from category where cat_id='.$v['cat_id'];
}
// 一条sql语句 -> N条数据 -> N条查询
我们需要一条 sql 语句查询出来 , 那有没有可能从一张表中就能查出来 ? 不可能 , 查询的字段是分别在两张表中的 , 肯定需要从两张表中查询出来 -> 连接查询
二、内连接查询
左边的表的每一行 , 都有一次机会跟右边表去试图连接,不过能不能连接上是有条件的
select boy.hid,boy.bname,girl.hid,girl.gname
from boy inner join girl
on boy.hid=girl.hid;
# 内链接为左右连接的并集
# 那有没有左右连接的交集 , 并集是外连接,mysql 中不支持外连接 ,oracle 和 sql server 可以
三、左连接及右连接查询
左连接和右连接类似 , 只是调个方向
1. 左连接,所有男士站出来 , 找到自己的另一半 , 没有的 , 以 NULL 补齐
select boy.hid,boy.bname,girl.hid,girl.gname
from boy left join girl
on boy.hid=girl.hid;
# 左连接的特点 :
# 左表所有的数据全部取出来 , 然后到对应的右表去找数据 , 如果找不到数据 , 补 null
2. 右连接 , 以右表为准 , 全部取出
select boy.hid,boy.bname,girl.hid,girl.gname
from boy right join girl
on boy.hid=girl.hid;
连接查询 , 通过 on 将两张表打通一个桥梁 , 拼接成一张大表,既然是一张大表 , 我们后面是不是可以跟着写那 5 个子句 where group by ...