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;
→ 「部署+職種」の組み合わせがユニークになるように、重複が消えます。
つまり、同じ部署でも職種が違えば別の行として残ります。
ポイント
DISTINCTは SELECT句の直後 に書く。- 集計関数(例:
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;
👉 Employees → e
👉 Departments → d
と短く呼べるので、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(社員)
| EmployeeID | Name | DepartmentID | Salary |
|---|---|---|---|
| 1 | 田中 | 10 | 300000 |
| 2 | 鈴木 | 20 | 250000 |
| 3 | 佐藤 | 10 | 280000 |
| 4 | 山田 | 30 | 400000 |
| 5 | 伊藤 | 20 | 270000 |
Departments(部署)
| DepartmentID | DepartmentName |
|---|---|
| 10 | 営業 |
| 20 | 開発 |
| 30 | 総務 |
問題1
各社員の 年収 を求め、列名を「年収」として表示しなさい。
(ヒント:月給 Salary × 12)
問題2
社員の名前と所属部署名を表示しなさい。
なお、Employees は e、Departments は d という 別名 を用いなさい。
問題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:部署ごとの平均給与
