티스토리 뷰

Database

[SQL] 서브쿼리(Sub-Query)

쩨리쩨리 2018. 4. 25. 13:29
반응형

* 서브쿼리(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

 

 

- 결과

 

 

 

반응형
댓글
공지사항