서브 쿼리(Sub query)는 하나의 쿼리안에 포함되어 있는 또 다른 쿼리문을 말한다.
서브 쿼리는 메인 쿼리가 서브 쿼리를 포함하는 종속적인 관계로, 여러 쿼리를 수행할 결과를 중첩시켜 간편하게 결과을 얻을 수 있다.
또한 아래 같은 특징이 있다.
- 서브 쿼리는 여러개 사용 가능하다.
- 서브 쿼리는 () 를 통해 사용한다.
- 서브 쿼리는 SELECT, FROM, WHERE 절 모두 사용이 가능하며, SELECT를 제외한 INSRT INTO, UPDATE 등에서도 사용이 가능하다.
- 서브 쿼리안에 ORDER BY 절이 들어가면 안된다.
users
| id | name | address |
| 1 | lee | seoul |
| 2 | park | incheon |
| ... | ... | ... |
posts
| id | user_id | content |
| 1 | 1 | side dish |
| 2 | 1 | camera |
| 3 | 2 | computer |
| 4 | 2 | keyboard |
| ... | ... | ... |
SELECT 에서의 서브 쿼리
스칼라 서브쿼리(Scalar subqueries)라고 불린다.
select에서의 서브 쿼리를 쓸 경우, 서브 쿼리의 반환된 값은 하나여야만 한다.
SELECT id, content, (SELECT name from users WHERE users.id = posts.user_id) name
FROM posts;
| id | content | name |
| 1 | side dish | lee |
| 2 | camera | lee |
| 3 | computer | park |
| 4 | keyboard | park |
FROM 에서의 서브 쿼리
인 라인뷰(inline views)라고 불린다.
FROM 절에 사용된 서브쿼리의 결과가 하나의 테이블 처럼 사용된다.
반환 값이 여러개여도 상관 없음
SELECT u.name, p.content, u.address FROM users u,
(SELECT id, user_id, content FROM posts) p
WHERE p.user_id = u.id;
| name | content | address |
| lee | side dish | seoul |
| lee | camera | seoul |
| park | computer | incheon |
| park | keyboard | incheon |
WHERE 에서의 서브 쿼리
일반 서브 쿼리며, WHERE 절에서 사용하여 조건을 걸수가 있다.
SELECT *
FROM POSTS
WHERE user_id IN (SELECT ID FROM users WHERE name = 'lee');
| id | user_id | content |
| 1 | 1 | side dish |
| 2 | 1 | camera |
SELECT나 WHERE에서나 많이 썻지, FROM에서는 많이 써보진 않은거 같은데,
이제서야 정리하면서 개념을 다시 배워간다.
728x90
'SQL' 카테고리의 다른 글
| INSERT INTO SELECT (1) | 2021.06.06 |
|---|---|
| INSERT INTO ... VALUES (0) | 2021.05.30 |
| CHAR_LENGTH (0) | 2021.05.24 |
| DISTINCT (0) | 2021.05.23 |
| SELECT.. FROM.. WHERE (0) | 2021.05.23 |