例えば、miuraさんと同じ都道府県に住んでいるメンバーを表示したい場合、
mysqlへのアクセスを2回行う必要があります。
1回目は以下のような命令で、miuraさんのaddressを確認します。
1 |
mysql> select * from member where name='miura'; |
2回目は、1回目のクエリで得られた結果を元に以下のようなクエリを発行します。
1 2 3 4 5 6 7 8 9 10 |
mysql> select * from member where address='埼玉'; +----+--------+------+--------+---------+ | id | name | age | weight | address | +----+--------+------+--------+---------+ | 4 | miura | 31 | 67 | 埼玉 | | 11 | saeki | 29 | 49 | 埼玉 | | 12 | ooyama | 29 | 48 | 埼玉 | | 13 | kamata | 22 | 47 | 埼玉 | +----+--------+------+--------+---------+ 4 rows in set (0.00 sec) |
これを一回のクエリにまとめるための手法が副問い合わせです。
副問い合わせを使えば、以下のように上記の2回のクエリを1回にまとめられます。
1 2 3 4 5 6 7 8 9 10 |
mysql> select * from member where address = ( select address from member where name='miura'); +----+--------+------+--------+---------+ | id | name | age | weight | address | +----+--------+------+--------+---------+ | 4 | miura | 31 | 67 | 埼玉 | | 11 | saeki | 29 | 49 | 埼玉 | | 12 | ooyama | 29 | 48 | 埼玉 | | 13 | kamata | 22 | 47 | 埼玉 | +----+--------+------+--------+---------+ 4 rows in set (0.00 sec) |
これは、ベースとなるselect文のwhere句のaddressの条件として、「select address from member where name=’miura’」の
結果を使っています。このselect文が副問い合わせになります。
結果として、先ほどのクエリを2回出したときの結果と同じになります。
副問い合わせが複数行の場合
上の例では副問い合わせの結果が1行だからできますが、副問い合わせのselectの結果が複数行になる可能性がある場合はJOIN句を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql> select * from member where address in ( select address from member where name in ('tanaka', 'kimura')); +----+----------+------+--------+---------+ | id | name | age | weight | address | +----+----------+------+--------+---------+ | 1 | tanaka | 30 | 57 | 東京 | | 2 | suzuki | 32 | 77 | 東京 | | 5 | kimura | 27 | 62 | 茨城 | | 8 | murakami | 35 | 42 | 茨城 | | 9 | kikuchi | 32 | 41 | 茨城 | | 10 | suzuki | 31 | 51 | 茨城 | +----+----------+------+--------+---------+ 6 rows in set (0.00 sec) |
/