(所需的两个表sh_goods与sh_goods_category 的创建在博客中已写过。注:命令窗口中所有符号为英文状态)
一、多表查询
1.联合查询
union是实现联合查询的关键字,all和distinct是联合查询的选项。其中,all表示保留所有的查询结果;distinct是默认值,可以省略,表示去除完全重复的记录。
在sh_goods表中,以联合查询的方式获取category_id为9的商品id、name和price,以及category_id为6的商品id、name和keyword。
select id,name,price from sh_goods where category_id=9 union select id,name,keyword from sh_goods where category_id=6;
(select查询的字段个数必须相同,且联合查询的结果中只保留第一个select语句对应的字段名称,即使union后select查询的字段与第一个select查询的字段表达含义或数据类型不同,MySQL也仅会根据查询字段出现的顺序,对结果进行合并。)
若要对联合查询的记录进行排序等操作,需要使用圆括号“()”包裹每一个select语句,在select语句内或在联合查询的最后添加order by语句。并且若要排序生效,必须在order by后添加limit限定联合查询排序的数量,通常推荐使用大于表记录数的任意值。
例如,以联合查询的方式,对sh_goods表中category_id为3的商品按价格升序排序,其他类型的产品按价格降序排序,查询的商品信息为id、name和price。
(select id,name,price from sh_goods where category_id<>3 order by price desc limit 7)
union (select id,name,price from sh_goods where category_id=3 order by price asc limit 3);
2.连接查询
交叉连接
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积。例如,商品分类表中3个字段、4条记录,商品表中有5个字段、10条商品信息,那么交叉连接后的笛卡儿积就等于4*10条记录,每条记录中含有3+5个字段。
cross join用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合。
使用sh_goods_category 表中的每一条记录与sh_goods表中的记录进行连接,最后查询出来的记录数为160(sh_goods_category表中的记录数16乘以sh_goods表中的记录10)。
select c.id cid, c.name cname, g.id gid, g.name gname from sh_goods_category as c cross join sh_goods as g;
内连接
on用于指定内连接的查询条件,在不设置on时,与交叉连接等价,此时可以使用where完成条件的限定,效果与on一样。但由于where是限定已全部查询出来的记录,那么在数据量很大的情况下,此操作会浪费很多性能,所以此处推荐使用on实现内连接的条件匹配。
下面以内连接的方式查询商品表sh_goods和商品分类表sh_goods_category表中对应商品的分类id及name。
select c.id cid, c.name cname, g.id gid, g.name gname from sh_goods g join sh_goods