oracle case when 可以跟子查询_sql之多表查询

本文介绍了如何在Oracle SQL中使用Case When结合子查询来解决复杂的业务问题,包括表的加法、联结语句的应用以及Case表达式的详细解析。案例涵盖Union和Union All的使用,以及多种联结类型,通过实例展示Case表达式的灵活性和实用性。

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

一、表的加法

关键词:

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

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

用union将两个表合并

select 课程号,课程名称,教师号
from course
union
select 课程号,课程名称,教师号
from course1

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

8cfdef896ada2fab19ab7a3e6f8d1f02.png

bf5af16b38cb8df4d0e23c3091d9f443.png

练习二: 表的连结

-- 内连接
SELECT a.学号,a.姓名,b.课程号
from students as a INNER JOIN score as b
on a.学号 = b.学号;

b9602ca6a3249bc2902ef1a5dcb046fa.png
-- 左连接
SELECT a.学号,a.姓名,b.课程号
FROM students as a left JOIN score as b
on a.学号 = b.学号;

f10f1977aaade37e1a8197774afa8d1d.png
-- 右连接
SELECT a.学号,a.姓名,b.课程号
FROM students as a RIGHT JOIN score as b
on a.学号 = b.学号;

91778c78ec602235632a6be2bbfafd0a.png
-- 只有左边学号
SELECT a.学号,a.姓名,b.课程号
FROM students as a left JOIN score as b
on a.学号 = b.学号
WHERE b.学号 is NULL;

a0e9bc1ed7d88cffeb0f30137a9a588a.png

各种联结的总结:

f05e7be8e8a0869c15aa92c22296201e.png

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

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

SELECT a.姓名,a.学号,COUNT(b.课程号) AS 选课数,SUM(成绩) AS 总成绩
FROM students AS a LEFT JOIN score AS b 
ON a.学号 = b.学号
group by a.学号,b.课程号;

c0e4fb56ab3ae81a2a4d46e6816ff39a.png
-- 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
SELECT a.学号,a.姓名,AVG(b.成绩)
FROM students AS a LEFT JOIN score AS b
ON a.学号 = b.学号
GROUP BY a.学号
HAVING AVG(b.成绩)>85;

f7608b94cfff5566e63d1c3411281cc9.png
-- 查询学生的选课情况:学号、姓名、课程号、课程名称
SELECT a.学号,a.姓名,b.课程号,c.课程名称
from (students as a LEFT JOIN score as b
on a.学号 = b.学号) LEFT JOIN course as c
on b.课程号 = c.课程号

ec9b4b063eccd06ead3233323576735c.png

四、Case表达式

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

Case表达式的语法:

Case  when <判断表达式>  then <表达式>
      when <判断表达式>  then <表达式>
      when <判断表达式>  then <表达式>
...
Else <表达式>
End

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

  • Else子句可以省略,表示默认else null,但是最好不要省略。
  • End子句不可以省略。
  • Case表达式可以书写在任意位置。
  • Case表达式可以将select语句中的行列结果进行互换。
-- 将学生每门课程的得分用及格和不及格标识出来
SELECT a.姓名,b.课程号,(CASE WHEN b.成绩>60 THEN
		'及格'
	ELSE
		'不及格'
END )AS 是否及格
FROM students AS a LEFT JOIN score AS	b
on a.学号 = b.学号

c7038c7f59f5ffb4c06dae95e5dd80c5.png
-- 查询每门课程的及格人数和不及格人数
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 课程号;

e986ab07f24597a21201b6eed038a5e1.png
-- 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数、课程号、和课程名称
SELECT a.课程号,b.课程名称,SUM(CASE WHEN a.成绩 BETWEEN 85 AND 100 THEN 1 ELSE 0 END)AS '[100-85]',
                           SUM(CASE WHEN a.成绩<85 and a.成绩>=70 THEN 1 ELSE 0 END)AS '[85-70]',
                           SUM(CASE WHEN a.成绩<70 and a.成绩>=60 THEN 1 ELSE 0 END)AS '[70-60]',
                           SUM(CASE WHEN a.成绩<60 THEN 1 ELSE 0 END)AS '[<60]'
from score as a RIGHT JOIN course as b 
on a.课程号 = b.课程号
GROUP BY a.课程号

1c90123ec9325679d99ebeae136ee0fa.png

五、SQLzoo练习题

fb703e9d7926d27a11f0eefdd9b63619.png

dbf8285e2f7772763b56362e3cc8ad6f.png

1c81e33148921facd5e00d5e55c4a92e.png

f1d6fa4454f2716eea0d2083e7bb6a31.png

edd7c5e95531f97c7b0c9b13c78845e6.png

0ac818bd31a361c44e9d0af7cef4de3a.png

8cf5a451ee28912bd39c4eb7ca344f90.png

e653535ffc53d5a2ff18b50023ae1c12.png

d1c68dfbcac7e108aeb347c0f3222960.png

d42a5361e12cef86ab7cbce875f99446.png

066f0cb89db4b302c441f29a86d0dd2a.png

a9909072cfa59f3202c25d7aaed3c55b.png

f7a898efcc07617f209fa7c8cc020c2f.png

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值