ここではMySQLで、サブクエリを使用する方法を紹介しています。
サブクエリとは
サブクエリとは、1つのSQLの中で、別のSELECT文の結果を利用する方法です。サブクエリはSELECT文以外にも、UPDATE、DELETE、INSERT文で利用することが出来ます。
サブクエリを使用する方法
WHERE句の検索条件として利用する
WHERE句の条件に「(SELECT文)」を記述することで、サブクエリを検索条件として使うことが出来ます。
mysql> SELECT a.* FROM tab1 a WHERE a.emp_id IN (SELECT col1 FROM tab2);
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | HR | 28 |
| 00002 | Tanaka | SALES | 25 |
| 00003 | Kizaki | SALES | 35 |
+--------+----------+-------+------+
3 rows in set (0.01 sec)
SELECE句でサブクエリを利用する
SELECT句に「(SELECT文)」を記述しサブクエリを利用することもできます。
mysql> SELECT a.*,(SELECT b.col2 FROM tab2 b WHERE b.col1 = a.emp_id) as d FROM tab1 a;
+--------+----------+-------+------+------+
| emp_id | emp_name | dept | age | d |
+--------+----------+-------+------+------+
| 00001 | Suzuki | HR | 28 | 1 |
| 00002 | Tanaka | SALES | 25 | 2 |
| 00003 | Kizaki | SALES | 35 | 3 |
| 00004 | Tanaka | DEV | 45 | 4 |
| 00005 | Kizaki | DEV | 55 | 5 |
| 00006 | Nakata | DEV | 35 | 6 |
+--------+----------+-------+------+------+
6 rows in set (0.00 sec)
FROM句で一時テーブルの様にサブクエリを利用する
FROM句に「(SELECT文)」を記述することで、サブクエリを一時テーブルのように利用することが出来ます。
mysql> SELECT a.*,b.col2 FROM (SELECT * FROM tab1) a,tab2 b WHERE a.emp_id = b.col1;
+--------+----------+-------+------+------+
| emp_id | emp_name | dept | age | col2 |
+--------+----------+-------+------+------+
| 00001 | Suzuki | HR | 28 | 1 |
| 00002 | Tanaka | SALES | 25 | 2 |
| 00003 | Kizaki | SALES | 35 | 3 |
| 00004 | Tanaka | DEV | 45 | 4 |
| 00005 | Kizaki | DEV | 55 | 5 |
| 00006 | Nakata | DEV | 35 | 6 |
+--------+----------+-------+------+------+
6 rows in set (0.00 sec)
UPDATE文のSET句でサブクエリを利用する
UPDATE文のSET句に「(SELECT文)」を記述することで、サブクエリで取得した値でデータを更新することが出来ます。
mysql> UPDATE tab1 a SET a.age = (SELECT b.col2 FROM tab2 b WHERE b.col1 = a.emp_id);
Query OK, 6 rows affected (0.01 sec)
Rows matched: 6 Changed: 6 Warnings: 0
UPDATE文のWHERE句でサブクエリを利用する
UPDATE文のWHERE句に「(SELECT文)」を記述することで、サブクエリで取得した値と一致するレコードを更新することが出来ます。
mysql> UPDATE tab1 a SET a.age = 20 WHERE a.emp_id IN (SELECT col1 FROM tab2);
Query OK, 6 rows affected (0.01 sec)
Rows matched: 6 Changed: 6 Warnings: 0
DELETE文のWHERE句でサブクエリを利用する
DELETE文のWHERE句に「(SELECT文)」を記述することで、サブクエリで取得した値と一致するレコードを削除することが出来ます。
mysql> DELETE FROM tab1 WHERE emp_id IN (SELECT col1 FROM tab2);
Query OK, 6 rows affected (0.01 sec)
INSERT文でSELECTした値を登録する
サブクエリを使い、SELECTした値を使ってレコードを登録することが出来ます。
mysql> INSERT INTO tab1 (SELECT * FROM tab7);
Query OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0