SQL not in データの除外指定 NULLや複数カラムを扱う方法
  • facebookページ
  • twitterページ
  • 2019.09.05

    SQL not in データの除外指定 NULLや複数カラムを扱う方法

    データの除外条件に使える、not inについてまとめました。

    以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。SQL実行結果の表示にはphpMyAdminを使用しています。

    not inの使い方

    指定した固定値のリストを除外するには、以下のようにします。

    上記のSQLは、部署名(dept_name)が「Sales」「Development」以外を部署テーブル(departments)から取得します。

    実行結果はこうなります。

    SQL実行結果

    サブクエリとnot inの組み合わせサンプル

    固定値リストではなく、動的な除外リストにしたい場合は、サブクエリ(副問い合わせ)を組み合わせます。

    上記SQLは、人数50,000人以上の部署を除く部署名を取得するSQLです。

    少々複雑なので、サブクエリの部分のみ実行してみましょう。dept_empは部署名と社員情報の紐付けテーブルです。

    サブクエリ部分のみ実行すると以下の結果になります。

    SQL実行結果

    SQL全体を実行すると、以下の結果となります。

    SQLの実行結果

    社員数50,000人以上の部署「Development」「Production」「Sales」以外の部署名が取得できました。

    not inで「NULL以外」を指定したい場合は、IS NOT NULLを使う

    not inのリストにNULLを含めると、何も取得できなくなります。

    NULLを除外する場合は、以下のようにIS NOT NULLを指定します。

    not in でワイルドカードを使いたい場合は、not likeを使う

    not inではワイルドカードを扱うことができません。例えば、「Sales」を除外するために以下のSQLを実行すると、意図に反して「Sales」が取得出来てしまいます。

    ワイルドカードではなく「Sa%」という文字列を除外する動きになっているようです。

    SQLの実行結果

    除外リストにワイルドカードを使いたい場合は、not likeを使用します。

    where句で条件をandで記述すれば、not inとnot likeを同時に使用することも可能です。

    複数カラムに対してnot inを使う方法

    カラム単体ではなく、複数のカラムの組み合わせに対してnot inを使うことも可能です。

    実行結果は以下のとおりです。

    「d002 Finance」は除外されていますが、「d007 Sales」は除外されていません。not inに指定したリストはdept_no=「d001」 dept_name=「Sales」だからです。

    SQL 実行結果

    not inはnot existsに書き換えても高速化できないケースもあり

    not inを使ったSQLをnot existsを使ったSQLに書き換え、実行速度を比較してみます。

    まずは、not inを使ったSQLから実行してみましょう。

    実行結果は以下の通り。

    • 7 total, Query took 0.0872 seconds.

    SQL実行結果

    続いて、not existsを使ったSQLを実行します。

    • 7 total, Query took 0.0871 seconds.

    出力結果は同じでした。このケースでは、not inでも、not existsでも実行時間はほぼ同じとなりました。

    原因として考えられるのは、データベースのオプティマイザ(最適化エンジン)です。

    このケースでは、内部で実行される処理は、ほぼ同じSQLに最適化されているようです。

    ただし、DBMSや古いバージョンではnot existsがパフォーマンス改善になるケースもあります。

    not inのまとめ

    ポテパンダの一言メモ
    • not inは、固定値リストまたはサブクエリで、指定データを除外できる
    • NULLを除外したい場合は、where句にIS NOT NULLを追加する
    • ワイルドカードを使いたい場合は、not likeを組み合わせる
    • not inは複数のカラムに対して使用可能
    • not inをnot existsに置き換えても高速化できないケースもあり

    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!フリーエンジニアになりたい方向けのコンテンツも盛りだくさんです。

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。年収800万円以上のハイスペック転職をご希望の方は「ポテパンプロフェッショナル」もご用意しておりますのでご利用下さいませ。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料25万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテクラバナー ポテプロバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE

    ポテパンおすすめ案件