- 多层嵌套子查询
用的三张表teacher、course、score,首先找到教师编号:
SELECT NO FROM teacher WHERE NAME = '张旭'通过sourse表找到该教师课程号:select no from coursewhere t_no = (SELECT NO FROM teacher WHERE NAME = '张旭')通过筛选出的课程号查询成绩表:select * from score where c_no = (select no from course where t_no = (select no from teacherwhere name = '张旭'));- 多表查询
首先在teacher表中,根据no字段来判断该教师的同一门课程是否有至少5名学员选修:
-- 查询 teacher 表SELECT no, name FROM teacher;+-----+--------+| no | name |+-----+--------+| 804 | 李诚 || 825 | 王萍 || 831 | 刘冰 || 856 | 张旭 |+-----+--------+SELECT name FROM teacher WHERE no IN (-- 在这里找到对应的条件);查看和教师编号有有关的表的信息:SELECT * FROM course;-- t_no: 教师编号+-------+-----------------+------+| no | name | t_no |+-------+-----------------+------+| 3-105 | 计算机导论 | 825 || 3-245 | 操作系统 | 804 || 6-166 | 数字电路 | 856 || 9-888 | 高等数学 | 831 |+-------+-----------------+------+我们已经找到和教师编号有关的字段就在course表中,但是还无法知道哪门课程至少有5名学生选修,所以还需要根据score表来查询:-- 在此之前向 score 插入一些数据,以便丰富查询条件 。INSERT INTO score VALUES ('101', '3-105', '90');INSERT INTO score VALUES ('102', '3-105', '91');INSERT INTO score VALUES ('104', '3-105', '89');-- 查询 score 表SELECT * FROM score;+------+-------+--------+| s_no | c_no | degree |+------+-------+--------+| 101 | 3-105 | 90 || 102 | 3-105 | 91 || 103 | 3-105 | 92 || 103 | 3-245 | 86 || 103 | 6-166 | 85 || 104 | 3-105 | 89 || 105 | 3-105 | 88 || 105 | 3-245 | 75 || 105 | 6-166 | 79 || 109 | 3-105 | 76 || 109 | 3-245 | 68 || 109 | 6-166 | 81 |+------+-------+--------+-- 在 score 表中将 c_no 作为分组,并且限制 c_no 持有至少 5 条数据 。SELECT c_no FROM score GROUP BY c_no HAVING COUNT(*) > 5;+-------+| c_no |+-------+| 3-105 |+-------+根据筛选出来的课程号,找出在某课程中,拥有至少5名学员的教师编号:SELECT t_no FROM course WHERE no IN (SELECT c_no FROM score GROUP BY c_no HAVING COUNT(*) > 5);+------+| t_no |+------+| 825 |+------+在teacher表中,根据筛选出来的教师编号找到教师姓名:SELECT name FROM teacher WHERE no IN (-- 最终条件SELECT t_no FROM course WHERE no IN (SELECT c_no FROM score GROUP BY c_no HAVING COUNT(*) > 5));- 子查询 - 3
思路是,先找出teacher表中所有计算机系课程的编号,根据这个编号查询course表中的课程编号,再用课程编号查找score表
-- 通过 teacher 表查询所有 `计算机系` 的教师编号SELECT no, name, department FROM teacher WHERE department = '计算机系'+-----+--------+--------------+| no | name | department |+-----+--------+--------------+| 804 | 李诚 | 计算机系 || 825 | 王萍 | 计算机系 |+-----+--------+--------------+-- 通过 course 表查询该教师的课程编号SELECT no FROM course WHERE t_no IN (SELECT no FROM teacher WHERE department = '计算机系');+-------+| no |+-------+| 3-245 || 3-105 |+-------+-- 根据筛选出来的课程号查询成绩表SELECT * FROM score WHERE c_no IN (SELECT no FROM course WHERE t_no IN (SELECT no FROM teacher WHERE department = '计算机系'));+------+-------+--------+| s_no | c_no | degree |+------+-------+--------+| 103 | 3-245 | 86 || 105 | 3-245 | 75 || 109 | 3-245 | 68 || 101 | 3-105 | 90 || 102 | 3-105 | 91 || 103 | 3-105 | 92 || 104 | 3-105 | 89 || 105 | 3-105 | 88 || 109 | 3-105 | 76 |+------+-------+--------+- UNION 和 NOT IN 的使用
+-----+------+-----+------------+------------+------------+| no | name | sex | birthday | profession | department |+-----+------+-----+------------+------------+------------+| 804 | 李诚 | 男 | 1958-12-02 | 副教授 | 计算机系 || 825 | 王萍 | 女 | 1972-05-05 | 助教 | 计算机系 || 831 | 刘冰 | 女 | 1977-08-14 | 助教 | 电子工程系 || 856 | 张旭 | 男 | 1969-03-12 | 讲师 | 电子工程系 |+-----+------+-----+------------+------------+------------+-- NOT: 代表逻辑非SELECT * FROM teacher WHERE department = '计算机系' AND profession NOT IN (SELECT profession FROM teacher WHERE department = '电子工程系')-- 合并两个集UNIONSELECT * FROM teacher WHERE department = '电子工程系' AND profession NOT IN (SELECT profession FROM teacher WHERE department = '计算机系');
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 淘宝店铺修改名字怎么改 淘宝店名能不能改
- 算法干货 | 朴素贝叶斯分类
- 用这5种写作变现方式,实现业余收入2000元:每一个字都赚钱
- 开淘宝店名字怎么起 淘宝开店怎么起名字起名
- 素食者十字口诀 让你不再担心营养不够
- 茶令之由来,茶叶茶字的由来和历史演变的介绍
- 店铺名字可以改吗 淘宝开店店名可以更改吗
- 开网店怎样取名字 网上取名开店什么名字最好
- 网上取名开店什么名字最好 根据什么起店铺名
- 一款强大的本地文件内容搜索软件,可搜索文件中的文字
