SELECT ステートメントを使用して MySQL で単純なデータ クエリを実行すると、一致するすべてのレコードが返されます。テーブル内の一部のフィールドに一意の制約がない場合、これらのフィールドには重複する値が含まれる可能性があります。
重複しないデータのクエリを実現するために、MySQL は DISTINCT キーワードを提供します。
DISTINCT キーワードの主な機能は、データ テーブル内の 1 つ以上のフィールドの繰り返しデータをフィルター処理し、1 つのデータのみをユーザーに返すことです。
DISTINCT キーワードの構文は次のとおりです。
SELECT DISTINCT <字段名> FROM <表名>;
このうち、「フィールド名」は重複レコードを排除する必要があるフィールドの名前で、複数のフィールドはコンマで区切ります。
DISTINCT キーワードを使用する場合は、次の点に注意してください。
- DISTINCT キーワードは、SELECT ステートメントでのみ使用できます。
- 1 つ以上のフィールドを重複排除する場合、DISTINCT キーワードはすべてのフィールドの先頭にある必要があります。
- DISTINCT キーワードの後に複数のフィールドがある場合、複数のフィールドが組み合わせて重複排除されます。つまり、複数のフィールドの組み合わせがまったく同じ場合にのみ重複排除されます。
例 1
以下では、特定の例を使用して、重複データなしでクエリを実装する方法を示します。
test データベースの student テーブルのテーブル構造とデータは次のとおりです。
mysql> SELECT * FROM test.student;
+----+----------+------+-------+
| id | name | age | stuno |
+----+----------+------+-------+
| 1 | zhangsan | 18 | 23 |
| 2 | lisi | 19 | 24 |
| 3 | wangwu | 18 | 25 |
| 4 | zhaoliu | 18 | 26 |
| 5 | zhangsan | 18 | 27 |
| 6 | wangwu | 20 | 28 |
+----+----------+------+-------+
6 rows in set (0.00 sec)
結果は、student テーブルに 6 つのレコードがあることを示しています。
次に、student テーブルの age フィールドが重複排除され、SQL ステートメントと実行結果は次のようになります。
mysql> SELECT DISTINCT age FROM student;
+------+
| age |
+------+
| 18 |
| 19 |
| 20 |
+------+
3 rows in set (0.00 sec)
Student テーブルの name および age フィールドを重複排除するための SQL ステートメントと実行結果は次のとおりです。
mysql> SELECT DISTINCT name,age FROM student;
+----------+------+
| name | age |
+----------+------+
| zhangsan | 18 |
| lisi | 19 |
| wangwu | 18 |
| zhaoliu | 18 |
| wangwu | 20 |
+----------+------+
5 rows in set (0.00 sec)
学生テーブルのすべてのフィールドを重複排除するための SQL ステートメントと実行結果は次のとおりです。
mysql> SELECT DISTINCT * FROM student;
+----+----------+------+-------+
| id | name | age | stuno |
+----+----------+------+-------+
| 1 | zhangsan | 18 | 23 |
| 2 | lisi | 19 | 24 |
| 3 | wangwu | 18 | 25 |
| 4 | zhaoliu | 18 | 26 |
| 5 | zhangsan | 18 | 27 |
| 6 | wangwu | 20 | 28 |
+----+----------+------+-------+
6 rows in set (0.00 sec)
DISTINCT はそのターゲット フィールドのみを返すことができ、他のフィールドは返せないため、実際には DISTINCT キーワードを使用して一意のフィールドの数を返すことがよくあります。
name フィールドと age フィールドが重複排除された後、student テーブル内のレコード数をクエリします。SQL ステートメントと実行結果は次のとおりです。
mysql> SELECT COUNT(DISTINCT name,age) FROM student;
+--------------------------+
| COUNT(DISTINCT name,age) |
+--------------------------+
| 5 |
+--------------------------+
1 row in set (0.01 sec)
結果は、name フィールドと age フィールドの重複除去後に、student テーブルに 5 つのレコードがあることを示しています。
ダーク ホース プログラマー MySQL データベース エントリから習熟まで、mysql のインストールから高度な mysql まで、mysql の最適化をすべて網羅