서브쿼리
- 서브쿼리란 쿼리 안의 보조 쿼리를 가리키는 용어로, 가장 바깥쪽의 SELECT 문인 메인쿼리를 기준으로 내부에 SELECT 문을 추가로 작성한다.
- 서브쿼리는 SELECT 문 안쪽에 위치한 SELECT 문이 어느 위치에 작성되었는지에 따라 아래와 같이 구분할 수 있다.
위치 | 이름 |
SELECT 절 | 스칼라 서브쿼리 |
FROM 절 | 인라인 뷰 |
WHERE 절 | 중첩 서브쿼리 |
스칼라 서브쿼리
- 메인쿼리의 SELECT 절에 있는 또 다른 SELECT 절
- 스칼라 서브쿼리의 결과값은 1행 1열의 구조로 출력되어야 하며, 만약 스칼라 서브쿼리의 결과값이 2개 이상 나오면 에러가 발생한다.
- 보통 스칼라 서브쿼리는 출력되는 데이터 건수가 1건이어야 하므로 집계함수(max, min, avg, sum, count 등)와 같이 쓰이는 경우가 많다.
SELECT 이름,
(SELECT COUNT(*)
FROM 학생 AS 학생2
WHERE 학생2.이름 = 학생1.이름) 카운트
FROM 학생 AS 학생2
인라인 뷰
- 메인쿼리의 FROM 절에 있는 또 다른 SELECT 절
- FROM 절 내부에서 일시적으로 뷰를 생성하는 방식으로, 인라인 뷰의 결과는 내부적으로 메모리 또는 디스크에 임시 테이블을 생성하여 활용한다.
SELECT 학생2.학번, 학생2.이름
FROM (SELECT *
FROM 학생
WHERE 성별 = '남') 학생2;
중첩 서브쿼리
- 메인쿼리의 WHERE 절에 있는 또 다른 SELECT 절
- WHERE 절에서 단순한 값을 비교 연산하는 대신, 서브쿼리를 추가하여 비교 연산하기 위해 사용한다.
- WHERE 절에서 중첩 서브쿼리와 비교할 때는 보통 비교 연산자를 비롯해 IN, EXISTS 문을 많이 사용한다.
SELECT *
FROM 학생
WHERE 학번 = (SELECT MAX(학변)
FROM 학생)
서브쿼리와 메인쿼리 관계에 따른 구분
비상관 서브쿼리
- 메인쿼리와 서브쿼리 간에 관계성이 없음을 의미하며, 서브쿼리가 독자적으로 실행된 뒤 메인쿼리에게 그 결과를 넘겨주는 형태
- 비상관 서브쿼리에서는 서브쿼리가 먼저 실행된 뒤에 그 결과를 메인쿼리가 활용한다.
- DB 버전 및 옵티마이저에 따라 서브쿼리가 제거되고 하나의 메인쿼리로 통합되는 뷰 병합, 즉 SQL 재작성이 작동할 수도 있다.
상관 서브쿼리
SELECT *
FROM 학생
WHERE 학번 IN (SELECT *
FROM 학생
WHERE 성별 = '남')
- 메인쿼리와 서브쿼리 간에 관계성이 있음을 의미하며, 서브쿼리가 수행되려면 메인쿼리의 값을 받아야 하므로 서브쿼리와 메인쿼리 사이에 연관성이 존재한다.
- 상관 서브쿼리는 SELECT 절에 작성하는 스칼라 서브쿼리와 WHERE 절에 작성하는 중첩 서브쿼리일 때 발생한다.
- 전체적인 수행 순서는 메인 쿼리 실행 → 서브쿼리 실행 → 메인쿼리 실행 후 결과 출력과 같으며, 이때도 뷰 병합, 즉 SQL 재작성으로 작동할 수도 있다.
반환 결과에 따른 구분
단일행 서브쿼리
- 서브쿼리 결과가 1건의 행으로 반환되는 쿼리로, 메인쿼리의 조건절에서 >, <, = 등의 연산자와 비교한다.
- 단일행 서브쿼리는 스칼라 서브쿼리와 동일하고 생각할 수 있다.
다중행 서브쿼리
- 서브쿼리 결과가 여러 건의 행으로 반환되는 쿼리
- 메인쿼리의 조건절에서는 IN 구문으로 서브쿼리에서 반환되는 값들을 받는다.
다중열 서브쿼리
- 서브쿼리 결과가 여러 개의 열과 생으로 반환되는 쿼리
- 메인쿼리의 조건절에서는 IN 구문과 함께 서브쿼리에서 반환될 열들을 동일하게 나열해 서브쿼리 결과를 받는다.
뷰
- 다른 테이블을 기반으로 만들어지는 가상 테이블로, 논리적으로만 존재하면서 일반 테이블과 동일한 방법으로 사용 가능하다.
- 뷰를 통한 기본 테이블의 내용을 쉽게 겁색할 수는 있지만, 뷰에 대한 삽입/수정/삭제 연산은 기본 테이블의 내용을 자동으로 바꾸기 때문에 제한적으로 이루어진다.
- 뷰를 사용하면 일부 데이터에 대해서만 데이터를 공개하고, 노출에 민감하나 데이터에 대해서는 제약을 설정할 수 있기 때문에 보안 유지에 도움이 된다.
- 또한, 여러 개의 테이블을 병합해서 활용할 때는 성능을 고려한 최적화된 뷰를 생성함으로써 일관된 성능을 제공할 수 있다.
'Computer Science > Database' 카테고리의 다른 글
`이상현상과 정규화 (0) | 2022.02.22 |
---|---|
JOIN의 종류 (0) | 2022.02.19 |
테이블과 키 (0) | 2022.02.19 |
`DB 엔진과 SQL 수행 프로세스 (0) | 2022.02.19 |
`MySQL과 MariaDB (0) | 2022.02.17 |