今回はPostgreSQLのNOTを使い、条件を否定して施設を取得します。取得したデータの意味を整理します。
所要時間は15分ほどです。
それでは、さっそく始めていきましょう!
今日のテーマと到達目標
NOTを使ったSQLを自分で書き、どの条件を否定しているか説明できることが目標です。
用語の定義
| 用語 | 意味 |
|---|---|
| 否定 | 条件が成り立つ・成り立たないを反転すること |
| NOT (条件式) | 括弧内の条件を否定する指定 |
| OR | 少なくとも一方の条件が成り立つことを表す演算子 |
今回は、値が必ず入力されているcity列を使います。NULLを含む条件の扱いは今回の実習対象ではありません。
取得元はmobility.poisです。1行は1施設を表します。poi_idは施設ID、poi_nameは施設名、cityは所在する都市です。
Tokyoではない施設を取得する
SELECT poi_id, poi_name, city
FROM mobility.pois
WHERE NOT (city = 'Tokyo')
ORDER BY poi_id
LIMIT 5;
city = 'Tokyo'は都市がTokyoであるという条件です。NOTで否定すると、Tokyoではないという条件になります。
実行結果は次の5行でした。
| poi_id | poi_name | city |
|---|---|---|
| 2 | Shinjuku_shopping_002 | Shinjuku |
| 3 | Shibuya_restaurant_003 | Shibuya |
| 4 | Ikebukuro_cafe_004 | Ikebukuro |
| 5 | Yokohama_office_005 | Yokohama |
| 6 | Kawasaki_park_006 | Kawasaki |
「Shinjukuの施設はこの条件を満たすか」という質問には、「満たします」と回答しました。ShinjukuはTokyoではないためです。
TokyoでもShinjukuでもない施設を取得する
次は、NOTとORを使い、否定する範囲を括弧で囲んでSQLを書く演習です。
SELECT poi_id, poi_name, city
FROM mobility.pois
WHERE NOT (city = 'Tokyo' OR city = 'Shinjuku')
ORDER BY poi_id ASC
LIMIT 5;
実際の入力ではORを小文字のorで書きましたが、同じキーワードとして実行できています。
実行結果は次のとおりです。
| poi_id | poi_name | city |
|---|---|---|
| 3 | Shibuya_restaurant_003 | Shibuya |
| 4 | Ikebukuro_cafe_004 | Ikebukuro |
| 5 | Yokohama_office_005 | Yokohama |
| 6 | Kawasaki_park_006 | Kawasaki |
| 7 | Omiya_hotel_007 | Omiya |
どちらの演習もLIMIT 5を指定しているため、表示された5行は条件に合う施設の先頭5件です。条件に合う施設の総数を表すものではありません。
NOTで否定する範囲を確認する
今回の式は、次のように読み取れます。
city = 'Tokyo' OR city = 'Shinjuku'
→ 都市がTokyoまたはShinjukuである
NOT (city = 'Tokyo' OR city = 'Shinjuku')
→ 都市がTokyoでもShinjukuでもない
NOTは括弧内のORでつないだ条件全体にかかっています。
「Shinjukuの施設は今回の条件を満たすか」という質問には、「満たさない」と回答しました。Shinjukuなら括弧内の条件が成り立つため、それを否定した条件は成り立ちません。
2つの条件を整理する
| 都市 | NOT (city = 'Tokyo') | NOT (city = 'Tokyo' OR city = 'Shinjuku') |
|---|---|---|
| Tokyo | 満たさない | 満たさない |
| Shinjuku | 満たす | 満たさない |
| Shibuya | 満たす | 満たす |
1つ目はTokyoを、2つ目はTokyoとShinjukuを取得対象から外します。条件で結果に含めないことと、元のTableの行を削除することは別です。今回のSELECTは行を削除しません。
合格条件と学習記録
| 確認項目 | 確認できた内容 |
|---|---|
| 単一の条件を否定して実行できる | Tokyoではない施設を取得 |
| 複数条件をまとめて否定できる | NOTとORを使ってTokyoでもShinjukuでもない施設を取得 |
| 否定する範囲の違いを理解できる | Shinjukuは最初の条件を満たし、次の条件は満たさないと回答 |
共有されたSQLはエラーなく実行でき、確認問題にも正しく回答できました。
まとめ
NOTを使うときは、どの条件を否定するのかを明確にします。複数条件をまとめて否定する場合は、今回のように括弧で対象の範囲を示すと意味を読み取りやすくなります。