eunzae's develog
[SQL] 서브쿼리 심화 본문
동작하는 방식에 따른 서브쿼리 분류
연관 서브쿼리
- 메인쿼리의 컬럼이 서브쿼리에 포함되며, 메인쿼리의 컬럼은 서브쿼리에 특정 조건으로 사용
연관 서브쿼리 예시: 본인이 속한 반의 평균 점수보다 높은 점수를 받은 학생 출력
SELECT student_id, class_id, student_name, score
FROM student a
WHERE score > (SELECT AVG(score) FROM student b WHERE b.class_id = a.class_id)
;
비연관 서브쿼리
- 메인쿼리의 컬럼이 서브쿼레이 포함되지 않으며, 주로 메인 쿼리에 특정한 값을 제공할 때 사용
비연관 서브쿼리 예시: EUNJAE가 속한 반의 평균 점수를 출력한다
SELECT AVG(score)
FROM student
WHERE class_id = (SELECT class_id FROM student WHERE student_name = 'EUNJAE')
반환되는 데이터 형태에 따른 서브쿼리 분류
단일 행 서브쿼리
- 서브쿼리 결과가 한개의 행을 반환하며, 단일 행 비교연산자(=,<,>,<= ,>=)와 같이 사용됨
다중 행 서브쿼리
- 서브쿼리의 결과가 두 개 이상의 행을 반환할 수 있으며, 다중 행 비교연산자(IN, ALL, ANY, EXISTS)와 같이 사용됨
특징 | 설명 |
IN | 서브쿼리 결과에 존재하는 값들 중 하나와 일치해야 함 |
EXISTS | 서브쿼리 결과 값이 존재하는지 여부를 확인 |
ALL | 서브쿼리 결과에 존재하는 모든 값들에 대한 조건을 만족해야 함 |
ANY | 서브쿼리 결과에 존재하는 값들 중 조건을 만조갛는 것이 하나 이상 존재해아 함 |
* IN vs EXISTS
- IN: 조건에 해당하는 ROW의 컬럼을 비교하여 체크(IN쿼리 → 메인쿼리)
- EXISTS: 조건에 해당하는 ROW의 존재 유무 체크 후 더 이상 수행하지 않음(메인쿼리 → EXISTS쿼리)
※ 하드코딩일 경우 IN, 서브쿼리 사용할 경우 EXISTS가 성능적으로 유리
다중 컬럼 서브쿼리
- 서브쿼리의 결과가 여러개의 컬럼을 반환하며, 메인쿼리의 조건과 동시에 비교됨
SELECT *
FROM 테이블1
WHERE (컬럼1, 컬럼2) IN(
SELECT 컬럼1, 컬럼2
FROM 테이블2
WHERE 조건)
;
스칼라 서브쿼리
- 하나의 속성을 가지면서, 하나의 행만을 반환하는 쿼리
- SELECT, WHERE, HAVING절 등에서 사용할 수 있음
스칼라 서브쿼리 예시: 반 이름과 반의 구성원 수를 출력
SELECT
class_name,
(SELECT
COUNT(*)
FROM
student s
WHERE s.class_id = c.class_id)
WHERE
class c
;
스칼라 서브쿼리 예시: 전체 학생 중 1학년 학생이 차지하는 비율(DUAL 테이블 사용)
SELECT
(SELECT COUNT(*) FROM student WHERE grade = '1') /
(SELECT COUNT(*) FROM student)
FROM dual
;
'Language > SQL' 카테고리의 다른 글
[SQL]윈도우 함수 (0) | 2022.12.16 |
---|---|
[SQL] VIEW (0) | 2022.12.16 |
[SQL] JOIN 심화 (0) | 2022.12.15 |
[SQL] 계층형 질의 (0) | 2022.12.15 |
[SQL] 집합연산자(UNION, UNION ALL, INTERSECT, EXCEPT) (0) | 2022.12.15 |