바닥코딩
서브쿼리 본문
서브쿼리?
서브 쿼리란 하나의 SQL문 안에 포함되어 있는 또 다른 SQL을 의미합니다 서브쿼리는 알려지지 않은 기준을 이용한 검색을 위해 사용됩니다 또한 하나의 SQL문 안에 포함되어 있는 SQL 이기 때문에 메인쿼리 가 서브쿼를 포함하는 종속적인 관계라 볼 수 있습니다
서브쿼리를 사용하는 이유
서브쿼리도 메인쿼리와 다를 것이 없이 같은 SQL있습니다. 그렇다면 왜 굳이 쿼리를 메인 쿼리와 서브쿼리로 나누어 종속적으로 문장을 작성하는지 알아가야할 필요가 있을 것입니다
첫번째는 알려지지 않은 기준으로 검색을 할 때 용이하다 예를 들어 테이블내에서 조건을 설정하기가 어려워 다른 데이테이블에서 조건을 가져와야할 경우가 있을 수 있어서 서크쿼리를 사용합니다 예를들어 특정 사원이 속해 있는 부서에 같은 소속을 가지고 있는 사원들 검색 한다고 가정을 해봅시다
위와 같은 구조를 가진 테이블에서 DEPARTMENTS의 특정 MANAGER_id가 EMPLOYEES의 MANAGER_ID 와 같은 경우의 행을 출력하는 쿼리문을 작성한다고 생각해보자 이럴 경우에는 조건에 타 테이블의 정보를 가져 오는 것이 간단할 것입니다(조인을 제외하고 생각해 봤을 때)
두번째는 디비에 접근하는 속도를 향상 시킵니다 위에 와 같은 쿼리에서 사실 EQUI 조인이나 LEFT OUTER 조인을 사용한다면 검색이 가능하지만 위와 같이 서브 쿼리를 사용한다면 디비 접속 시간을 줄여 성능을 높일 수 있습니다.
서브쿼리의 규칙 및 종류
- 서브쿼리는 괄호로 감싸서 사용해야 한다
- 서브쿼리는 단일 행(single row), 복수행(multiple row) 비교 연산자와 사용가능하다
- 서브쿼리에는 ORDERBY절을 사용하지 못한다 ORDERBY는 메인쿼리의 문장의 마지막에 하나만 위치할 수 있다
서브쿼리가 사용가능한 곳
- SELECT 절
- FROM 절
- WHERE 절(제일 많이 사용되는 곳)
- HAVING절
- ORDERBY절
- INSERT문의 VALUES 절
- UPDATE문의 SET 절
※ 동장방식에 따른 서브쿼리의 종류
서브쿼리 종류 | 설명 |
비연관 서브쿼리 | 서브쿼리가 메인 쿼리의 칼럼을 가지고 있지 않은 경우 |
연관 서브쿼리 | 서브쿼리가 메인쿼리의 칼럼을 가지고 있는 경우 보통 메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는 확인 하고자 할 때 사용 |
※ 반환 데이터에 따른 서브쿼리의 종류
서브쿼리 종류 | 설명 |
single row 서브쿼리 | 서브쿼리의 결과가 항상 1건 이하인 서브쿼리이며 단일 행 비교 연산자에는 =,<,>,>=,<=,<=,<>가 있다 |
milti row 서브쿼리 | 서브쿼리의 실행 결과가 여러건인 서브쿼리 이며 다중 행 비교 연산자에는 IN,ALL,ANY, SOME,EXISTS가 있다 |
multi column 서브쿼리 | 서브쿼리의 결과로 여러 칼럼을 반환한다 메인쿼리의 조건절에 여러 칼럼을 동시에 비교할 수 있다 대신 서브쿼리와 메인쿼리에서 비교하고자 하는 칼럼의 개수가 와 위치가 동일 해야함 |
예제를 통해 서브쿼리 알아보기
1. single row 서브쿼리
single row 서브쿼리는 위에서 설명했던 예와 동일합니다
MANGER_ID 가 114일 경우 한가지의 값을 반환하기 때문에 single row 서브쿼리라 볼 수 있는데 만약 서브 쿼리에서 114인 값이 여러개일 경우 오류가 발생합니다
2. milti row subquery
먼저 다중 행 연산자들에 대해 알아봅시다
다중 행 연산자 | 설명 |
IN | 서브쿼리에 존재하는 임의의 값과 동일한 조건을 의미한다 |
ALL | 서브쿼리 결과에 존재하는 모든 값을 만족하는 조건을 의미 한다 |
ANY | 서브쿼리의 결과에 존재하는 어느 하느의 값이라도 만족하는 조건 |
EXISTS | 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건 |
위에 쿼리 내용과 달라진 것은 크게 없어 보이지만 WHERE 조건 절에 = 연산자가 IN으로 바뀐 것을 알 수 있다. 이렇게 쿼리를 구상할경우 서브쿼리 MANAGER_ID가 한개의 값이 아닌 여러 값을 반환할 때에도 오류 없이 쿼리를 수행할 수 있습니다
'데이터 베이스 > SQL' 카테고리의 다른 글
윈도우 함수(1/2) (0) | 2020.03.16 |
---|---|
계층형 질의 (0) | 2020.03.12 |
그룹 함수(GROUP FUNCTION) (0) | 2020.03.05 |
STANDARD SQL과 집합 연산자(SET OPERATOR) (0) | 2020.03.04 |
Group by , Having 절 (0) | 2020.03.03 |