我正在使用DISTINCT
关键字进行一些实验,并且一些特殊情况引起了我的注意。
首先,我注意到我可以在DISTINCT
加上一些括号,例如:
SELECT DISTINCT(NAME) FROM EMPLOYEE;
没问题,而
SELECT DISTINCT(NAME, SURNAME) FROM EMPLOYEE;
给了我一个错误。为什么呢?
允许像这样的操作的意义是什么?
SELECT DISTINCT(NAME), COUNT(SURNAME) FROM EMPLOYEE;
答案 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;
此查询实际显示重复项以及它们发生的频率。