PR

【SQL】SELECT DISTINCT(重複レコードの除外)を1分で解説

Database

SQLのSELECT文で用いられるDISTINCTの意味と使い方をわかりやすく1分で解説します。

参考 SQLとは?

DISTINCTはSELECTした結果から "重複するレコードを除外する" オプションです。

SELECT DISTINCT
図1:DISTINCTキーワード

このページではDISTINCTの構文ルールや利用方法の注意点を解説します。難しい内容ではないので1分ほどでマスターできます。

このページで学べる内容
  • DISTINCTの使い方:構文ルール
  • DISTINCTで複数のカラムを指定する場合
  • DISTINCTの注意点

プログラマー/システムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。

参考 SELECT文の基本

スポンサーリンク

SELECT:DISTINCTの構文ルール

-- 基本形
SELECT DISTINCT カラム名
FROM テーブル名;

-- 複数のカラムに適用
SELECT DISTINCT カラム名1, カラム名2
FROM テーブル名;
  1. 位置: DISTINCTキーワードは、SELECT文の直後に配置。
  2. 対象: DISTINCTは1つ以上のカラムに適用され、そのカラムの組み合わせに対してユニークなレコードを返します。
  3. 組み合わせ: 複数のカラムにDISTINCTを適用する場合、カラムの間にカンマ(,)を使用して区切る。

DISTINCTはSELECT句で指定するカラム名の前に記述します。

以下のテーブルから、"Department" 列を重複を除外したい場合のサンプルコードがこちら。

SELECT DISTINCT Department 
  FROM MemberList;

"Department" 列の重複が削除され、以下の結果が得られます。

画像に alt 属性が指定されていません。ファイル名: image-14.png
DISTINCTの実行結果

もし、DISTINCTを用いずに単純にSELECTした場合は以下の結果が得られます。

SELECT Department 
  FROM MemberList;

NULLも1種類としてカウント

DISTINCTを用いた場合はNULL値も1種類のデータとしてカウントされます。

例えば、どこにも所属していない社員がいるような場合。

DISTINCT null
図2:DISTINCT null

この場合、DISTINCTを用いるとNULLも消えずに選択されます。

SELECT DISTINCT Department 
  FROM MemberList;
DISTINCT:NULLが含まれる場合の実行結果

NULLを出力したくない場合は、WHERE句でNULLを除外するように指定しましょう。

DISTINCTで複数のカラムを指定する場合

DISTINCTは以下のように複数のカラムを指定することも可能です。

SELECT DISTINCT Name, Department 
  FROM MemberList;

複数のカラムを指定する場合は、指定したカラムの組み合わせがすべて一意に決まるように重複が除かれます。

以上のように、Name列が "山田" かつDepartment列が "営業部" のように、組み合わせの結果が重複しているものが削除されるという点を押さえておきましょう。

初心者にとっては少しだけ難しいかもしれませんが、これだけ覚えればDISTINCTは完璧です。

DISTINCT は先頭のカラムの前にしか置けない

DISTINCTは先頭のカラムの前にしか記述することができません。

例えば、これはNG例。

SELECT Number, DISTINCT Department 
  FROM MemberList;

Department列の重複だけを削除したいと考えるとこのような使い方をしがちですが、これはSQLの構文ルール違反です。よくあるミスの1つです。

DISTINCTキーワードの注意点

DISTINCTキーワードを使用する際の注意点について、サンプルコードを用いながらご説明します。

注意点1 パフォーマンス

  • DISTINCTは重複するレコードを除外するため、内部的にはソートやグルーピングが行われることがあります。そのため、大量のデータが存在するテーブルに対して使用するとパフォーマンスが低下する可能性があります。
  • インデックスの有無や設計もパフォーマンスに影響します。

注意点2 結果の順序

  • DISTINCTの後に続くカラムの順序は結果の表示順に影響しますが、ユニーク性の評価には影響しません。
-- 例1
SELECT DISTINCT column1, column2
FROM some_table;

-- 例2
SELECT DISTINCT column2, column1
FROM some_table;

-- 上記2つのSQLはユニークなレコードのセットは同じになりますが、結果の表示順は異なる可能性があります。
SELECT DISTINCTのまとめ
  • DISTINCTはSELECTした結果から "重複するレコードを除外する" オプション
-- 基本形
SELECT DISTINCT カラム名
FROM テーブル名;

-- 複数のカラムに適用
SELECT DISTINCT カラム名1, カラム名2
FROM テーブル名;

サンプルコード

-- テーブルの作成
CREATE TABLE employees (
    id INT PRIMARY KEY,
    first_name VARCHAR(255),
    last_name VARCHAR(255),
    job_title VARCHAR(255)
);

-- レコードの挿入
INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (1, 'John', 'Doe', 'Software Engineer');

INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (2, 'Jane', 'Smith', 'Software Engineer');

INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (3, 'Bob', 'Johnson', 'Project Manager');

INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (4, 'Alice', 'Martin', 'Data Analyst');

INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (5, 'Charlie', 'Brown', 'Data Analyst');

-- SELECT DISTINCT
SELECT DISTINCT job_title
FROM employees;

/* 結果
job_title
------------------
Software Engineer
Project Manager
Data Analyst

重複するjob_titleが取り除かれ一意のjob_titleのみが表示される
*/

参考 CREATE TABLE / INSERT

現在のスキルに今一つ満足できていないシステムエンジニア/プログラマーの方へ。

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。是非この機会にブックマークを!

読者料典 【完全無料】SQL:初心者向け学習ロードマップ ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DatabaseIT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました