2016-06-19 3 views
0

私はDISTINCTキーワードでいくつかの実験を行いましたが、いくつかの特定の状況が私の注意を引いた。節または関数としてのDISTICNC

まず第一に、私は例えば、DISTINCTでいくつかの括弧を置くことができることに気づい:

SELECT DISTINCT(NAME, SURNAME) FROM EMPLOYEE; 

は私にエラーを与えながら

SELECT DISTINCT(NAME) FROM EMPLOYEE; 

は、okです。どうして?

このような操作を許可する感覚は何ですか?

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

「このような操作を許可する感覚は何ですか?」何もない。標準SQLは 'DISPLNCT'の有無にかかわらず' SELECT NAME、COUNT(SURNAME)FROM EMPLOYEE; 'を許可しません。 –

+1

'(NAME) 'は' NAME'と等しくなります。余分なカッコを追加した列名です。 '(a = 1 or b = 2)、c = 3'のように)読みやすさや演算子の優先順位のために式のまわりの括弧を使うことができるので、これは許されています。 'NAME、SURNAME'は式ではないので、そのまわりの括弧を使うと構文エラーになります。 –

+1

「名前を選択(名前)、人数から(名前)」を選択するのは本当に意味がありません。 ONLY_FULL_GROUP_BYモードではないので、DBMSにあなたが何をしているかを完全に知っていると伝えますが、あなたはそうではないようです:-)クエリは、あなたから任意に選択された名前を含む1つの結果行を与えますテーブルにテーブル内のnull以外の姓の数を加えたものです。次に、その1行に 'DISTINCT'を適用します: - |行の集約をマスターするまで、DBMSをONLY_FULL_GROUP_BYモードに設定することをお勧めします。 –

答えて

2

DISTINCT(またはDISTINCTROW)は関数ではありません。 SELECTステートメントのオプションで、クエリによって生成された結果セットから重複行を削除するようにMySQLに指示します。デフォルトでは、生成されたすべての行(重複を含む)が返されます。

COUNT()集約関数(COUNT(DISTINCT expr))と一緒に使用することもできます。同じ意味です。重複は無視されます。

DISTINCTが関数ではないので、DISTINCT(NAME)は(NAMEと同じである)式(NAME)続いDISTINCTと解釈されます。

SELECT DISTINCT(NAME, SURNAME) FROM EMPLOYEE(NAME, SURNAME)は有効なMySQL式ではないため、機能しません。

1

DISTINCTは何も変更されていません。それは2か所で使用されています。修飾子集約関数を使用できます。使用する価値のあるものは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; 

このクエリは実際に重複が発生する頻度と発生頻度を示します。

関連する問題