今天的问题如下:
- 查询"李"姓老师的数量
- 查询学过"张三"老师授课的同学的信息
- 查询没学过"张三"老师授课的同学的信息
- 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
- 查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
【问题6. 查询"李"姓老师的数量】
这道题很简单,不涉及多表连接,只需从Teacher表中查询,李姓老师即t_name中第一个字是李的数据,我们使用like语句即可做到
代码:
select count(1) from Teacher
where t_name like '李%';
【问题7. 查询学过"张三"老师授课的同学的信息】
- 将张三老师上过的课的c_id查询出来,作为子查询,查询的方法可以用join,也可以使用我下面的方法
- student没有c_id字段,不能直接和子查询关联,所以需要先和score关联,这里使用join
- 设定筛选条件,及c_id属于子查询范围内的,这里我使用in
代码:
select s.*
from Student s join Score sc
on s.s_id = sc.s_id
where sc.c_id in
(select c_id from Teacher t , Course c
where t.t_id = c.t_id
and t_name = '张三');
【问题8. 查询没学过"张三"老师授课的同学的信息】
这道题有个思维上的陷阱,就是直接把上题的in改为not in,这样是不行的,因为一名学生可以选择多门课程,比如01同学选了张三的课也可能选了李四,使用not in一样会查询出来他,因此我们需要把范围扩大,即把学号不在上一题学号中的学生信息提取出来
代码:
select * from Student where s_id not in
(select s.s_id from Student s join Score sc
on s.s_id = sc.s_id
where sc.c_id in
(select c_id from Teacher t , Course c
where t.t_id = c.t_id
and t_name = '张三') );
【题目9. 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息】
这道题我的方法不是最简单的,但是我的代码改到第10题的代码只要加一个单词,所以看过这两道题的题目后,我觉得使用如下思路:
- 查询出上过01课的s_id(使用join),作为第一个子查询
- 查询出上过02课的s_id(使用join),作为第一个子查询
- 查询同时在两个子查询都出现的s_id,逻辑判断用and,判断语句用where…in…
代码:
select * from Student
where s_id in
(select s.s_id
from Student s join Score sc
on s.s_id = sc.s_id
where c_id = '01' )
and s_id in
(select s.s_id
from Student s join Score sc
on s.s_id = sc.s_id
where c_id = '02' ) ;
【题目10. 查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息】
这道题只需要把第9题第三步的where…in… and…in改为where…in… and…not in即可
代码:
select * from Student
where s_id in
(select s.s_id
from Student s join Score sc
on s.s_id = sc.s_id
where c_id = '01' )
and s_id not in
(select s.s_id
from Student s join Score sc
on s.s_id = sc.s_id
where c_id = '02' ) ;
以上,欢迎指正