数据分析sql面试必会6题经典_SQL面试经典50题(二)——6-10题解析

5e63baf2ed1eecf1f989025110f0d510.png

今天的问题如下:

  • 查询"李"姓老师的数量
  • 查询学过"张三"老师授课的同学的信息
  • 查询没学过"张三"老师授课的同学的信息
  • 查询学过编号为"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' ) ;

以上,欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值