case when then else_SQL表的加法、多表查询(联结)和case表达式

一、表的加法

关键词:

union:将两个表的数据按行合并在一起。会将两个表里重复的数据删除,只保留一个。

Union all 可以保留两个表里重复的行。

用union将两个表合并

SELECT 

33945c2452b346e081b9c5ce3bc7a175.png

用union all将两个表合并(保留重复值)

SELECT 

6bb72c06cb8cad504bcb7badb41b7257.png

二、表的联结

关系数据库是由多张表组成的,表和表之间通过列产生联系。

联结类型:交叉联结、内联结、左联结、右联结、全联结

交叉联结(笛卡尔积)cross join:将一个表中的每一行都与另外一个表中的每一行合并在一起。得出结果的行数是两张表中行数的乘积。

交叉联结在实际业务中应用的比较少,原因:

  1. 结果没有实用价值
  2. 结果行数太多,要花费大量的计算时间和高性能设备的支持。

但是交叉联结是所有联结运算的基础。

交叉联结

SELECT 

812387a137d69b5a11861c60e0a4bca9.png

内联结 inner join:查找出同时存在两张表中的数据。先取出两个表中符合条件的行,再进行交叉联结。

内联结

SELECT 

a046cf3bd7d789da0351a0ace8f860ce.png

左联结left join:将左侧的表作为主表,将主表中的数据全部取出来,右边的表选出和左表相同的行。

SELECT 

885a7a0e2fbef93d7a589bd6476b1bf2.png

可以看出如果右表没有左表的数据,结果将返回为空值。

将左表只包含的数据查询出来:

SELECT 

c6e3d2d0028be57f5956b1d42ae9bb71.png

右联结:right join,将右表的数据全部取出来。左边的表只选出和右表相同的行,将两个表取出的数据合并。

SELECT 

d4be72a4ba134347efb0338c17cf7b2c.png

可以看出结果中包含了右表中所有学号0001,0002,0003,但不包括左表中的0004。

同样可以用 null 来取出只有右表包含的学号:

SELECT 

fc486a44c63e4f3bd9b80f4881ec4f0f.png

全联结full join:返回左表和右表中的所有行,当某行有匹配的时候,两行进行合并,如果没有匹配的,对应用空值进行填充。

MySQL不支持全联结。

各种联结的总结:

  1. 如果要得出两个表的公共部分,使用内联结
  2. 在实际业务中,如果要生成固定行数的单据,或者取出某一个表的全部数据,就用左联结或者右联结。

f3bb008e7a750eb1afb23a488834d375.png

ada437b75b6558dfce8302ca8b383daa.png

9c957546b00b054860116e060f1fad3b.png

176a2dde041db31f301360be8b6c94a8.png

三、用SQL中的联结语句解决业务问题

查询所有学生的学号、姓名、选课数、总成绩

解题思路:

  1. 首先查询结果中的列名来源student和score两个表,并且是所有学生的学号,所以使用左联结将两个表结合
  2. 结合之后,将表按学号、姓名进行分组
  3. 对分组之后的表使用count和sum函数
SELECT 

a59226e5eeaa47b2d3f0a3b4867859b8.png

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

解题思路:

  1. 首先查询结果中的列名来源student和score两个表,并且是所有学生的学号,所以使用左联结将两个表结合
  2. 结合之后,将表按学号、姓名进行分组
  3. 用having 子句对分组之后的结果进行筛选(avg成绩>85)
SELECT 

27ed42e29f54d0a0ee728452dbea44ea.png

查询学生的选课情况:学号、姓名、课程号、课程名称

解题思路:

学号、姓名在student中,课程号和课程成名在course中,但是两个表之间没有联结键。又因为score中包含了学号和课程号,所以使用score将表student和course联结起来

SELECT 

16775611f1b3a8c266a3fe1243734b84.png

四、Case表达式

Case表达式在区分情况时使用。

Case表达式的语法:

Case  

其中的判断表达式类似 列=值,case表达式会从对最初的when子句中的“判断表达式”进行求值开始执行,如果结果为真,就返回then子句中的表达式,case表达式的执行到此为止。如果结果不为真,就转到对下一条when子句求值。如果直到最后的when子句返回结果都不为真,就返回else中的表达式。

  • Else子句可以省略,表示默认else null,但是最好不要省略。
  • End子句不可以省略。
  • Case表达式可以书写在任意位置。
  • Case表达式可以将select语句中的行列结果进行互换。

将学生每门课程的得分用及格和不及格标识出来

SELECT 

f158f0b582d676238b9cda2724f13fdb.png

查询每门课程的及格人数和不及格人数

解题思路:首先将score按课程号分组,再对分组结果使用case表达式

SELECT 

c52dca7e050eb91af5e4af6e1fda4efb.png

使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数、课程号、和课程名称

解题思路:

  1. 课程号和成绩在score中,所有课程名称在course中,用右联结将两个表结合在一起
  2. 将联结之后的表按课程号分组,再对分组之后的成绩运用case表达式
SELECT 

d255c3e81c1532fabbada0788c3f5315.png

五、SQLzoo练习题

The JOIN operation​sqlzoo.net

1

select 

02b4687f934c8ef649e6456de070368a.png

2

SELECT 

296f3cc832d5d1a57eddf868c75c8175.png

3

SELECT 

17c8389fff7003d97193271a9deb8599.png

4

select 

15093e58542fe5ac01d05f09c65931e2.png

5

SELECT 

de7c36b432e7ab1ee6f085878ce9c0ce.png

6

select 

961aa8c370872671e3cbde3f3ba0283e.png

7

select 

ca5202e4c9d4987be403d8d7a0d1a6a4.png

8

SELECT 

1af1aeb4ce69ffe0e2ae86066fde3f63.png

9

SELECT 

9a9c33d5c06f692b753df9bdfc6bd058.png

10

select 

7e3f3a84daed936e378d26470fd655f6.png

11

select 

d34582b93d22532e6c2a90a9813c47dd.png

12

select 

d2a97a571f9ecf57924710271819659a.png

13

select 

3dde14965e31eb6b7702cd5d9d534eb2.png
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值