今回はPostgreSQLのORを使い、少なくとも一方の条件を満たす施設を取得します。取得したデータの意味を整理します。
所要時間は15分ほどです。
それでは、さっそく始めていきましょう!
今日のテーマと到達目標
ORで条件を組み合わせたSQLを自分で書き、ANDとの違いを説明することが目標です。
用語の定義
| 指定 | 取得する行 |
|---|---|
| 条件1 AND 条件2 | 両方の条件を満たす行 |
| 条件1 OR 条件2 | 少なくとも一方の条件を満たす行。両方を満たす行も含む |
条件式は、各行が指定した条件を満たすかを判定する式です。今回は値が入力済みの都市と開業日を扱います。
取得元はmobility.poisです。1行は1施設を表します。
| 列名 | 意味 |
|---|---|
| poi_id | 施設を識別するID |
| poi_name | 施設名 |
| city | 所在する都市 |
| opened_date | 開業日。DATE型 |
TokyoまたはShinjukuの施設を取得する
SELECT poi_id, poi_name, city
FROM mobility.pois
WHERE city = 'Tokyo'
OR city = 'Shinjuku'
ORDER BY poi_id;
ORの左右に、都市がTokyoであるという条件式と、都市がShinjukuであるという条件式を書いています。
実行結果は16行でした。施設IDは次のとおりです。
1, 2, 9, 10, 17, 18, 25, 26,
33, 34, 41, 42, 49, 50, 57, 58
「Tokyoの施設はShinjukuではなくても含まれるか」という確認問題には、「含まれる」と回答しました。一方の条件が成り立つので取得対象になります。
都市または開業日で取得する演習
次は、以下の少なくとも一方を満たす施設を取得するSQLを自分で書きました。
- 都市がTokyoである。
- 開業日が2024年1月1日以降である。
SELECT poi_id, poi_name, city, opened_date
FROM mobility.pois
WHERE city = 'Tokyo'
OR opened_date >= DATE '2024-01-01'
ORDER BY poi_id;
実行画面では15行が返りました。施設ID・都市・開業日を抜き出すと次のとおりです。
| poi_id | city | opened_date |
|---|---|---|
| 1 | Tokyo | 2021-01-15 |
| 8 | Kichijoji | 2024-01-12 |
| 9 | Tokyo | 2024-08-31 |
| 13 | Yokohama | 2024-04-17 |
| 15 | Omiya | 2024-04-27 |
| 17 | Tokyo | 2021-02-09 |
| 23 | Omiya | 2024-04-13 |
| 25 | Tokyo | 2024-10-15 |
| 30 | Kawasaki | 2024-04-11 |
| 33 | Tokyo | 2021-09-07 |
| 41 | Tokyo | 2019-05-05 |
| 42 | Shinjuku | 2024-02-07 |
| 49 | Tokyo | 2018-01-14 |
| 57 | Tokyo | 2021-07-16 |
| 62 | Kawasaki | 2024-05-18 |
例えば施設IDが1の行は都市条件だけを、8の行は開業日の条件だけを満たしています。どちらもORの条件を満たすため、結果に含まれています。
両方を満たすと2回表示されるのか
「Tokyoにあり、2024年1月1日以降に開業した施設は、両条件を満たすため2回表示されるか」という質問には、「1回表示されます」と回答しました。
実行結果でも、両条件を満たす施設IDが9と25の行は、それぞれ1回だけ表示されています。
ORは各行を取得するか判定する指定です。満たした条件の数だけ同じ元の行を増やす操作ではありません。また、OR自体が別々の重複行を取り除くわけでもありません。
ANDとの違いを確認する
最後に、都市がTokyoで、開業日が2021年1月15日の施設について考えました。
| 条件 | 回答 |
|---|---|
| 都市がTokyo OR 開業日が2024年1月1日以降 | 含まれる |
| 都市がTokyo AND 開業日が2024年1月1日以降 | 含まれない |
どちらも正解です。この施設は都市の条件を満たしますが、開業日の条件は満たしません。ORなら取得対象になり、ANDなら取得対象になりません。
これは条件の意味を答える確認問題です。ANDへ変更したSQLの実行結果を確認したものではありません。
合格条件と学習記録
| 確認項目 | 確認できた内容 |
|---|---|
| ORで条件を組み合わせて実行できる | TokyoまたはShinjukuの16施設を取得 |
| 自分で条件を書ける | 都市または開業日の条件で15施設を取得 |
| 両方を満たす行の扱いを理解できる | 1回表示されると回答 |
| ANDとの違いを説明できる | 都市条件だけを満たす施設はORに含まれ、ANDには含まれないと回答 |
共有されたSQLはエラーなく実行できました。
まとめ
ORでは少なくとも一方の条件を、ANDでは両方の条件を満たす必要があります。ORは両方を満たす行も取得しますが、条件を2つ満たしたことによって同じ元の行が2回返ることはありません。