case oracel 子查询_SQL查询总结

一、简单查询

721d1774857d37c83a60b62176c9efad.png
查询姓孟的教师人数

二、汇总分析

5b76916b6050d075dce67807ee3ce886.png
查询课程编号为“0002”的总成绩

7a4dea33b8fe8cc037355e067253ac27.png
查询选了课程的人数

18791d91d6ca5b7b5cb89578c3a9f0d7.png
查询各科成绩最高和最低的分

c1ef5ba8b9f0f60f73cd1c199602ebff.png
查询每门课程被选修的学生数

453f3eadf41ce0dfe8a694a62ef69678.png
查询平均成绩大于60分学生的学号和平均成绩

7d1a437a33df083daae6b11a788d06d6.png
查询至少选修两门课程的学生学号

51a07fb672a5e14b7fe4a2eb57974867.png
查询同名同姓学生名单并统计同名人数

e03a4025907089e201f617c8718ec65a.png
查询不及格的课程并按课程号从大到小排列

b1fe1a151116053d1029e26f539af538.png
查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列

5d0ba0feea67fde289056f59a91c06e9.png
检索课程编号为“0004”且分数小于60的学生学号,结果按按分数降序排列

f168f6bfcaa9f77dbfd7dfa0884701f0.png

b0e15af6b20675314f074818a193d13f.png
统计每门课程的学生选修人数(超过2人的课程才统计)

1a4ccc2f97343ec7304efc6a9311453f.png
查询两门以上不及格课程的同学的学号,以及不及格课程及的平均成绩

三、复杂查询

0e85009d4d344100f8239bc7b4f6c7a2.png
查询所有课程成绩小于60分学生的学号、姓名

93b15267affd6cdb8d4eb83d41cbb527.png
查询没有学全所有课的学生的学号、姓名

c5aeab69c006f58adf21a78e81a8eef0.png
查询出只选修了两门课程的全部学生的学号和姓名

4f32bf49bd10a0459f5ffc2cb3f47441.png

a43159101a8183270522a4540dd3a7b2.png
1990年出生的学生名单

关联子查询解决topN问题

39bb2ec902db7aa5f4e736638a9222bd.png
按课程号分组取成绩最小值所在行的数据

98a236a5d3abdee45b2cb402aec41a42.png

但这里显然出现了一个错误:课程0003的最低成绩应该是80才对,为什么结果是100呢?
在接单查询一章我们讲过,由于当发现“大的数据”反而排在“小的数据”的前面,这时就要注意该列数据的类型是以字符串形式存储的。观察成绩列存储的数据类型:

c4aa806e14a85ba79bb0f88c98c9bcad.png
成绩列以定长字符串存储,改为float类型

069ccc3bf22a518636559c888380cb9c.png
结果正确

四、多表查询

e9d3e17c8b40e926a0cf2344472ec41d.png
查询不是近视眼的学生(多表联结)

bab8b9405e799d5cc42b4ef8eb360999.png
查询不是近视眼的学生(子查询)

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

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

6071ef1be96e5bda3cef164aa25ae31a.png
查询学生的选课情况:学号,姓名,课程号,课程名称

db310bd26ea51ceafd065a29731ade9a.png
查询出每门课程的及格人数和不及格人数(case表达式)

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

e8024a0fdfca07b7972a86390e2eac6b.png
查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名(多表联结)

14cedf779e7e8b45c85c945aa0cc7d2d.png
查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名(子查询)

行列互换问题,将表1变成表2

5aa0f061d3179a82a553e7b760b207bc.png
表1

9d226e9d06c46dd456c7a0e21fb25a90.png
表2

步骤1:使用常量列输出目标表的结构

select 学号,'课程号0001','课程号0002','课程号0003'
from score;

de6857b14d3f1949f6092ba65ea0e4ef.png

步骤2:使用case表达式,替换常量列为对应的成绩

select 学号,
(case 课程号 when '0001' then 成绩 else 0 end) as '课程号0001',
(case 课程号 when '0002' then 成绩 else 0 end) as  '课程号0002',
(case 课程号 when '0003' then 成绩 else 0 end) as '课程号0003'
from score;

34795dc39bc9447cf8be82608b79af28.png

步骤3:分组,并使用最大值函数max取出上图每个方块里的最大值

select 学号,
max(case 课程号 when '0001' then 成绩 else 0 end) as '课程号0001',
max(case 课程号 when '0002' then 成绩 else 0 end) as '课程号0002',
max(case 课程号 when '0003' then 成绩 else 0 end) as '课程号0003'
from score
group by 学号;

9635373ed58d50fc77bcf9dfceda2dbf.png
将表进行行列互换

五、如何提高SQL查询的效率?

1. select子句中尽量避免使用* (增加运行时间,多表联结中造成更大成本开销)

2. where子句比较符号左侧避免函数 (全表扫描,增加运行时间)

3. 尽量避免使用in和not in (全表扫描,增加运行时间)

4. 尽量避免使用or (union代替)(全表扫描,增加运行时间)

5.使用limit子句限制返回的数据行数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值