MySQL面试2:一张学生表,一张教师表,里面都有Name和Code,写出张三的老师有多少名学生的SQL语句。

        在Mysql面试的写SQL语句环节中,有人曾碰到了这样一道这样的一道SQL语句题。目前有两张数据表,一张学生,一张老师表。里面都有Name和Code两个字段。求出张三的老师一共有多少名学生。

这样,我们还是先建两张普通的数据表。

两张普通的数据库表就建好了。接着我们再写SQL语句:

select
        t.id as 编号,
        t.name as 教师,
        count(s.code) as 学生数
from    
        teacher t join student s
on    
        t.code=s.code                #先查出总学生数
where
        t.name=(
select 
        t.name 
from    
        student s join teacher t
on
        s.code=t.code
where
        s.name='张三'                #再用子查询查询出张三的老师

        )                            #最终就是查出张三老师的学生数量

看下SQL语句的输出结果:

这样我们就得出张三的老师是李老师,学生数量是3个。 

另外,还有一种SQL语句也是可以求出张三的老师有多少名学生,代码如下:

select 
       s.Id as 编号,
       s.name as 学生姓名,
       t.name as 教师,
       count(s.code) as 人数
from 
       student s join teacher t
on     
       s.code=t.code   #先进行两张表表连接查出学生姓名,老师和总人数    
group by
       t.name          #然后根据老师的姓名进行分组查询出每个老师的学生人数
having
       s.name='张三'   #用having函数找出张三的老师并进行查询人数
        

代码输出结果为:

         注意:这个SQL语句虽然把张三老师的学生人数查了出来,而且看上去也比上面的简单些,但是这个SQL语句存在着纰漏。例如:把having后面s.name的值改为‘小红’,那么它的输出结果就会变成这个空值如下:

        所以,综合来看,还是第一种比较更完善一些。当然如果在只会问到你张三老师的学生数,两种都是可以的。但是如果话锋一转,那么这个SQL就是错误的。所以,第一个虽然麻烦,但还是更靠谱一些。不过按照正常逻辑来说,当问了你张三老师学生数量以后,也应该很少有面试官会闲着再问查另一个吧。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值