SQL 高性能查询:学过 001 至少一门课的同学
最优、最高性能的写法,同时解释原理,保证在大数据量下也跑得飞快。
最终高性能 SQL(推荐)
sql
SELECT DISTINCT s.sno, s.sname FROM student s JOIN sc sc1 ON s.sno = sc1.sno -- 匹配 001 同学学过的所有课程 WHERE sc1.cno IN (SELECT cno FROM sc WHERE sno = '001') -- 排除自己 AND s.sno != '001';极致性能版(无 DISTINCT,效率更高)
sql
SELECT s.sno, s.sname FROM student s WHERE EXISTS ( SELECT 1 FROM sc sc1 JOIN sc sc2 ON sc1.cno = sc2.cno WHERE sc1.sno = s.sno AND sc2.sno = '001' AND s.sno != '001' );性能说明(为什么这是高性能写法)
1.EXISTS 是数据库最优方案
EXISTS只需要找到一条匹配就停止查询,不做全表扫描- 不产生重复数据,不需要 DISTINCT(去重非常耗性能)
- 数据库优化器对
EXISTS支持最好
2. 索引建议(必须加,性能爆炸提升)
给这两个字段加索引,百万数据也毫秒出结果:
sql
-- 选课表索引 CREATE INDEX idx_sc_sno_cno ON sc(sno, cno); -- 学生表索引 CREATE INDEX idx_student_sno ON student(sno);表结构说明(默认标准表)
student(sno, sname)学生表sc(sno, cno)选课表course(cno, cname)课程表(本查询不需要)
业务含义
查询结果 =除了 001 自己以外,所有学过 001 同学任意一门课程的学生。
总结
- 首选 EXISTS 版本:性能最高、无冗余、无去重开销
- 必须加索引:这是高性能的核心
- 逻辑简单、数据库执行成本最低
