[SQL]IN句/NOT IN句 について(備忘録)

2024/09/02に公開

1.はじめに

・カラムの値が(複数の)指定値の中に存在するか判定したい場合、IN句を使用します。
・カラムの値が(複数の)指定値以外の中に存在するか判定したい場合、NOT IN句を使用します。
・IN句/NOT IN句自体は、TRUEまたはFALSEを返します。

2.サンプルプログラム

〇例1:IN句を使用

Sample_1.sql
CREATE TABLE product_list (
    id INT(2) AUTO_INCREMENT NOT NULL,
    product_name varchar(30) NOT NULL,
    price int(5),
    PRIMARY KEY (id)
);

INSERT INTO product_list (
    product_name,
    price
)
VALUES ('バナナ', 300),('ミカン', 350),('リンゴ', 400),('パイナップル', 450),('桃', NULL);

SELECT *
FROM product_list
    WHERE price IN (300, 350, 400)
;

-- INをORに置換
SELECT *
FROM product_list
    WHERE price = 300
    OR price = 350
    OR price = 400
;

実行結果

id product_name price
1 バナナ 300
2 ミカン 350
3 リンゴ 400

備考
INをORに置換しても結果は同じですが、ソースコードの可読性が悪くなります。

〇例2:NOT IN句を使用

Sample_2.sql
CREATE TABLE product_list (
    id INT(2) AUTO_INCREMENT NOT NULL,
    product_name varchar(30) NOT NULL,
    price int(5),
    PRIMARY KEY (id)
);

INSERT INTO product_list (
    product_name,
    price
)
VALUES ('バナナ', 300),('ミカン', 350),('リンゴ', 400),('パイナップル', 450),('桃', NULL);

SELECT *
FROM product_list
    WHERE price NOT IN (300, 350)
;

-- 値段がNULLの値を抽出
SELECT *
FROM product_list
    WHERE price IS NULL
;

実行結果

id product_name price
3 リンゴ 400
4 パイナップル 450
id product_name price
5 NULL

重要
NOT IN句を用いて、NULLのデータを抽出することはできませんでした。
IN句でも同様に、NULLのデータは抽出できません。
NULLを抽出したい場合、IS NULLIS NOT NULL を使用します。

〇例3:IN句とサブクエリを併用

Sample_3.sql
CREATE TABLE department_list (
    department_id INT AUTO_INCREMENT NOT NULL,
    department_name VARCHAR(5) NOT NULL,
    PRIMARY KEY (department_id)
);

INSERT INTO department_list (
    department_name
)
VALUES 
('営業'), ('総務');

CREATE TABLE employee_list (
    id INT AUTO_INCREMENT NOT NULL,
    department_id INT NOT NULL,
    employee_name VARCHAR(5) NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO employee_list (
    department_id,
    employee_name
)
VALUES 
(1, '田中'), (1, '大谷'), (2, '鈴木'), (1, '三木'), (1, '山田'), 
(1, '近藤'), (2, '佐藤'), (1, '佐野'), (2, '伊藤');

SELECT employee_name
FROM employee_list
    WHERE department_id IN (
        SELECT department_id
        FROM department_list
            WHERE department_name = '営業'
);

実行結果

employee_name
田中
大谷
三木
山田
近藤
佐野

重要
・サブクエリの結果にNULLが含まれていた場合、予期しない結果が生じる可能性があります。
・サブクエリの結果とIN句で指定したカラムのデータ型は、必ず一致させて下さい。

3.その他

参考サイト

実行環境

Discussion