Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLの「含まない」を指定する方法についてまとめています。

SQLの含まない指定は、NOT IN

「含まない」条件しては、NOT INを使います。以下の例は、部署テーブル(departments)から、部署名に「Sales」と「Development」を含まない部署を取得する例です。

SELECT * 
FROM   `departments` 
WHERE  dept_name NOT IN ( 'Sales', 'Development' );

+---------+--------------------+
| dept_no | dept_name          |
+---------+--------------------+
| d009    | Customer Service   |
| d002    | Finance            |
| d003    | Human Resources    |
| d001    | Marketing          |
| d004    | Production         |
| d006    | Quality Management |
| d008    | Research           |
+---------+--------------------+
7 rows in set (0.05 sec)

除外対象が多い・条件が複雑な場合は、NOT INとサブクエリが有効

条件を単純な直値で指定できない場合、サブクエリを組み合わせることで、複雑な「含まない」指定が可能です。

以下のサンプルは、人数50,000人以上の部署を除外して表示するSQLです。サブクエリ部分では、人数50,000人以上の部署名を取得しています。

SELECT *
FROM   departments 
WHERE  dept_name NOT IN (SELECT dept_name 
                         FROM   departments 
                                INNER JOIN dept_emp 
                                        ON dept_emp.dept_no = 
                                           departments.dept_no 
                         GROUP  BY dept_name 
                         HAVING Count(emp_no) > 50000);
+---------+--------------------+
| dept_no | dept_name          |
+---------+--------------------+
| d009    | Customer Service   |
| d002    | Finance            |
| d003    | Human Resources    |
| d001    | Marketing          |
| d006    | Quality Management |
| d008    | Research           |
+---------+--------------------+
6 rows in set (1.71 sec)

複数カラムの組み合わせに対して、含まない指定

複数のカラムに対して「含まない」条件を指定するには、以下のようにします。以下は、部署テーブル(departments)から、d002 Financeと、d001 Salesの部署を除外して部署名を取得するSQLです。

(‘d002′,’Finance’), (‘d001′,’Sales’) など、複数の値の組をカッコで閉じてカンマで区切る表現を「タプル」と呼びます。

SELECT * 
FROM   `departments` 
WHERE  ( dept_no, dept_name) NOT IN ( ('d002','Finance'), 
                                          ('d001','Sales') );
+---------+--------------------+
| dept_no | dept_name          |
+---------+--------------------+
| d009    | Customer Service   |
| d005    | Development        |
| d003    | Human Resources    |
| d001    | Marketing          |
| d004    | Production         |
| d006    | Quality Management |
| d008    | Research           |
| d007    | Sales              |
+---------+--------------------+
8 rows in set (0.00 sec)

NULLの扱いに注意

NOT INを使う上で、直感的にわかりにくいのがNULLの扱い。

部署名(dept_name)が「Sales、Development、NULL」以外のデータを取得する意図で、以下のSQLを実行しても、何も取得できません。

SELECT * 
FROM   `departments` 
WHERE  dept_name NOT IN ( 'Sales', 'Development', NULL );

Empty set (0.00 sec)

NULLに関する条件はタプルに加えるとうまく動かないんですね。

SELECT * 
FROM   `departments` 
WHERE  dept_name NOT IN ( 'Sales', 'Development' ) 
       AND dept_name IS NOT NULL;

+---------+--------------------+
| dept_no | dept_name          |
+---------+--------------------+
| d009    | Customer Service   |
| d002    | Finance            |
| d003    | Human Resources    |
| d001    | Marketing          |
| d004    | Production         |
| d006    | Quality Management |
| d008    | Research           |
+---------+--------------------+
7 rows in set (0.00 sec)

NULLを除外する場合は、上記のように条件をANDで接続して、IS NOT NULLを指定します。

まとめ

ポテパンダの一言メモ
  • 含まない条件の指定はNOT INを使う
  • 複雑な除外条件がある場合は、NOT INをサブクエリを組み合わせる
  • NOT INとNULLの同時使用の場合は予期しない結果になるケースがある

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。