【Day37】DISTINCT はどう使う?

投稿者: | 2025年9月14日

DISTINCT は、SQLで 重複したデータを取り除き、ユニークな行だけを取得する ときに使います。

以下にまとめてみます。


基本構文

SELECT DISTINCT 列名
FROM テーブル名;

例1:重複を取り除く

社員テーブル(Employees)があり、部署(Department)列があるとします。

SELECT Department
FROM Employees;

→ このままだと、同じ部署名が何度も表示されます。

SELECT DISTINCT Department
FROM Employees;

→ 部署名が 1回ずつ 表示されます。


例2:複数列に適用

SELECT DISTINCT Department, JobTitle
FROM Employees;

→ 「部署+職種」の組み合わせがユニークになるように、重複が消えます。
つまり、同じ部署でも職種が違えば別の行として残ります。


ポイント

  • DISTINCTSELECT句の直後 に書く。
  • 集計関数(例:COUNT)と組み合わせると「ユニークな件数」を数えられる。
SELECT COUNT(DISTINCT Department)
FROM Employees;

→ 部署の種類数(ユニーク数)がわかる。


👉 よく「GROUP BYとの違い」が試験に出ますが、

GROUP BY = グループごとに集計をする という違いがあります。

DISTINCT = 単純に重複を消す


カンマで区切る呼び出し方の例

DISTINCT複数の列 をカンマで区切って指定することができます。


📌 基本例

社員テーブル Employees に次の列があるとします:

  • Department(部署)
  • JobTitle(職種)
SELECT DISTINCT Department, JobTitle
FROM Employees;

👉 この場合、

  • 部署だけでなく職種も組み合わせて 重複排除されます。
  • 例えば 営業部・主任 が3人いても、1行だけ残ります。

📌 応用例

SELECT DISTINCT Department, JobTitle, Location
FROM Employees;

👉 部署 + 職種 + 勤務地 の組み合わせがユニークになるように、行が整理されます。


📌 COUNTと組み合わせ

SELECT COUNT(DISTINCT Department, JobTitle)
FROM Employees;

👉 この書き方で「部署と職種の組み合わせの数」を求められるDBもありますが、
DBMSによってはサポートしていないことがあります。
その場合は以下のように サブクエリ を使います。

SELECT COUNT(*)
FROM (
  SELECT DISTINCT Department, JobTitle
  FROM Employees
) AS sub;

💡まとめると:

  • カンマで区切ると「その列の組み合わせ」で重複が消える。
  • GROUP BY と違って集計はせず、ユニークな行を抽出するだけ。

AS sub; の意味

SQL の AS sub は、サブクエリに「一時的な名前(別名、エイリアス)」をつけている部分です。


📌 サブクエリとは?

サブクエリは SELECT文の中に書かれるSELECT文 のこと。
SQLでは「テーブル」として扱う必要があるので、必ず名前を付けてあげなければいけません。


📌 例

SELECT COUNT(*)
FROM (
  SELECT DISTINCT Department, JobTitle
  FROM Employees
) AS sub;
  • SELECT DISTINCT Department, JobTitle FROM Employees
    → 部署と職種の組み合わせをユニークにした表が作られる。
  • それをカッコ () で囲むと「一時的なテーブル」扱いになる。
  • AS sub
    → その一時的なテーブルに「sub」という名前をつけた。

👉 つまり、sub はニックネーム(エイリアス)。


📌 別名がないとどうなる?

RDBMS(特にMySQLやPostgreSQL)では、

SELECT COUNT(*)
FROM (
  SELECT DISTINCT Department, JobTitle
  FROM Employees
);

と書くとエラーになります。
理由は「サブクエリに名前がないからテーブルとして扱えない」。

なので必ず

... ) AS sub;

のように 名前をつけるのがルール です。


📌 幼稚園児にもわかるたとえ 🏫

サブクエリは「おもちゃ箱の中に、もう一つの小さい箱を入れる」みたいなもの。
でもその小さい箱に名前がついていないと「どの箱を数えればいいの?」と先生が困っちゃう。
だから「この箱は sub だよ!」とラベルを貼ってあげる。
👉 これが AS sub です。


AS の応用(列の別名、ビューの名前など)

SQL の AS はサブクエリ以外にも 列やテーブルに「わかりやすい名前(別名)」をつける ときに広く使えます。


✅ SQLにおける AS の使い方まとめ

① 列に別名をつける

SELECT Department AS 部署名, JobTitle AS 職種
FROM Employees;

👉 出力結果の列名が「部署名」「職種」になる。

  • 長い名前を短くしたり
  • 英語を日本語にしたり
  • 計算式に名前をつけたり

に便利。


② 計算結果に名前をつける

SELECT Salary * 12 AS 年収
FROM Employees;

👉 Salary * 12 だけだと無名の列になってしまうので、年収 という名前をつける。


③ テーブルに別名をつける

SELECT e.Name, d.DepartmentName
FROM Employees AS e
JOIN Departments AS d
  ON e.DepartmentID = d.DepartmentID;

👉 Employeese
👉 Departmentsd
と短く呼べるので、JOINするときにすごく見やすくなる。


④ サブクエリに名前をつける(さっきの話)

SELECT COUNT(*)
FROM (
  SELECT DISTINCT Department, JobTitle
  FROM Employees
) AS sub;

👉 サブクエリは必ずエイリアスが必要。


⑤ ビューを作るとき

ビュー(仮想的な表)を作成するときも、内部で AS を使います。

CREATE VIEW 部署別人数 AS
SELECT Department, COUNT(*) AS 人数
FROM Employees
GROUP BY Department;

👉 これで 部署別人数 というビューを呼び出せる。


📌 まとめ

  • 列に名前をつける → 出力をわかりやすく
  • 計算結果に名前をつける → 無名の列を解消
  • テーブルに短い名前をつける → JOINが見やすくなる
  • サブクエリに名前をつける → SQLのルールで必須
  • ビューの定義でも使う

🎒 幼稚園のたとえ

  • 列の別名 → 子どものあだ名をつける(「たろうくん」→「サッカーのたろう」)
  • テーブルの別名 → クラスにニックネームをつける(「ひまわり組」→「H組」)
  • サブクエリの別名 → 小さい箱にラベルを貼る
    👉 どれも「呼びやすく、間違えないようにする工夫」!

SQL + AS の活用練習問題

✅ 練習問題(午後問題風)

次のテーブルがあります。

Employees(社員)

EmployeeIDNameDepartmentIDSalary
1田中10300000
2鈴木20250000
3佐藤10280000
4山田30400000
5伊藤20270000

Departments(部署)

DepartmentIDDepartmentName
10営業
20開発
30総務

問題1

各社員の 年収 を求め、列名を「年収」として表示しなさい。
(ヒント:月給 Salary × 12)


問題2

社員の名前と所属部署名を表示しなさい。
なお、EmployeeseDepartmentsd という 別名 を用いなさい。


問題3

部署ごとの平均給与を求め、出力列名を以下のようにせよ。

  • 部署名 → 「部署」
  • 平均給与 → 「平均給与」


✅ 解答例

問題1

SELECT Name, Salary * 12 AS 年収
FROM Employees;

問題2

SELECT e.Name, d.DepartmentName
FROM Employees AS e
JOIN Departments AS d
  ON e.DepartmentID = d.DepartmentID;

問題3

SELECT d.DepartmentName AS 部署,
       AVG(e.Salary) AS 平均給与
FROM Employees AS e
JOIN Departments AS d
  ON e.DepartmentID = d.DepartmentID
GROUP BY d.DepartmentName;

💡 ポイント:

  • AS列名にもテーブル名にも使える
  • 午後試験のSQL問題では「短くわかりやすい名前をつける」ことが必須
  • GROUP BY とセットで出ることが多い

社員テーブルを使った SQL 練習問題の出力結果をまとめてみた📊

  • 問題1:社員ごとの年収
  • 問題2:社員と部署名の一覧
  • 問題3:部署ごとの平均給与