left join左表百万数据查询慢_SQL多表查询

表的加法:将多张表的同列数据整合到一张表上

关键词:union 删除重复行 union all 保留重复行

1e89c2037c6b189cfca3632b86630ba5.png

08fc5e3971df8a052e954b5c9862bafb.png

表的联结:将多张表的不同列数据整合到一张表上(join)

49ff52b06e1e9977926a4cee414564ed.png
  1. 交叉联结(笛卡尔积):两张表的各行和各列两两组合,是所有联结的基础
  2. 内联结:取出同时存在于两张表中的数据(交集)后进行交叉联结

关键词:inner join;from中有两张表;用on来进行联结

select a.学号,b.姓名,b.课程号
from student as a inner join score as b
on a.学号=b.学号

1a6e372bf7044c93664fcb8d57f20cae.png

从两张表中取数据时需要注意字段分别属于哪张表

f60a2884e36d47b7a3f2074966aaea30.png

3. 左/右联结:取出左/右表中的所有数据与右/左表相同行进行交叉联结,没有对应行时显示为空值

关键词:left/right join;from中有两张表;用on来进行联结

select a.学号,b.姓名,b.课程号
from student as a left/right join score as b
on a.学号=b.学号

49ac78c2b8e346a5038b77e8d7a79ef5.png

当添加子句where b.学号 is null时取出去掉两表公共部分的数据

f8de9b921180071a435aa7c9771978df.png

右联结:在course中添加一条数据:

a617fb2ff5f0f18de2eb980f216a79a8.png

右联结取出右表中所有的数据,左表中无对应的数据就显示null

b26db33617c3cc0955d32d83103a480b.png

取出只在右表中的数据:

36066ba2211fca74c5b07c2599b6bfbd.png

当有多张表做联结时,一般采用left join,先将学生表和成绩表通过学号做联结,生成一张大表,再用left join,将大表与课程表通过课程号做联结,同理与教师表再进行联结。

f3e9dd3eddddbce0dd5b361a73f3fefd.png

e6e1b3f1a685b9b5ff5cb5abc8d482ae.png

生成表以后还是可以用查询条件以及排序条件进行排序

dd2fcc0009c5a9d04e3e6a49e3ff761b.png

4. 全联结:取出两表的所有行,有相同的行进行合并,不相同的行用空值表示

关键词:full join;mySQL不支持

b952e7f3a9c7c21fd1f216ac224edeb2.png

练习

  1. 查询所有学生的学号(左联结student表),姓名,选课数(课程计数),总成绩(成绩汇总)

两表联结时必须指明列从哪张表中来,否则会报错

e481fd2e2d8a36d5fb2d4448bb16df7a.png

fd7adb44a0ac33923cc66e15cab109d4.png

当学号从成绩表中选择时,0004号的学号就不会显示

dc54e9cddd085bad3f2ded63a12826a9.png

如果采用右联结,即会显示在成绩表中所有学生的成绩,但是不一定有姓名显示,因为学生表中没有0005号学生的记录。

b8d0853865e37100675fd1359c474797.png

如果采用内联结,只会显示在2张表中同时存在的学生信息,而要查询这两张表中所有学生的成绩只有在学生表中补上所有学生的信息才能显示,即要查询所有学生的信息需要确保学生表中的信息是完整的。如果有数据缺失,那就需要分别用左右联结找出缺失的部分进行补足。

1c2a75b3aed355024e13eef785b05aef.png

2. 查询平均成绩大于85的所有学生的学号,姓名和平均成绩

8ac3af11b27b8e31b9a4ee879742a83f.png

聚合函数不能在where子句中使用,只能用于having子句中筛选

2765b5b4903499398f0af50b14668818.png

3. 查询学生的选课情况:学号,姓名,课程号,课程名称

b8b2b40723efa97d1b2ffa23cd9e19b2.png

case表达式:用于对相关条件的判断

case when<判断1> then<表达式1>
     when<判断2> then<表达式2>
...
     else Null
end

关键词:case、end不能省略;else 可以省略

用多种条件进行判断时,可以用group by进行分组,前提是这几列的数据全部相同才能进行合并

练习:

  1. 查询出每门课的及格和不及格人数

13925885d0f727d016d5806658293478.png

查询出分段成绩的人数:

050839b2c072cc4f5d6e239e39d1e70a.png

与 excel中的if函数不同,每个查询条件不会剔除上一个条件的值,因此,条件不能有相互交叉

95b59a5c15de74f2d9af8b3d4a32c7c8.png

887a8aed1dbfbed1d01854a63dbcd940.png

SQLZOO

518900883276ea5ca0e88656813b02d2.png

e72cabf72dce3b7164c4a6d21f494fb1.png

ca4e69a968de2be4bb5da2f106d17c6e.png

50b430705344c111c8cb885799fc468a.png

234a835396356f5e53f640bd07d3354a.png

d813afa7c8eb95965152da5fd9032fca.png

2572df36150d3b6aba708b38b6299690.png

5f15ea3728476662159e2015507c80bf.png

9ec9dbb486c569581be659de97175832.png

375a5c8200f595d0bf7fc87f42fd59d7.png

87f045cc5408744330235a0f96bd4f49.png

bda7eaf9b557008a07917934a16856cb.png

f51992b7cce4dad6ebc9b90c0fb23a50.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值