重複排除
ユーザー側としては手違いや昔どの方法でアカウント登録したか忘れて、同じサービスに再度アカウント登録することで、同じユーザーが重複して登録されていることがあります、検索時に本来重複しているユーザーもデータ上は別のユーザーとして結果が抽出されます。
そんな時にDISTINCTを使って重複データを排除できます!
DISTINCT
データベースの中からユーザーの数を正確に抽出したい場合に、DISTINCTを使ってフィルタリングすることができます!
例)usersテーブルの中から重複しないユーザーデータを確認したい時
SELECT DISTINCT name
FROM users
ORDER BY name ASC;
カラムの文字列が大文字・小文字の違いだけでも別のユーザーとして判断して抽出されるので注意が必要です!
集計関数
集計関数とは、複数行のデータをまとめて計算し、要約してくれる関数で、以下のようなものがあります。
| 関数 | 役割 |
|---|---|
| COUNT() | 件数を数える |
| SUM() | 合計を出す |
| AVG() | 平均を求める |
| MIN() | 最小値を取得する |
| MAX() | 最大値を取得する |
今回は例としてCOUNTを使ったクエリを書いてみます。
COUNT
レコードの中身はともかく、単純にレコード数が知りたい時などはCOUNT()で確認できます!
例)usersテーブルに登録されているユーザー数のみ確認したい時
SELECT COUNT(*)
FROM users;
例)usersテーブルの中から重複しないユーザー数を確認したい時
SELECT COUNT(DISTINCT name)
FROM users;
引数に*を使えるのは COUNT だけで、SUM, AVG, MIN, MAX は必ずカラムを指定する必要があります。
GROUP BY句
GROUP BYをクエリの後半に追加することで、特定のカラムの中で同一レコードを一つのグループとし、グループごとの集計結果を出すこともできます。
例)クラス別のテストの平均点数を集計
SELECT class, AVG(score) AS avg_score
FROM tests
GROUP BY class
ORDER BY class;
↓
+-------+------------+
| class | avg_score |
+-------+------------+
| 1-A | 78.5 |
| 1-B | 68.8 |
| 1-C | 89 |
+-------+------------+
上記の例のように、GROUP BYでグルーピングするカラムを表示リストに含めるのがわかりやすくて一般的でしょう
HAVING句
GROUP BYの後に、HAVINGを用いることでグルーピングの集計結果にさらに条件をつけて絞り込みすることがきます!
例)全教科の平均点が75点以上のクラスのみを確認したい時
SELECT class, AVG(score) AS avg_score
FROM tests
GROUP BY class
HAVING avg_score >= 75;
↓
+-------+-----------+
| class | avg_score |
+-------+-----------+
| 1-A | 78.5 |
| 1-C | 89 |
+-------+-----------+
HAVING は、GROUP BY の後に使用する句で、GROUP BY を使用しないのであれば、WHERE で絞り込みをします