在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就是错误的。所以,第一个虽然麻烦,但还是更靠谱一些。不过按照正常逻辑来说,当问了你张三老师学生数量以后,也应该很少有面试官会闲着再问查另一个吧。