DISTINCT作为子句或函数

时间:2016-06-19 17:14:28

标签: mysql sql

我正在使用DISTINCT关键字进行一些实验,并且一些特殊情况引起了我的注意。

首先,我注意到我可以在DISTINCT加上一些括号,例如:

SELECT DISTINCT(NAME) FROM EMPLOYEE;

没问题,而

SELECT DISTINCT(NAME, SURNAME) FROM EMPLOYEE;

给了我一个错误。为什么呢?

允许像这样的操作的意义是什么?

 SELECT DISTINCT(NAME), COUNT(SURNAME) FROM EMPLOYEE;

2 个答案:

答案 0 :(得分:2)

DISTINCT(或DISTINCTROW)不是函数;它是SELECT语句的一个选项,它告诉MySQL从查询生成的结果集中删除重复的行。默认情况下,它返回所有生成的行,包括重复的行。

它也可以与COUNT()聚合函数(作为COUNT(DISTINCT expr))一起使用,它具有相同的含义:它忽略了重复项。

由于DISTINCT不是函数,DISTINCT(NAME)被解释为DISTINCT,后跟表达式(NAME)(与NAME相同)。< / p>

SELECT DISTINCT(NAME, SURNAME) FROM EMPLOYEE不起作用,因为(NAME, SURNAME)不是有效的MySQL表达式。

答案 1 :(得分:1)

DISTINCT并不是真的 - 更像是一个修饰语。它用于两个地方。它可以修改聚合函数。唯一值得使用的是COUNT(DISTINCT)

在您的情况下,您将其用作SELECT的修饰符。它只是说每个整个行应该是不同的。

所以,当你说:

 SELECT DISTINCT (name, surname)

这与从此查询中获取(name, surname)的所有不同行相同:

SELECT (name, surname)

MySQL无法识别此语法。在某些数据库中,这表示元组或行构造函数。但是,由于MySQL无法识别此语法,因此您收到错误。

作为注释:SELECT DISTINCT可能非常强大,但通常没有必要。更典型的是,您可以使用您真正想要“不同”的列进行GROUP BY。例如:

SELECT name, surname, COUNT(*)
FROM t
GROUP BY name, surname
ORDER BY COUNT(*) DESC;

此查询实际显示重复项以及它们发生的频率。