经过上一篇文章的介绍和分析,SQL连接查询一共有四种:
左连接:left join
右连接:right join
内连接:inner join
外连接:full join
虽然不同数据库采用了不用SQL标准,对连接的叫法也不一样,但从概念和功能上看也可以细分为以上四种,所以掌握好使用连接的用法是查询优化的关键。
在SQL查询中常常遇到需要使用连接查询的情况:
场景1:在学校入学登记的时候,同学们都会填写入学登记表,其中有几个同学的名字写得太潦草以致于把信息录入系统的曹老师也分不清谁是谁。为了不致于出错,于是没有把看不清的名字记录在系统内。第二天学校领导把曹老师叫过去,给了老师三个名字,说这三个人欺负女同学被举报了,要曹老师查出来是哪个班的。曹老师根据名字一查,只查出了一个人的班级信息,这时候突然想起了昨天有几个同学的名字没有在系统内。曹老师稍微想了想就写出了一句既可以查出已有名字的同学的班级信息又能查出没有名字的同学姓名和空缺同学名字的班级。
假设:
欺负女同学的名字表:t_a
入学登记信息表:t_b
那么查询语句应该这样写:
select t.姓名,t.班级 from(
select t_a.同学名字 as 姓名,t_b.同学名字 as 登记名字,t_b.班级名称 as 班级 from t_a full join t_b on t_a.同学名字=t_b.同学名字
)as t
where t.登记名字=t.姓名 or t.姓名 is not null or t.登记名字 is null
这句SQL语句看上去挺复杂的,其实逻辑很清晰,想利用外连接把两个表压缩成子表,然后再从子表中拿到我们想要的数据。
不利用外连接是否能达到同样的效果呢?这是不可能达到的,因为where只能是两表笛卡尔集的结果,而连接是笛卡尔集之后再进行单表返回记录,这样能使结果集最小。
场景2:自从那三个调戏女生的同学被通报批评之后,校园又陷入了平静,但曹老师内心不却一点都不平静,因为一年一度的校花评选大赛马上要开始了。评选校花之前要先评系花,评选系花之前要评班花,既然要评班花就需要整理资料出版宣传海报。秉着公平公正的原则,曹老师要给每个女生机会,所以每个女生的信息都要出现在海报中。为了突出一个有希望能赢得校花的女生,曹老师开始了信息的筛选。大二大三大四的主推女生就是上届班花,大一的就由同学选择。
假设:
学生表:t_a
上届班花表:t_b
那么查询语句就应该这么写:
select s.姓名,t_b.班花信息 from (select * from t_a where t_a.性别=‘男’) as s left join t_b on s.姓名=t_b.班花姓名
这句查询分两步:
第一步:从学生表中选出女生
第二步:将女生(表)左连接到上届班花表
这样海报中就有了一个突出的女一号和所有女二号了
总结:
当在查询中有多个表,其中一个是主表,其他表是次表时采用左连接或者右连接,也就是主表的信息一定要体现,次表符合要求才给体现的机会。
当不分主次表时采用内连接,这个时候on的效果和where的效果一样
当都是主表时采用外连接,符合条件的要上,不符合条件的也要上