继续MySQL的学习啦~~
如果对建表、基本查询有问题的,可以去看看我的上一篇博客~
1、左右连接
以左连接为例,假设左表为A,右表为B,左连接的语法为:A left join B on 条件;
关于左连接,我们可以这样理解:以A表为中心,滑动B表进行关系匹配,匹配成真的条目提取出来。
据此,我们的A表中的每一条数据至少存在1次在新表中,如果表A中的某一条数据无法与表B中的数据
进行匹配的话,用Null值补齐。而表B中无法匹配的条目将不出现在新表中。
提醒:右连接与左连接的本质是一样的,A left join B on 条件 等价于 B right join on 条件。
在MySQL使用中,我们推荐使用左连接。
具体例子:
表A 表B
select b_name , b_other, g_name
from boys left join girls on b_other = g_other;
结果如下:
2、内连接
内连接可以理解为是同一数据的左连接和右连接的交集。即不出现上述中所带有的Null值的条目。
内连接语法: A inner join B on 条件;
具体例子:
select b_name , b_other, g_name
from boys inner join girls on b_other = g_other;
结果如下:
注意:多次连接时可以将前一次连接得到的结果看成一个临时表,然后继续进行连接操作。同时,在连接操作之后select的5种语句可以使用。
具体例子(球队比赛):
比赛表 球队队名表
取出结果形式:主队名称 比赛结果 客队名称 比赛时间
select t1.t_name, m_result, t2.t_name, m_date from
(m left join t as t1 on h_id = t1.t_id)
left join t as t2 on g_id = t2.t_id;
结果如下:
3、union(合并两张或多张表,只要表的列数相同就能合并,而列名取的是第一行数据的列名)
具体例子:
(取出栏目四和栏目五中的所有商品)
改进(取出栏目四和栏目五下的商品按价格升序排列)
(select goods_id, goods_name, cat_id, shop_price
from goods
where cat_id = 4)
union
(select goods_id, goods_name, cat_id, shop_price
from goods
where cat_id = 5)
order by shop_price asc;
注意:在使用union时,当内部查询单独使用order by时,在Mysql代码优化分析器中该语句会被优化而不产生效果。
同时,使用union后得到的可视为一张表,因此可以进行继续操作。
当内部查询order by 与limit配合使用时,order by是不会被过滤的。
具体例子:
(取出栏目3下商品价格前3的商品和栏目下商品价格前2的商品)
(select goods_id, goods_name, cat_id, shop_price
from goods
where cat_id = 3
order by shop_price desc
limit 3)
union
(select goods_id, goods_name, cat_id, shop_price
from goods
where cat_id = 4
order by shop_price desc
limit 2);
结果如下:
在union使用中,默认为是去重复的,如果不希望去重复,即所有条目都展示时,只需要在union后加上all就可以了。
未完待续......