今回はPostgreSQLのANDを使い、複数の条件をすべて満たす施設を取得します。取得したデータの意味を整理します。
所要時間は15分ほどです。
それでは、さっそく始めていきましょう!
今日のテーマと到達目標
2つの条件を組み合わせたSQLを自分で書き、どの行が取得対象になるか説明することが目標です。
用語の定義
| 用語 | 意味 |
|---|---|
| 条件式 | 各行が指定した条件を満たすかを判定する式 |
| AND | 条件式をつなぎ、両方が成り立つことを求める演算子 |
| WHERE 条件1 AND 条件2 | 両方の条件が成り立つ行を取得する指定 |
今回は値が入力済みの都市と開業日を扱います。
取得元はmobility.poisです。1行は1施設を表します。
| 列名 | 意味 |
|---|---|
| poi_id | 施設を識別するID |
| poi_name | 施設名 |
| city | 所在する都市 |
| opened_date | 開業日。DATE型 |
都市と開業日の条件を組み合わせる
まず、次の両方を満たす施設を取得しました。
- 都市がTokyoである。
- 開業日が2021年1月1日以降である。
SELECT poi_id, poi_name, city, opened_date
FROM mobility.pois
WHERE city = 'Tokyo'
AND opened_date >= DATE '2021-01-01'
ORDER BY poi_id;
'Tokyo'は都市名として指定する文字列、DATE '2021-01-01'は基準となる日付です。開業日が基準日と同じか、それより後であることを>=で指定しています。
実際の実行結果は次の6行でした。
| poi_id | poi_name | city | opened_date |
|---|---|---|---|
| 1 | Tokyo_station_001 | Tokyo | 2021-01-15 |
| 9 | Tokyo_station_009 | Tokyo | 2024-08-31 |
| 17 | Tokyo_station_017 | Tokyo | 2021-02-09 |
| 25 | Tokyo_station_025 | Tokyo | 2024-10-15 |
| 33 | Tokyo_station_033 | Tokyo | 2021-09-07 |
| 57 | Tokyo_station_057 | Tokyo | 2021-07-16 |
件数を制限していないため、今回のデータで両方の条件を満たす施設は6件と確認できます。
片方の条件だけでは含まれない
「都市がTokyoでも、開業日が2020年12月31日の施設は含まれるか」という確認問題には、「含まれません」と回答しました。
都市の条件は満たしますが、開業日の条件を満たしません。ANDでは、片方だけを満たしても取得対象にはなりません。
自分で条件を変える演習
次は、都市がShinjukuで、開業日が2021年1月1日より前の施設を取得するSQLを書きました。
実際に実行したSQLは次のとおりです。
SELECT poi_id, poi_name, city, opened_date
FROM mobility.pois
WHERE city = 'Shinjuku'
AND opened_date < '2021-01-01'
ORDER BY poi_id ASC;
実行結果は次の4行でした。
| poi_id | poi_name | city | opened_date |
|---|---|---|---|
| 2 | Shinjuku_shopping_002 | Shinjuku | 2019-11-11 |
| 10 | Shinjuku_shopping_010 | Shinjuku | 2020-07-14 |
| 34 | Shinjuku_shopping_034 | Shinjuku | 2018-02-23 |
| 58 | Shinjuku_shopping_058 | Shinjuku | 2020-03-27 |
「より前」なので、指定日ちょうどを含まない<を使っています。
今回のSQLでは日付の前にDATEを付けていませんが、DATE型のopened_dateと比較する文脈から、引用符内の値が日付として解釈され、実行できています。学習時には、次のように日付であることを明示しても同じ条件を指定できます。
WHERE city = 'Shinjuku'
AND opened_date < DATE '2021-01-01'
この明示形は説明用で、上の4行はDATEを省略したSQLの実行画面で確認した結果です。
都市の条件を満たさない場合
「開業日が2020年でも、都市がTokyoの施設は今回の結果に含まれるか」という確認問題にも、「含まれません」と回答しました。
開業日の条件は満たしますが、都市がShinjukuという条件を満たさないためです。
| 都市の条件 | 開業日の条件 | 取得対象になるか |
|---|---|---|
| 満たす | 満たす | なる |
| 満たす | 満たさない | ならない |
| 満たさない | 満たす | ならない |
| 満たさない | 満たさない | ならない |
合格条件と学習記録
| 確認項目 | 確認できた内容 |
|---|---|
| ANDで条件を組み合わせて実行できる | Tokyoかつ指定日以降の6施設を取得 |
| 自分で条件を変更できる | Shinjukuかつ指定日より前の4施設を取得 |
| 日付条件が不成立なら除外されると分かる | Tokyoでも2020年12月31日なら含まれないと回答 |
| 都市条件が不成立なら除外されると分かる | 2020年開業でもTokyoなら含まれないと回答 |
共有されたSQLはエラーなく実行でき、確認問題にも正しく回答できました。
まとめ
WHERE 条件1 AND 条件2は、両方の条件を満たす行を取得する指定です。各条件を同じ行について確認し、一方だけ満たす行は結果に含めません。