1、删除重复值(关键词DISTINCT)
SELECT COUNT(DISTINCT <列名>)
FROM <表名>;
这时DISTINCT必须写在括号内。使得在计算行数之前删除某列中的重复数据。
所有的聚合函数都可以使用DISTINCT。
2、GROUP BY子句
SELECT <列名>, COUNT(*)
FROM <表名>
GROUP BY <列名>;
执行结果为多行,因为GROUP BY 子句时,会将表中的数据分为多个组进行处理。
在GROUP BY 子句中指定的列称为聚合键或者分组列。由于能够决定表的切分方式,所以是非常重要的列。
GROUP BY子句的书写位置有严格要求,一定要写在FROM语句之后(如果有WHERE子句的话就写在WHERE子句之后)。如果无视子句的书写顺序,SQL就一定会无法正常执行。
(子句的书写顺序:1.SELECT→2.FROM→3.WHERE→4.GROUP BY)
(1)聚合键含有NULL
此时,结果会以“不确定”行(空行)的形式表现出来。
(2)使用WHERE子句时
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
WHERE
GROUP BY <列名1>, <列名2>, <列名3>, ……
像这样使用WHERE子句进行聚合处理时,会先根据WHERE子句指定的条件进行过滤,然后再进行聚合处理。
(3)与聚合函数和GROUP BY子句有关的常见错误
①在SELECT中书写了多余的列
使用聚合函数时,SELECT子句中只能存在以下三种元素:常数、聚合函数、GROUP BY子句中指定的列名(即聚合键)。
②在GROUP BY 子句中写了列的别名
在SELECT子句中的项目可以通过AS关键字来指定别名,但是在GROUP BY子句中是不能使用别名。这是由于SQL语句在 DBMS内部的执行顺序造成的——SELECT子句在GROUP BY子句之后执行!
③将GROUP BY子句的结果排序
GROUP BY子句的结果是随机排序的。当你再次执行同样的SELECT语句时,得到的结果的顺序可能会按照完全不同的顺序进行排列。【通常SELECT语句执行结果的显示顺序都是随机的。因此想要按照某种特定顺序进行排序的话,需要在SELECT语句中进行指定。】
④在WHERE子句中使用聚合函数
实际上,只有SELECT子句、HAVING子句和ORDER BY子句中能够使用COUNT等聚合函数。
【WHERE子句只能指定记录(行)的条件,而不能用来指定组的条件。】
3、HAVING子句
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……
HAVING <分组结果对应的条件>;
HAVING子句必须写在GROUP BY 子句之后。
(1)构成要素
HAVING子句和包含GROUP BY子句时的SELECT子句中一样,能够使用的要素有一定的限制(限制内容想同)。HAVING子句中能够使用的3种要素:常数、聚合函数、GROUP BY子句中指定的列名(即聚合键)。
(2)HAVING 子句与WHERE子句的选择条件
【既可以写在HAVING子句当中,又可以写在WHERE子句当中的条件称为聚合键所对应的条件。】
聚合键所对应的条件应该书写在WHERE子句中。理由:
① 子句的作用不同。
HAVING子句是用来指定“组”的条件,“行”对应 的条件还是应该写在WHERE子句中。这样可以使得SELECT语句分清两者各自的功能,容易理解。
②执行速度。
通常情况下,为了得到相同的结果,将条件写在WHERE子句子句中要比写在WHERE子句中的处理速度更快,返回结果所需时间更短。