SQLでSELECTした行以外を表示する方法!(MySQL/PostgreSQL/SQLite)

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して表示してみようと思います。

準備

以下のテーブルを使用します。

ItemIDItemNameQuantityArriveDateAREA
1ゼリー302020-04-20東京
2プリン252020-04-20大阪
3ゼリー302020-04-23東京
4ティラミス152020-04-22大阪
5ヨーグルト302020-04-20東京
6ゼリー202020-04-22大阪
itemテーブル

以下練習用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が東京の行を取得したサブクエリ以外を表示させています。

■ 結果

itemiditemnamequantityarrivedatearea
2プリン252020-04-20大阪
4ティラミス152020-04-22大阪
6ゼリー202020-04-22大阪

おわり

似た内容でSELECTした行以外を削除する方法について以前書いているのでそちらも興味がありましたら読んでみてください。

SQL

Posted by Nakamoto