상관 서브쿼리란 ? 부모 명령과 자식인 서브쿼리가 특정 관계를 맺는 것을 상관 서브쿼리라 한다.
mysql> SELECT * FROM sample551;
+------+------+
| no | a |
+------+------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | NULL |
| 5 | NULL |
+------+------+
5 rows in set (0.00 sec)
mysql> SELECT * FROM sample552;
+------+
| no2 |
+------+
| 3 |
| 5 |
+------+
2 rows in set (0.00 sec)
# sample552에 no 열의 값과 같은 행이 있다면 '있음'으로 갱신
mysql> UPDATE sample551 SET a = '있음' WHERE
-> EXISTS (SELECT * FROM sample552 WHERE no2 = no);
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> SELECT * FROM sample551;
+------+--------+
| no | a |
+------+--------+
| 1 | NULL |
| 2 | NULL |
| 3 | 있음 |
| 4 | NULL |
| 5 | 있음 |
+------+--------+
5 rows in set (0.00 sec)
mysql> UPDATE sample551 SET a = '없음' WHERE
-> NOT EXISTS (SELECT * FROM sample552 WHERE no2 = no);
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> SELECT * FROM sample551;
+------+--------+
| no | a |
+------+--------+
| 1 | 없음 |
| 2 | 없음 |
| 3 | 있음 |
| 4 | 없음 |
| 5 | 있음 |
+------+--------+
5 rows in set (0.00 sec)
NOT
을 붙여 값을 부정한다.# WHERE no = no
❕ MySQL에서는 WHERE sample552.no = sample552.no가 되어 항상 참이 된다.
👉 결과적으로 sample551의 모든 행은 a 열 값이 '있다'로 갱신된다.
mysql> UPDATE sample551 SET a = '있음' WHERE
-> EXISTS (SELECT * FROM sample552 WHERE sample552.no2 = sample551.no);
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
열명 IN(집합)
mysql> SELECT * FROM sample551 WHERE no IN(3,5);
+------+--------+
| no | a |
+------+--------+
| 3 | 있음 |
| 5 | 있음 |
+------+--------+
2 rows in set (0.00 sec)
# 서브쿼리로 지정
mysql> SELECT * FROM sample551 WHERE no IN
-> (SELECT no2 FROM sample552);
+------+--------+
| no | a |
+------+--------+
| 3 | 있음 |
| 5 | 있음 |
+------+--------+
2 rows in set (0.00 sec)