当我们在学校学生信息库里查询小明的信息时,通过如下语句:
SELECT * FROM Student WHERE name='小明';
执行完,发现好多个小明。
此时我脑筋一转,想看看学校里有多少同学姓名是重名的,那我们可以通过聚合函数GROUP BY来查询,于是写下如下语句:
SELECT name,COUNT(name) as c FROM Student GROUP BY name;
执行完,你会发现上面的语句会把姓名唯一的也查出来了。也就是c为1的也查询出来了。
聪明如我,那就要加c>1的条件呗。于是你会发现,如果用WHERE关键字去查,都不知道WHERE究竟是放在Student后面,还是放在GROUP BY后面。其实无论放哪里,它们从思维逻辑上来讲都是错误的(这个说来话长)。
那怎么办呢?这时SQL就引入了HAVING关键字来代替WHERE关键字。也就是说,一旦遇到聚合函数(这里的GROUP BY),要在条件结果集里来筛选结果,就用HAVING来代替WHERE。
上面的语句就应该这样:
SELECT name,COUNT(name) as c FROM Student GROUP BY name HAVING c > 1;
此时就查出了所有的重名学生。