티스토리 뷰
* 서브쿼리(Sub-Query)
- SQL 문장 안에서 보조로 사용되는 또 다른 SELECT문을 의미한다.
- 최종 결과를 출력하는 쿼리를 메인 쿼리라고 한다면, 이를 위한 중간 단계 혹은 보조 역할을 하는 SELECT문을 서브 쿼리라 한다.
- 하나의 SQL문을 기준으로 메인 쿼리를 제외한 나머지 모든 SELECT문을 서브쿼리로 보면 된다.
- 서브쿼리는 메인쿼리가 실행되기 이전에 한 번만 실행된다.
- 서브쿼리는 여러 개를 사용할 수 있다.
- 서브쿼리가 가지는 장점은 한 번 디스크에서 읽어온 데이터를 메모리 안에서 가공해서 사용할 수 있도록 도와주는 것이다. 즉, 동일한 데이터를 다시 한번 이용하여 복잡한 가공에도 물리적인 I/O를 줄여준다.
- 서브 쿼리는 SELECT, FROM, WHERE 절 모두 사용가능하며, INSERT, UPDATE, MERGE, DELETE 문에서도 사용가능하다.
* 서브쿼리 사용시 주의사항
- 반드시 WHERE절에, 비교연산자의 오른쪽에 위치해야 한다.
- 서브쿼리라는 것을 알리기 위해 괄호로 묶어야 한다.
- 서브쿼리 절 안에 Order by 절이 들어가면 안된다.
* 서브쿼리 종류
1. 단일 행 서브쿼리(스칼라 서브쿼리)
- 가장 기본적인 서브쿼리로서, '=' 연산자를 사용한 서브쿼리이다.
2. 다중행 서브쿼리(멀티-로우 서브쿼리)
- 서브쿼리에서 반환되는 결과 행이 하나 이상일 때 사용하는 서브쿼리이다.
- 다중행 비교 연산자 사용이 가능하다
3. 다중컬럼 서브쿼리
- 하나 이상의 컬럼을 메인쿼리로 반환한다.
4. 상호관련 서브쿼리
- 서브쿼리와 메인쿼리 간에 결과값을 서로 주고받는 식으로 처리되는 서브쿼리이다.
* 서브쿼리 기본형태
1. 특정 조건으로 데이터를 검색하는 서브쿼리를 만들어보자.
- 테이블 생성
- 테이블에서 키가 200보다 작은 사람들만 출력해보자.
- 기본문법
1 |
SELECT Name, height FROM SUbQUERY WHERE height <200; |
cs |
- 이름이 '조성규'인 사람의 키보다 작은 사람들만 출력해보자.
- 서브쿼리 문
1
2 |
SELECT name,height FROM SUBQUERY
WHERE height<(SELECT height FROM SUBQUERY WHERE name ='조성규'); |
cs |
- 기본문법, 서브쿼리문 결과
- 결과는 기본문법과 서브쿼리문 둘다 같게 나오지만, 서브쿼리문은 조건을 하나 더 넣어서 사용자가 원하는 조건에 더 세부적으로 가깝게 가공할 수 있다.
2. ANY
- ANY는 서브쿼리의 여러 개의 결과 중 한 가지만 만족한다.
- 즉, ANY는 OR같이 하나만 조건이 충족해도 전부 출력해준다.
- ANY 기본형태
1
2
3
4 |
SELECT [칼럼명] , [칼럼명] FROM [테이블명]
WHERE [칼럼명] >=ANY(SELECT [칼럼명]
FROM [테이블명] WHERE NAME=‘제리');
|
cs |
- ANY 예시
- 주소가 '해병대'인 사람들의 키보다 크거나 같은 경우의 사람들을 모두 출력하시오.
1
2 |
SELECT name , height FROM SUBQUERY
WHERE height >= ANY (SELECT height FROM SUBQUERY WHERE addr='해병대'); |
cs |
- ANY 결과
- 풀이
- 해병대인 사람은 조성규와 심준식 둘인데, ANY 조건은 조성규보다 키가 크거나, 심준식보다 키가 크면 출력될 수 있다.
3. ALL
- ALL은 서브쿼리의 여러 개의 결과를 모두 만족한다.
- 즉, ALL은 AND같이 조건이 모두 만족해야만 출력해준다.
- ALL 기본형태
1
2
3
4 |
SELECT [칼럼명] , [칼럼명] FROM [테이블명]
WHERE [칼럼명] >= ALL (SELECT [칼럼명]
FROM [테이블명] WHERE NAME=‘제리');
|
cs |
- ALL 예시
- 주소가 '해병대'인 사람들의 키보다 크거나 같은 경우의 사람들을 모두 출력하시오.
1
2 |
SELECT name , height FROM SUBQUERY
WHERE height >= ALL (SELECT height FROM SUBQUERY WHERE addr='해병대'); |
cs |
- ALL 결과
- 풀이
- 해병대인 사람은 조성규와 심준식 둘인데, ALL 조건은 조성규보다 키가 크고 심준식보다 키가 크면 출력될 수 있다.
- 여기서 조성규는 키가 200이고, 심준식은 키가 182라서 키가 더 큰 조성규의 키를 기준으로 잡아야한다.
- 조성규의 키가 200이니 키가 200보다 크거나 같은 사람들만 출력된다.
* 서브쿼리 예제
1. 문제1
- '방명광'보다 키가 큰 사람들의 이름과 키가 출력되도록 서브쿼리문을 작성하시오.
- 풀이
1
2 |
SELECT NAME, HEIGHT FROM SUBQUERY
WHERE HEIGHT>(SELECT HEIGHT FROM SUBQUERY WHERE NAME='방명광'); |
cs |
- 결과
2. 문제2
- 주소(ADDR)가 부산인 사람들과 테이블의 키를 비교하여 키가 200 초과된 사람이 출력되도록 서브쿼리문을 작성하시오.
- 풀이
1
2 |
SELECT NAME, HEIGHT FROM SUBQUERY
WHERE HEIGHT> ALL(SELECT HEIGHT FROM SUBQUERY WHERE ADDR='부산'); |
cs |
- 결과
3. 문제3
- 주소가 부산인 사람들 중 가장 작은 값(180) 보다 큰 키를 가진 사람의 이름과 키를 출력하고, 내림차순으로 정렬하시오. 이때, ANY와 MIN을 사용하시오.
- 풀이
1
2 |
SELECT NAME, HEIGHT FROM SUBQUERY
WHERE HEIGHT> (SELECT MIN(HEIGHT) FROM SUBQUERY WHERE ADDR='부산') ORDER BY HEIGHT DESC; |
cs |
- 결과
'Database' 카테고리의 다른 글
[SQL] 조인(JOIN) (0) | 2018.04.24 |
---|---|
[SQL] 제약조건 변경, 제약 비활성화,CASCADE (0) | 2018.04.24 |
[SQL] 무결성, 제약조건 (3) | 2018.04.24 |
[SQL] 키(슈퍼키,대체키,후보키,기본키,외래키) (8) | 2018.04.24 |
[SQL] Transaction(트랜잭션) (1) | 2018.04.24 |