sql case when then else多个条件_SQL-多表查询

本文介绍了SQL中的表合并操作,包括UNION和UNION ALL,以及不同类型的JOIN(交叉、内、左、右、全联结)的使用场景。还详细阐述了CASE表达式的条件判断功能,并提供了实际案例。此外,文章通过SQLZOO练习题展示了WHERE子句、LEFT JOIN和COUNT函数的实际应用,强调了在数据分析和查询中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、表的加法

union:将多个表的数据记录按行合并在一起(即多个表的并集),同时返回的结果会删除重复行,重复的记录只保留一行。如果需要保留重复行,可以使用union all

fcf05f09e121e70e223c92af8f8acbf2.png

f28d0ac31e65ffe1a649f2f01d212efe.png

二、表的联结

1.交叉联结(cross join)

也叫笛卡儿积,指将表中的每一行和另外一个表的每一行合并在一起,返回的结果的行数等于两个表的行数的乘积,交叉联结是所有联结的基础。

2.内联结(inner join)

指查找同时存在于两张表的数据,即两个表的交集

3.左联结(left join)

指将左侧的表中的数据全部取出

4.右联结(right join)

指将右侧的表中的数据全部取出

5.全联结(full join)

指返回的是左表和右表中的所有行,如果没有匹配的行则会显示空值,MySQL不支持全联结

6.选择联结的方法

根据想要保留哪一部分数据来选择用哪一种联结,当需要生成固定行数的表单或者需要指定取出哪一张表中的全部数据的时候,使用left join或right join,其他情况则用inner join,另外,联结不会影响SQL运行顺序。

009c8d0932ea3d5591697aacde0bcd53.png

三、联结的应用案例

练习:

0cba5f86caf65ba8266cea84e2fa8df5.png
左联结,题目要求是所有学生,因此以学生表为主表,以学生表的学号分组

d1e8ead061f4b7d6633964143ad44860.png
having子句对分组结果指定条件

b98f23dda356962c3e4a084d0c3b16f3.png
3张表的联结

四、case表达式

1.case表达式用于多种情况的条件判断

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

when子句的判断表达式用于判断某一行数据是否符合某个条件,若符合则返回then子句的表达式,若不符合则继续执行下一个when子句,如果所有的when子句都不符合,则返回else子句的表达式。

2.注意事项

①else子句可以省略不写,默认为else null,但不建议省略

②end不能省略

③case表达式可以书写在任意子句中

练习:

256d40a38e5451b4910787eafa421844.png
按课程号分组,通过sum求和计算人数

74f9886c36bcddf5bdbe99bf218d4f87.png
自定义分组,因为课程号和课程名称是一对一的对应关系,所以group by后面可以加课程名称,如果两者不是一对一的对应关系,则不能添加

Group by 分组时,当用多个列来分组时,这几个列的值要全部相同才算一组,例如以上的课程号和课程名称要一一对应。

五、SQLzoo练习题

c44621b2d69a5e4ac76747724626d35d.png

6efb8d4873bae3e1faa48cf937d600b0.png

f0f11e9a5f50aa52028056dfdf6196ad.png

855f36d7b4fe0f89173fb46ef0217cef.png

5d1d839bed098fd66ab58a8563acb821.png

712a3c871656c671e40e2bd4060f20ab.png
where子句中的条件:主队是德国或者客队是德国,比如德国 和 A队比赛(德国是主队),进球的是A队,A队和德国比赛(德国是客队),进球的是A队,内联结的结果中入球球员有重复值,用distinct去重复值

1e4342b2cf359d3bf138922953c97fbd.png

0388383d6b0cd5ec33d5aed8acb0866b.png

40f6a4fe18d6b401ad9bd76ec662c732.png
比赛地点(比赛信息表game),和每个比赛地点的进球数(进球信息表goal:按比赛地点分组,对进球人员进行汇总count(player),要查出比赛信息表game中全部比赛地点,所以是左联结,game表是主表

e686f76251a17675fff2bfa98534396c.png
查找出有波兰球队'POL'参加的比赛编号,比赛日期,对应这场比赛的进球数

a402687a2ed5e158fbd2c6a99d546efa.png

b22c575c3ad109ad687f613082818ec7.png
比赛编号,比赛日期(在比赛信息表game)和'GER'得分的进球数(进球信息表goal:按比赛地点分组,对进球人员进行汇总count(player)

8b7cf12029a7accc6e737504844db5c4.png
查找出所有比赛的日期,每场比赛中对战双方各自的进球数(也就是team1进球数,team2进球数),当比赛信息表game中的球队编号(team1)也出现在进球信息表(goal)中时,表示这个球队进球了,使用case语句来统计,要查出game表中的全部比赛日期,所以用左联结,game表是主表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值