SELECT文には慣れてきたつもりでいたけれど、SELECTした行以外を表示する方法がわからなくなってググってしまったので備忘録です。
SELECTした行以外を表示する方法
Selectした行以外を表示させるには「NOT IN」を使用します。
動作環境
この記事はSQL FIDDLEでMySQL5.6、PostgreSQL9.6、SQLiteで動作確認しました。
下記文章は主にPostgreSQLで仕様で調べています。
構文
書き方の例です。
SELECT * FROM テーブル名 WHERE カラム名
NOT IN (SELECT * FROM テーブル名 WHERE…);
NOT INのおかげでサブクエリのテーブルの中身以外をWHERE以下の条件に合わせて表示させてくれます。
実際にSELECTした行以外を表示してみよう!
せっかくなので実際にSELECTした行以外をSELECTして表示してみようと思います。
準備
以下のテーブルを使用します。
ItemID | ItemName | Quantity | ArriveDate | AREA |
---|---|---|---|---|
1 | ゼリー | 30 | 2020-04-20 | 東京 |
2 | プリン | 25 | 2020-04-20 | 大阪 |
3 | ゼリー | 30 | 2020-04-23 | 東京 |
4 | ティラミス | 15 | 2020-04-22 | 大阪 |
5 | ヨーグルト | 30 | 2020-04-20 | 東京 |
6 | ゼリー | 20 | 2020-04-22 | 大阪 |
以下練習用itemテーブル作成コードです。
— CREATE文
CREATE TABLE item (
ItemID numeric(8, 0) unique not null,
ItemName character varying (20) not null,
Quantity numeric(8, 0),
ArriveDate DATE,
AREA character varying (20),
primary key(ItemID)
);
— INSERT文
insert into item
values(0001, ‘ゼリー’, 30, ‘2020-04-20’, ‘東京’),
(0002, ‘プリン’, 25, ‘2020-04-20’, ‘大阪’),
(0003, ‘ゼリー’, 30, ‘2020-04-23’, ‘東京’),
(0004, ‘ティラミス’, 15, ‘2020-04-22’, ‘大阪’),
(0005, ‘ヨーグルト’, 30, ‘2020-04-20’, ‘東京’),
(0006, ‘ゼリー’, 20, ‘2020-04-22’, ‘大阪’);
SELECTした行以外を表示するSQLサンプル
本来こんな取得の仕方はしないと思いますが簡単なサンプルです。
SELECT * FROM ITEM WHERE AREA
NOT IN (SELECT AREA FROM ITEM WHERE AREA = ‘東京’);
AREAが東京の行を取得したサブクエリ以外を表示させています。
■ 結果
itemid | itemname | quantity | arrivedate | area |
---|---|---|---|---|
2 | プリン | 25 | 2020-04-20 | 大阪 |
4 | ティラミス | 15 | 2020-04-22 | 大阪 |
6 | ゼリー | 20 | 2020-04-22 | 大阪 |
おわり
似た内容でSELECTした行以外を削除する方法について以前書いているのでそちらも興味がありましたら読んでみてください。