idea sql 多表查询_SQL-多表查询

本文介绍了SQL中的联结操作,包括交叉联结、内联结、左联结、右联结及全联结,并通过具体案例展示了如何应用这些联结方式解决实际问题。此外,还介绍了case表达式的使用方法。

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

一、表的加法

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

8fd51cef7e3bff14f5a9cf27098405c7.png

f5608e252197296de7696886050f71a2.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运行顺序。

1115e89c8a11132659d3cd96e22b904e.png

三、联结的应用案例

练习:

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

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

d7aa7ce7aebacbbd5876e21d8bf99943.png
3张表的联结

四、case表达式

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

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

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

2.注意事项

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

②end不能省略

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

练习:

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

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

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

五、SQLzoo练习题

352f0b99588ef3dcb7d491621761ca98.png

67e7eab89469264ddf881ee680e5fd64.png

6aa3f2304714796b8fb189f7a86099bc.png

0df69858296782b6c257f53f07671466.png

878d5f5f3c7d4abdd3a0cf765b673559.png

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

959db04edec1a2026bbfd7c63733e690.png

2d81565853369871f5390e58dc1bc287.png

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

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

85eaea9c7516acb24d7ebafec3eab1cd.png

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值