서브쿼리
| 기준 | 유형 |
|---|---|
| 서브쿼리 위치 | SELECT절, WHERE절, FROM절(→ Inline View) |
| 결과 칼럼/행의 수 | 단일행 서브쿼리 / 다중행 서브쿼리, 단일칼럼 서브쿼리 / 다중칼럼 서브쿼리 |
| 메인 쿼리와의 연관성 | 연관(상관) 서브쿼리 / 비연관 서브쿼리 |
| 서브쿼리 종류 | 설명 |
|---|---|
| Single Row (단일행) | 서브쿼리 실행 결과가 1건 이하의 행을 반환. 단일행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용 |
| Multi Row (다중행) | 서브쿼리 실행 결과가 여러 건의 행을 반환 가능. 다중행 비교 연산자(IN, ALL, ANY, SOME, EXISTS)와 사용 |
| Single Column (단일칼럼) | 서브쿼리 실행 결과가 하나의 칼럼을 반환 |
| Multi Column (다중칼럼) | 서브쿼리 실행 결과가 여러 칼럼을 반환. 메인쿼리의 비교 연산 시, 칼럼 개수와 위치가 일치해야 함 |
다중행 서브쿼리 (Multi-Row Subquery)
다중행 서브쿼리는 서브쿼리의 결과가 2건 이상의 행을 반환할 가능성이 있을 때 사용됩니다. 주로 여러 행을 비교하기 위해 사용되는 연산자와 함께 쓰인다.
| 연산자 | 설명 |
|---|---|
| IN | 서브쿼리 결과 중 하나라도 일치하면 참으로 판단 (Multiple OR 조건) |
| ALL | 서브쿼리의 모든 값을 만족해야 하는 조건 |
| ANY/SOME | 서브쿼리의 어느 하나의 값이라도 만족하면 되는 조건 (ANY = SOME) |
| EXISTS | 조건을 만족하는 값이 존재하는지 여부를 확인 |
IN 연산자 예시
SELECT PLAYER_NAME, HEIGHT, BACK_NO
FROM PLAYER
WHERE HEIGHT IN (SELECT HEIGHT FROM PLAYER WHERE BACK_NO = 15);
ALL 연산자 예시
SELECT PLAYER_NAME, HEIGHT, BACK_NO
FROM PLAYER
WHERE HEIGHT > ALL (SELECT HEIGHT FROM PLAYER WHERE BACK_NO = 15);
ANY 연산자 예시
SELECT PLAYER_NAME, HEIGHT, BACK_NO
FROM PLAYER
WHERE HEIGHT >= ANY (SELECT HEIGHT FROM PLAYER WHERE BACK_NO = 15);
EXISTS 연산자 예시
SELECT PLAYER_NAME, HEIGHT, BACK_NO
FROM PLAYER
WHERE EXISTS (SELECT 1 FROM PLAYER WHERE BACK_NO = 15);
SELECT 1을 사용해 간단히 존재 여부만 확인한다.연관 서브쿼리의 특징
- 메인쿼리의 칼럼이 서브쿼리에서 사용된 쿼리
- 비연관 서브쿼리: 서브쿼리에서 메인쿼리의 칼럼을 사용하지 않음
- 메인쿼리가 먼저 수행되고, 그 후에 서브쿼리가 수행됨
- 테이블의 별칭을 이용하여 메인 쿼리에서 서브쿼리로 정보 전달
- 서브쿼리가 메인쿼리의 값을 이용한 후, 서브쿼리의 결과를 메인쿼리가 이용- 서브쿼리에서 메인쿼리의 칼럼과 서브쿼리의 칼럼 간 비교가 이루어짐
- 메인쿼리에서는 서브쿼리의 칼럼을 사용할 수 없음
뷰(View)
뷰 생성 예시
CREATE VIEW V_PLAYER_TEAM AS
SELECT P.PLAYER_NAME, P.BACK_NO, P.TEAM_ID, T.TEAM_NAME
FROM PLAYER P INNER JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID;
뷰의 확인
SELECT * FROM USER_VIEWS;
뷰의 장점
독립성
테이블 구조가 변경되어도 뷰만 변경하면 되므로 응용 프로그램에 영향이 적음
예: PLAYER와 TEAM 테이블이 변경되어도 V_PLAYER_TEAM 뷰가 수정되면 응용 프로그램 변경 불필요
편리성
복잡한 쿼리를 뷰로 생성하여, 질의의 가독성을 높일 수 있음
보안성
민감한 정보(예: 급여 정보 등)를 제외한 뷰를 생성하여, 사용자로부터 중요한 데이터를 보호할 수 있음
인라인 뷰 (Inline View)
FROM 절에서 사용되는 서브쿼리임
실행 순간에만 임시적으로 생성되며 DB에 저장되지 않음
인라인 뷰의 SELECT문에서 정의된 칼럼은 메인 쿼리에서 사용 가능