728x90
Query 안에 또 다른 query를 넣는 것을 subquery라고 한다.
예를 들어, SELECT 문 안에 중첩되어 SELECT 문이 들어가는 경우.
SELECT 문은 크게 보았을 때, SELECT의 대상이 되는 칼럼 (field)와 FROM 혹은 JOIN 뒤에 붙는 테이블이 있다.
이에 따라 subquery 사용 경우의 수를 두 가지로 나눠 볼 수 있다.
1. SELECT (SELECT ~ FROM~) FROM ~
Subquery를 칼럼 중 하나로 넣어 줄 때에는 Subquery로 SELECT한 칼럼은 1개여야 하고 subquery안에 바깥 액자 역할을 하는 table과 연결 (link) 될 수 있도록 하는 where문을 넣어줘야 한다.
예시는 아래와 같음.
SELECT
m.id movie_id,
m.title title,
m.rate rate,
m.open_date open_date,
d.business_name distributor_name,
(
SELECT
JSON_ARRAYAGG(
JSON_OBJECT(
"actorId", a.id,
"name", a.name
)
)
FROM actors a
JOIN movies_actors ma ON a.id = ma.actor_id
WHERE ma.movie_id = m.id
GROUP BY ma.movie_id
) actor_list
FROM movies m
JOIN distributors d ON d.id = m.distributor_id
WHERE d.business_name = "Nolan Unlimited" AND m.rate = (SELECT MAX(rate) FROM movies)
GROUP BY m.id
2. SELECT ~ FROM ~ JOIN (SELECT ~ FROM~)
JOIN 뒤에 들어가는 경우 SELECT문으로 새로운 table을 생성하여 그대로 다른 table에 이어붙인다고 생각하면 되므로,
SELECT 대상으로 들어갈 때보다 쉽게 이해될 것 같다.
예시는 아래와 같음.
SELECT
m.id movie_id,
m.title title,
m.rate rate,
m.open_date open_date,
d.business_name distributor_name,
actors.actorList actor_list
FROM movies m
JOIN distributors d ON d.id = m.distributor_id
JOIN (
SELECT
ma.movie_id,
JSON_ARRAYAGG(
JSON_OBJECT(
"actorId", a.id,
"name", a.name
)
) actorList
FROM actors a
JOIN movies_actors ma ON a.id = ma.actor_id
GROUP BY ma.movie_id
) actors ON actors.movie_id = m.id
WHERE d.business_name = "Nolan Unlimited" AND m.rate = (SELECT MAX(rate) FROM movies)
GROUP BY m.id728x90
'DataBase > MySQL' 카테고리의 다른 글
| [MySql] 이미 존재하는 row의 속성을 새로 입력하고 싶다면? (0) | 2023.04.06 |
|---|---|
| [MySql] GROUP BY, max()를 활용한 문제 풀이 (0) | 2023.03.25 |
| [MySql] mysql을 실행하려고 했을 때 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 에러 문구가 나온다면 (0) | 2023.03.25 |
| [MySql] 명령어 정리 - DDL (Data Definition Language) 쿼리문 (0) | 2023.03.24 |
| [MySql] 2개 이상 여러 Table을 Join하기 - 개념 정리 (0) | 2023.03.21 |