本文共 1673 字,大约阅读时间需要 5 分钟。
今天的问题如下:
【问题6. 查询"李"姓老师的数量】
这道题很简单,不涉及多表连接,只需从Teacher表中查询,李姓老师即t_name中第一个字是李的数据,我们使用like语句即可做到
代码:
select count(1) from Teacherwhere t_name like '李%';
【问题7. 查询学过"张三"老师授课的同学的信息】
代码:
select s.* from Student s join Score scon s.s_id = sc.s_idwhere sc.c_id in(select c_id from Teacher t , Course cwhere t.t_id = c.t_idand 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 scon s.s_id = sc.s_idwhere sc.c_id in(select c_id from Teacher t , Course cwhere t.t_id = c.t_idand t_name = '张三') );
【题目9. 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息】
这道题我的方法不是最简单的,但是我的代码改到第10题的代码只要加一个单词,所以看过这两道题的题目后,我觉得使用如下思路:
代码:
select * from Studentwhere s_id in(select s.s_idfrom Student s join Score scon s.s_id = sc.s_idwhere c_id = '01' )and s_id in(select s.s_idfrom Student s join Score scon s.s_id = sc.s_idwhere c_id = '02' ) ;
【题目10. 查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息】
这道题只需要把第9题第三步的where…in… and…in改为where…in… and…not in即可
代码:
select * from Studentwhere s_id in(select s.s_idfrom Student s join Score scon s.s_id = sc.s_idwhere c_id = '01' )and s_id not in(select s.s_idfrom Student s join Score scon s.s_id = sc.s_idwhere c_id = '02' ) ;
以上,欢迎指正
转载地址:http://skcpo.baihongyu.com/