idea sql 多表查询_SQL多表查询

1.表的加法(union)

select 课程号,课程名称
from course
union
select 课程号,课程名称
from course1;

union会删除重复行,如果想保留,应使用

union all

2.表的联结

联结类型:cross join, inner join, left join, right join, full join

  • cross join 交叉联结

51ed86aae6d241b9be9ff5ffbc4444c0.png
交叉联结的结果行数是两个表行数的乘积(比如扑克牌4花色 X 13张牌)
  • inner join 内联结

输出的是两个表中都存在的相同列数据(下图中的学号,只有0001在两边都有)

1f8a08ab5e8995ea4154489383e36a63.png
select a.学号,a.姓名,b.课程号
from student as a inner join score as b
on a.学号 = b.学号
  • left join 左联结

以左侧的表为主,取出左侧表全部数据,只取出右侧表中存在于左侧表的数据,进行交叉联结

6f54c4836471b421edb95a38b7c9bd79.png
select a.学号,a.姓名,b.课程号
from student as a left join score as b
on a.学号 = b.学号

如果只想输出仅存在于左侧表的数据添加子句:

where 右侧表.列名=Null

1858c40d1a5245aee3bf3d78892fc2e7.png
  • right join 右联结

以右侧的表为主,取出右侧表全部数据,只取出左侧表中存在于右侧表的数据,进行交叉联结

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


select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号 = b.学号
where a.学号 = Null;
  • full join 全联结(mysql不支持全联结!

输出全部存在于两侧表的数据,如果一边数据不存在于另一边,则仍以null输出

  • 总结:

b4a6b383b32fae3f3c017135993cdb9e.png

3.联结应用案例

75a1b63570980494b514d6273dfa9f48.png

注意:最后要在select子句中加入每列数据对应的表的别名

52212f0076ae16246154c2f6f45f9387.png

c29f2020f36a6b050e69b405adc2c66b.png
多表join

4.case表达式

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

依次判断《判断表达式》是否符合,若符合直接跳出case,否则执行下一个when子句,直到所有when子句都不符合,则执行else子句

示例:

select 学号,课程号,成绩,
(case when 成绩>=60 then ‘及格’
       when 成绩<60 then ‘不及格’
       else null
end )as 是否及格
from score;
select 课程号,
sum(case when 成绩>=60 then 1
     else 0
     end) as 及格人数,
sum(case when 成绩<60 then 1
     else 0
     end) as 不及格人数
from score
group by 课程号;

注意事项:

  • else语句可以不写,但是end不能不写

87694d37e800b26bb85957d82242f24f.png
注意,group by多个列分组的情况

SQLZOO练习记录

The JOIN operation/zh

f6f4472194bd05784d29eee9e233cc2b.png

a51cc032a11e7b99dd49a82ca7633d64.png

50e44d304454e9382444303f661af762.png

c2c8f2f26fcbcdac53174e40e82d0b8a.png

3858f1da36b5c8c48be9187d08b3894d.png

fe5836bfc5a2e030d7a9c0571f289f8c.png

注意第十一题,因为要输出 id 和 mdate,分组的时候,需要也把mdate分组否则就不会保留这一行数据

0629fd151f4977c0b13a0ffd60b1f71a.png

一开始想设计team1和team2用or并列筛选ger,但实际上不需要这么复杂,只要筛选goal中含有ger的就可以了

f6f1b1a3f20043a8965f644a388f39db.png

13题很复杂,可以多多复习,注意不能用inner join,因为如果两边都没有进球,就不会被放在总表里

case when的使用很灵活,要多加思考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值