SQLで含まないデータを抽出するNOT INとNOT LIKE句の使い方と実践例

SQLで特定のデータを除外して検索する方法について、NOT INとNOT LIKE句を中心に解説します。実践的なコード例も交えながら、NULLの扱いなど注意点も説明しますが、あなたはどちらの方法を選びますか?

SQLで含まないデータを抽出する方法

SQLで含まないデータを抽出する3つの方法
🔍
NOT IN句

複数の値を指定して除外検索が可能

📝
NOT LIKE句

文字列のパターンマッチングによる除外

NOT EXISTS

サブクエリを使用した高度な除外検索

SQLのNOT IN句による複数値の除外検索

NOT IN句は、指定した複数の値に該当しないデータを効率的に取得できる便利な機能です。以下のような構文で使用します:


SELECT * FROM テーブル名 
WHERE カラム名 NOT IN ('値1', '値2', '値3')

 

具体例として、部署テーブルから特定の部署を除外する場合:


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

SQLのNOT LIKE句によるパターン除外検索

NOT LIKE句は、特定のパターンを含まないデータを検索する際に使用します。ワイルドカード(%や_)と組み合わせることで、柔軟な検索が可能です。


SELECT * FROM テーブル名 
WHERE カラム名 NOT LIKE '%除外したいパターン%'

 

例えば、名前に「田」を含まない顧客を検索する場合:


SELECT * FROM customers 
WHERE name NOT LIKE '%田%'

SQLのNOT EXISTSによるサブクエリ除外検索

NOT EXISTS句は、サブクエリの結果に存在しないデータを取得する際に使用します。特に複雑な条件での除外検索に適しています。


SELECT * FROM テーブル名 A
WHERE NOT EXISTS (
    SELECT 1 FROM 別テーブル B
    WHERE A.id = B.id
    AND B.条件 = '値'
)

SQLで含まないデータ検索時のNULL値の注意点

NOT IN句使用時には、NULLの扱いに特に注意が必要です。NULLを含む条件で検索すると、予期せぬ結果となることがあります:


-- 以下のクエリは結果を返さない可能性がある
SELECT * FROM テーブル名 
WHERE カラム名 NOT IN ('値1', '値2', NULL)

 

代わりに以下のように書くことをお勧めします:


SELECT * FROM テーブル名 
WHERE カラム名 NOT IN ('値1', '値2')
AND カラム名 IS NOT NULL

SQLの除外検索におけるパフォーマンス最適化

大規模なデータベースで除外検索を行う場合、パフォーマンスに注意が必要です。以下のポイントを考慮しましょう:

  1. インデックスの活用
  • NOT IN句よりもNOT EXISTS句の方が効率的な場合が多い
  • 大量のデータを除外する場合は、インデックスを適切に設定
  1. 実行計画の確認
  • EXPLAIN文を使用して、クエリの実行計画を確認
  • 必要に応じてクエリを最適化
  1. 代替手段の検討
    
    -- NOT INの代わりにJOINを使用する例
    SELECT A.* 
    FROM テーブルA A
    LEFT JOIN テーブルB B ON A.id = B.id
    WHERE B.id IS NULL
    

 

このような最適化により、大規模データベースでも効率的な除外検索が可能になります。