용어 뜻:
출처:
SubQuery란 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL문을 말한다.
서브쿼리는 메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.
1
2
3
4
5
6
7
|
#메인 쿼리
SELECT =
FROM DB_TABLE
WHERE TABLE_FK IN(
#서브 쿼리
SELECT TABLE_FK FROM DB_TABLE OTHER WHERE ...
)
| cs |
조인은 조인에 참여하는 모든 테이블이 대등한 관계에 있기 때문에 조인에 참여하는 모든 테이블의 컬럼을
어느 위치에서라도 자유롭게 사용할 수 있다.
그러나 서브쿼리는 메인쿼리의 컬럼을 모두 사용할 수 있지만, 메인 쿼리는 서브쿼리의 컬럼을 사용할 수 없다.
조인은 집합간의 곱의 관계이다.
따라서 1:1 관계 테이블이 조인하면 1(=1*1) 레벨의 집합이 생성되고
1:M 관계가 조인하면 M(=1*M) 레벨의 집합이 된다.
그리고 M:N 관계의 테이블이 조인하면 MN 레벨의 집합이 된다.
그러나 서브쿼리는 서브쿼리 레벨과는 상관없이 항상 메인쿼리 레벨로 결과 집합이 생성된다.
조인쿼리와 서브쿼리 방식을 상황에 맞게 사용하는 것이 중요하다.
1. 서브쿼리를 사용할 때 주의할 점
1) 서브쿼리를 괄호로 감싸서 사용한다.
2) 서브쿼리는 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능하다.
3) 서브쿼리에서는 ORDER BY를 사용하지 못한다.
2. 서브쿼리가 사용이 가능한 곳
SELECT
FROM
WHERE
HAVING
ORDER BY
INSERT 문의 VALUES
UPDATE 문의 SET
3. 서브쿼리의 종류
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
1) 단일행 서브쿼리(SINGLE ROW SUBQUERY)
SELECT *
FROM PLAYER
WHERE TEAM_ID = (
SELECT TEAM_ID
FROM PLAYER
WHERE PLAYER_NAME = "PLAYER1"
)
ORDER BY TEAM_NAME;
2) 다중행 서브쿼리(MULTIPLE ROW SUBQUERY)
SELECT *
FROM TEAM
WHERE TEAM_ID IN(
SELECT TEAM_ID
FROM PLAYER
WHERE PLAYER_NAME = "PLAYER2"
)
ORDER BY TEAM_NAME;
3) 다중컬럼 서브쿼리(MULTI COLUMN SUBQUERY)
SELECT
FROM PLAYER
WHERE (TEAM_ID, HEIGHT) IN(
SELECT TEAM_ID, MIN(HEIGHT)
FROM PLAYER
GROUP BY TEAM_ID
)
ORDER BY TEAM_ID, PLAYER_NAME;
| cs |
4. 위치에 따라 사용되는 서브쿼리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
1) SELECT 절에서 사용되는 서브쿼리
SELECT PLAYER_NAME, HEIGHT,(
SELECT AVG(HEIGHT)
FROM PLAYER P
WHERE P.TEAM_ID = X.TEAM_ID) AS AVG_HEIGHT
) AS AVG_HEIGHT
FROM PLAYER X
2) FROM 절에서 사용되는 서브쿼리
FROM 절에서 사용되는 서브쿼리를 인라인 뷰(INLINE VIEW) 라고 한다.
FROM 절에는 케이블명이 오도록 되어 있다.
그런데 서브쿼리가 FROM절에 사용되면 뷰(VIEW)처럼 결과가 동적으로 생성된 테이블로 사용할 수 있다.
임시적인 뷰이기 때문에 데이터베이스에 저장되지는 않는다.
또한 인라인 뷰로 동적으로 생성된 테이블이어서 인라인 뷰의 컬럼은 자유롭게 참조가 가능하다.
SELECT T.TEAM.NAME, P.PLAYER_NAME, P.HEIGHT
FROM PLAYER T, (
SELECT TEAM_ID, PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE POSITION = 'MF')P
WHERE P.TEAM_ID = T.TEAM_ID;
3) WHERE 절에서 사용되는 서브쿼리
SELECT PLAYER_NAME
FROM PLAYER
WHERE TEAM_ID IN(
SELECT TEAM_ID
FROM TEAM
WHERE TEAM_COUNTRY = 'KOR'
)
| cs |
SubQuery, 2016-10-27, http://snowple.tistory.com/360
댓글
댓글 쓰기