查询【学过 001 号同学所有课程】的学生
3 种高性能写法专门解决查询【学过 001 号同学所有课程】的学生比双层 NOT EXISTS 更高效、更现代、大厂常用 写法 1GROUP BY HAVING最高性能、最简洁这是大数据量下最快的写法面试 / 工作首选。sqlSELECT s.s_no, s.sname FROM Student s JOIN Sc sc ON s.s_no sc.s_no -- 只查001选过的课程 WHERE sc.c_no IN (SELECT c_no FROM Sc WHERE s_no 001) AND s.s_no 001 GROUP BY s.s_no, s.sname -- 关键选的课程数 001选的总课程数 HAVING COUNT(DISTINCT sc.c_no) ( SELECT COUNT(DISTINCT c_no) FROM Sc WHERE s_no 001 );原理超简单先把学生只限制在 001 选过的课程里统计每个学生选了几门数量 001 选的总课数→ 就是全选了 写法 2JOIN 分组匹配极高速适合超大数据量表性能碾压 NOT EXISTSsqlSELECT s.s_no, s.sname FROM Student s JOIN ( SELECT sc2.s_no FROM Sc sc1 JOIN Sc sc2 ON sc1.c_no sc2.c_no WHERE sc1.s_no 001 GROUP BY sc2.s_no HAVING COUNT(DISTINCT sc2.c_no) ( SELECT COUNT(DISTINCT c_no) FROM Sc WHERE s_no 001 ) ) t ON s.s_no t.s_no WHERE s.s_no 001; 写法 3WITH 子句现代 SQL可读性最强MySQL 8.0 / PostgreSQL / SQL Server 通用sqlWITH Course001 AS ( SELECT DISTINCT c_no FROM Sc WHERE s_no 001 ), TotalCourse AS ( SELECT COUNT(*) AS total FROM Course001 ) SELECT s.s_no, s.sname FROM Student s JOIN Sc sc ON s.s_no sc.s_no JOIN Course001 c ON sc.c_no c.c_no WHERE s.s_no 001 GROUP BY s.s_no, s.sname HAVING COUNT(DISTINCT sc.c_no) (SELECT total FROM TotalCourse); 三种写法性能对比直接告诉你用哪个表格写法性能适用场景推荐指数GROUP BY HAVING⭐⭐⭐⭐⭐所有场景首选最强JOIN 分组⭐⭐⭐⭐⭐千万级大数据极强WITH 子句⭐⭐⭐⭐现代 SQL、代码清晰优秀NOT EXISTS⭐⭐教学、小数据一般✅ 总结一句话查询 “选了全部 XX 课程”别用 NOT EXISTS用 GROUP BY HAVING 性能最高
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2590634.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!