PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
生徒
「データベースに保存した大量のデータの中から、特定の人や情報だけを選んで表示させるにはどうすればいいんですか?」
先生
「それには『WHERE句(ウェアく)』という命令を使います。名簿の中から『20歳以上の人』や『東京都に住んでいる人』だけを抽出するための、フィルターのような役割を果たす言葉です。」
生徒
「フィルターですか!Excelの絞り込み機能みたいなイメージでしょうか?」
先生
「まさにその通りです。SQLという言葉を使って、コンピュータに『この条件に合うデータだけ持ってきて!』と頼む方法を、これから一緒に学んでいきましょう。」
1. SQLとは何か?
SQL(エスキューエル)は、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための言語です。例えば、会員名簿の中から特定の人を探したり、新しい人を追加したりするときに使います。プログラミングの経験がない方でも、基本的なルールさえ覚えれば、まるで魔法のように目的のデータを一瞬で見つけ出すことができるようになります。
PostgreSQL(ポストグレスキューエル)は、世界中で使われている非常に人気のあるデータベース管理システムの一つです。信頼性が高く、無料で使えるため、多くの企業やサービスで採用されています。このPostgreSQLを操作する際に最も頻繁に使うのが、データの検索を行う「SELECT文」と、条件を指定する「WHERE句」の組み合わせです。
2. WHERE句の役割と基本の書き方
データベースにあるテーブル(表)には、何万件、何百万件という膨大なデータが入っていることがあります。その中から「必要な情報だけ」を取り出すために欠かせないのがWHERE句です。WHEREは英語で「どこに」という意味ですが、SQLでは「〜という条件に一致する場所(行)のデータ」という意味で使われます。
基本となる書き方は非常にシンプルです。まず「どの項目を表示するか」を決め、次に「どのテーブルから取得するか」を書き、最後に「どんな条件で絞り込むか」をWHEREの後につなげるだけです。
具体的なイメージ:名簿から特定の年齢の人を探す
まずは、操作の対象となる「users(ユーザー)」という名前のテーブルを見てみましょう。ここには会員の名前や年齢、メールアドレスが保存されています。
id | name | age | email | city
---+------------+-----+----------------------+-------
1 | 山田太郎 | 25 | taro@example.com | 東京
2 | 佐藤花子 | 19 | hanako@example.com | 大阪
3 | 鈴木一郎 | 30 | ichiro@example.com | 名古屋
4 | 田中愛 | 22 | ai@example.com | 東京
5 | 高橋健太 | 28 | kenta@example.com | 福岡
6 | 伊藤純子 | 19 | junko@example.com | 東京
この中から「年齢が19歳の人」だけを抽出したい場合、SQLは以下のように記述します。
SELECT *
FROM users
WHERE age = 19;
ここで使われている記号の意味を解説します。
- SELECT * : 「*(アスタリスク)」は「すべての列(項目)」という意味です。
- FROM users : 「usersという名前のテーブルからデータを持ってきて」という意味です。
- WHERE age = 19 : 「age(年齢)の項目が19であるデータだけにして」という条件です。
この命令を実行した結果、データベースは次のようにデータを返してくれます。
id | name | age | email | city
---+----------+-----+--------------------+-------
2 | 佐藤花子 | 19 | hanako@example.com | 大阪
6 | 伊藤純子 | 19 | junko@example.com | 東京
3. 比較演算子を使って柔軟に絞り込む
「=(等しい)」以外にも、数学の授業で習ったような記号を使って、より複雑な条件を指定することができます。これらを「比較演算子(ひかくえんざんし)」と呼びます。例えば、「〇歳以上」「〇歳未満」といった指定が可能です。
よく使われる比較記号の一覧
| 記号 | 意味 | 使い方の例 |
|---|---|---|
| = | 等しい | WHERE age = 20 |
| > | より大きい(その数は含まない) | WHERE age > 25 |
| < | より小さい(その数は含まない) | WHERE age < 20 |
| >= | 以上(その数を含む) | WHERE age >= 25 |
| <= | 以下(その数を含む) | WHERE age <= 20 |
| <> または != | 等しくない(それ以外) | WHERE city <> '東京' |
実践例:25歳以上のユーザーをすべて取り出す
今度は、先ほどの名簿から「25歳以上の人」を探してみましょう。条件は age >= 25 となります。
SELECT id, name, age
FROM users
WHERE age >= 25;
実行前のデータ全体をもう一度確認しましょう。
id | name | age | email | city
---+------------+-----+----------------------+-------
1 | 山田太郎 | 25 | taro@example.com | 東京
2 | 佐藤花子 | 19 | hanako@example.com | 大阪
3 | 鈴木一郎 | 30 | ichiro@example.com | 名古屋
4 | 田中愛 | 22 | ai@example.com | 東京
5 | 高橋健太 | 28 | kenta@example.com | 福岡
6 | 伊藤純子 | 19 | junko@example.com | 東京
実行後の結果は以下のようになります。25歳ちょうどの山田太郎さんも含まれている点に注目してください。
id | name | age
---+----------+-----
1 | 山田太郎 | 25
3 | 鈴木一郎 | 30
5 | 高橋健太 | 28
4. 文字列(テキスト)を条件にする時の注意点
数字を扱うときはそのまま 25 のように書けますが、名前や都市名などの「文字」を条件にする場合は、大切なルールがあります。それは、文字をシングルクォーテーション(' ')で囲むということです。もし囲むのを忘れてしまうと、PostgreSQLは「これは命令かな?それとも設定かな?」と混乱してしまい、エラー(間違い)として処理されてしまいます。
実践例:「東京」に住んでいる人を検索する
特定の住所や都市を指定して検索してみましょう。ここでは「city」という項目が「東京」であるデータを指定します。
SELECT name, city
FROM users
WHERE city = '東京';
実行前の名簿です。
id | name | age | email | city
---+------------+-----+----------------------+-------
1 | 山田太郎 | 25 | taro@example.com | 東京
2 | 佐藤花子 | 19 | hanako@example.com | 大阪
3 | 鈴木一郎 | 30 | ichiro@example.com | 名古屋
4 | 田中愛 | 22 | ai@example.com | 東京
5 | 高橋健太 | 28 | kenta@example.com | 福岡
6 | 伊藤純子 | 19 | junko@example.com | 東京
実行後の結果です。東京に住んでいる3名が正しく表示されました。
name | city
---------+------
山田太郎 | 東京
田中愛 | 東京
伊藤純子 | 東京
このように、文字を扱うときは必ず '東京' のように記号で挟むことを忘れないようにしましょう。これはSQLの世界における重要な「お作法」です。
5. 複数の条件を組み合わせる(ANDとOR)
実際の業務では、「東京に住んでいて、かつ25歳以上の人」といったように、複数の条件を同時に使いたい場面がたくさんあります。そのような時に使うのが AND と OR です。
- AND(アンド) : 「AかつB」。両方の条件を満たしているデータだけを選びます。
- OR(オア) : 「AまたはB」。どちらか一方でも条件を満たしていれば選びます。
実践例:「東京に住んでいる」かつ「20歳以上」の人を探す
この場合、条件をANDでつなぎます。非常に絞り込まれた結果が得られるはずです。
SELECT *
FROM users
WHERE city = '東京' AND age >= 20;
実行前のデータです。
id | name | age | email | city
---+------------+-----+----------------------+-------
1 | 山田太郎 | 25 | taro@example.com | 東京
2 | 佐藤花子 | 19 | hanako@example.com | 大阪
3 | 鈴木一郎 | 30 | ichiro@example.com | 名古屋
4 | 田中愛 | 22 | ai@example.com | 東京
5 | 高橋健太 | 28 | kenta@example.com | 福岡
6 | 伊藤純子 | 19 | junko@example.com | 東京
実行後の結果です。東京在住でも19歳の伊藤さんは除外され、2名だけが残りました。
id | name | age | email | city
---+----------+-----+------------------+------
1 | 山田太郎 | 25 | taro@example.com | 東京
4 | 田中愛 | 22 | ai@example.com | 東京
6. あいまいな検索ができるLIKE句
「名前が『山』から始まる人」や「メールアドレスに『example』が含まれている人」など、正確な一致ではなく「だいたい一致」で探したいときには LIKE句 を使います。この時に使う「%(パーセント)」という記号は、ワイルドカードと呼ばれ、「どんな文字が何文字入ってもいいよ」という意味になります。
'山%': 山で始まる(山田、山下、山など)'%子': 子で終わる(花子、純子、よし子など)'%太%': どこかに「太」が入っている(太郎、太一、健太など)
実践例:名前に「子」がつく人を検索する
SELECT name, email
FROM users
WHERE name LIKE '%子';
実行前のデータを確認します。
id | name | age | email | city
---+------------+-----+----------------------+-------
1 | 山田太郎 | 25 | taro@example.com | 東京
2 | 佐藤花子 | 19 | hanako@example.com | 大阪
3 | 鈴木一郎 | 30 | ichiro@example.com | 名古屋
4 | 田中愛 | 22 | ai@example.com | 東京
5 | 高橋健太 | 28 | kenta@example.com | 福岡
6 | 伊藤純子 | 19 | junko@example.com | 東京
実行後の結果です。名前に「子」が含まれる2名が表示されました。
name | email
---------+--------------------
佐藤花子 | hanako@example.com
伊藤純子 | junko@example.com
7. WHERE句を使うときの重要ポイントと注意点
最後に、初心者が間違いやすいポイントを整理しておきましょう。これらに気をつけるだけで、SQLの学習効率が格段に上がります。
全角と半角を混ぜない
プログラムの世界では、基本的にすべての命令(SELECT, FROM, WHEREなど)や記号(=, >, ' ')は半角英数字で書かなければなりません。全角のスペースや全角の「=」が混じっていると、コンピュータは理解できずにエラーを出してしまいます。名前に使う漢字以外は、すべて半角で入力する癖をつけましょう。
データ型に合わせた指定をする
先ほども説明しましたが、数字の項目(数値型)にはクォーテーションをつけず、文字の項目(文字列型)にはシングルクォーテーションをつける、という区別が非常に大切です。また、日付を扱う場合も、基本的には '2024-01-01' のようにクォーテーションで囲むのが一般的です。
IS NULLとIS NOT NULL
データベースには「値が何も入っていない状態」を指す NULL(ヌル) という特別な言葉があります。もし「電話番号が登録されていない人」を探したいとき、WHERE phone = NULL と書いても正しく動きません。正解は WHERE phone IS NULL と書く必要があります。これは少し特殊なルールなので、頭の片隅に置いておいてください。
処理の順番を意識する
SQLには実行される順番があります。
- まず FROM でどのテーブルかを見に行く
- 次に WHERE でデータを絞り込む
- 最後に SELECT で指定された列を表示する