【MySQL】サブクエリを使用する方法:サンプル多数あり


ここでは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