一、简单查询
二、汇总分析
三、复杂查询
关联子查询解决topN问题
但这里显然出现了一个错误:课程0003的最低成绩应该是80才对,为什么结果是100呢?
在接单查询一章我们讲过,由于当发现“大的数据”反而排在“小的数据”的前面,这时就要注意该列数据的类型是以字符串形式存储的。观察成绩列存储的数据类型:
四、多表查询
行列互换问题,将表1变成表2
步骤1:使用常量列输出目标表的结构
select 学号,'课程号0001','课程号0002','课程号0003'
from score;
步骤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;
步骤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 学号;
五、如何提高SQL查询的效率?
1. select子句中尽量避免使用* (增加运行时间,多表联结中造成更大成本开销)
2. where子句比较符号左侧避免函数 (全表扫描,增加运行时间)
3. 尽量避免使用in和not in (全表扫描,增加运行时间)
4. 尽量避免使用or (union代替)(全表扫描,增加运行时间)
5.使用limit子句限制返回的数据行数