3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PostgreSQL:NOTで条件を否定する|ORと括弧で除外する都市を指定する

3
Posted at

今回は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を使うときは、どの条件を否定するのかを明確にします。複数条件をまとめて否定する場合は、今回のように括弧で対象の範囲を示すと意味を読み取りやすくなります。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?