♿
[SQL]IN句/NOT IN句 とは(備忘録)
1.はじめに
・カラムの値が(複数の)指定値の中に存在するか判定したい場合、IN句を使用します。
・カラムの値が(複数の)指定値以外の中に存在するか判定したい場合、NOT IN句を使用します。
・IN句/NOT IN句自体は、TRUEまたはFALSEを返します。
2.サンプルプログラム
〇例1:IN句を使用
Sample_1.sql
CREATE TABLE product_list (
id INT 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 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 NULL か IS 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.参考
4.その他
・実行環境
Discussion