MySQLサブクエリ完全入門|SELECT句で使う書き方と仕組みを初心者向けに徹底解説
生徒
「MySQLでサブクエリって聞いたんですが、クエリの中にクエリを書くってどういうことですか?」
先生
「簡単に言うと、先に調べた結果を使って、もう一度データを探す方法です。紙の名簿を見ながら、別の条件で絞り込むイメージですね。」
生徒
「パソコンをあまり触ったことがなくても理解できますか?」
先生
「大丈夫です。表を目で見て確認しながら、順番に説明します。計算問題を解く感覚で読めますよ。」
1. MySQLとSELECT文の基本
MySQLは、たくさんの情報を表の形で保存して管理するデータベースです。データベースとは、住所録や名簿、会員リストのようなものを、コンピューターの中で整理して保管する箱だと思ってください。
SELECT文は、その表の中から必要なデータを取り出す命令です。紙の名簿から「この人の名前だけ見たい」と指で追いかける作業を、パソコンにお願いするイメージになります。
2. サブクエリとは何かをやさしく理解しよう
サブクエリとは、SQL文の中に書く、もう一つのSQL文のことです。先に小さな調査をして、その結果を使って本命の調査を行います。
たとえば「平均年齢を調べて、その平均より若い人だけを探す」といった場合、先に平均年齢を計算し、その数値を使って条件を決めます。このときに使われるのがサブクエリです。
3. サンプルで使うusersテーブルを確認
ここでは、usersという会員情報のテーブルを使います。実際のSQLを読む前に、まず表の中身を目で見て理解しましょう。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋美咲 | 22 | misaki@example.com
5 | 田中健太 | 40 | kenta@example.com
4. SELECT句で使うシンプルなサブクエリ例
まずは一番基本的なサブクエリの例です。平均年齢を求めて、その平均より年齢が高い人を探します。
SELECT name, age
FROM users
WHERE age > (
SELECT AVG(age)
FROM users
);
内側のSELECT文が先に実行され、年齢の平均が計算されます。その結果を使って、外側のSELECT文が条件を判断します。
name | age
-----------+-----
鈴木一郎 | 30
田中健太 | 40
5. 数字を条件に使うサブクエリの考え方
サブクエリは、数字を一つ返す場合によく使われます。平均値、最大値、最小値などを調べるときに便利です。
ここでは、最年長の年齢を調べ、その年齢と同じ人を探します。
SELECT name, age
FROM users
WHERE age = (
SELECT MAX(age)
FROM users
);
name | age
-----------+-----
田中健太 | 40
6. 複数行を返すサブクエリとINの使い方
サブクエリは、一行だけでなく複数の行を返すこともあります。その場合はINという条件を使います。
ここでは、20代の人の年齢一覧をサブクエリで取得し、それに当てはまる人を表示します。
SELECT name, age
FROM users
WHERE age IN (
SELECT age
FROM users
WHERE age BETWEEN 20 AND 29
);
name | age
-----------+-----
山田太郎 | 25
高橋美咲 | 22
7. サブクエリを使うと何が便利なのか
サブクエリを使うと、SQLを分けて考えられるため、条件が複雑でも読みやすくなります。紙に下書きをしてから清書する感覚に近いです。
初心者のうちは、まず「内側のSELECTだけを実行すると何が出るか」を考えると、理解しやすくなります。
8. SELECT句のサブクエリでつまずきやすい点
よくある間違いは、サブクエリが返す結果の数を意識しないことです。一つの値なのか、複数行なのかによって、記述方法が変わります。
また、かっこを忘れたり、サブクエリの中で使える列を間違えたりするとエラーになります。エラーが出たら、内側のSQLだけを確認する習慣をつけましょう。