요르딩딩

SQL강의 - 6 (서브쿼리, 집합연산) 본문

[Web]/[DB & Mybatis]

SQL강의 - 6 (서브쿼리, 집합연산)

요르딩딩 2022. 6. 14. 21:54
728x90
반응형

서브쿼리

1. 쿼리문 내에 또 다른 쿼리문이 있는 형태
2. 서브쿼리는 메인쿼리에 포함되는 관계
   - ()를 사용해 감싸는 형태
   - ORDER BY를 사용하지 못한다.
3. 사용가능한 위치
   - select/ from/ where/ having/ order by
   - values(insert)/ set(update)
4. 종류
   - 단일행 서브쿼리
   - 다중행 서브쿼리
   - 다중컬럼 서브쿼리

단일행 서브쿼리
   1. 결과가 레코드 하나인 서브쿼리
   2. 일반 연산자 (=, >, <, ...)

다중행 서브쿼리
   1. 결과가 레코드 여러 개인 서브쿼리
   2. 다중행 연산자 (IN, ALL, ANY, EXISTS) 사용

멀티컬럼 서브쿼리
   1. 결과가 컬럼 여러 개인 서브쿼리

다중행 연산자

ALL
1. 여러 개의 레코드의 AND효과 (가장 큰 값보다 큰)
2. Population > ALL (select Population)

ANY
1. 여러 개의 레코드의 OR효과(가장 작은 값보다 큰)
2. Population > ANY(select Population)

IN/ EXISTS
1. 결과값 중에 있는 것 중에서의 의미
2. IN은 전체 레코드를 스캔하고, EXISTS는 존재여부만 확인하고 스캔하지 않음 (상대적으로 속도 빠름)
3. 존재하는 TRUE/ 존재하지 않으면 FALSE

집합연산

1. 각종 집합연산 지원
2. 합집합(UNION), 교집합(INTERSECT), 차집합(MINUS)...
3. MYSQL은 INTERSECT/ MINUS는 지원하지 않음

UNION
1. 두 쿼리의 결과값을 합쳐서 리턴함
2. select 쿼리1 UNION select 쿼리2 UNION ...
3. 두 쿼리의 결과 형식이 동일해야 함 (기본적으로 DISTINCT적용)
4. 다른 테이블이라도 결과값의 형식만 일치하면 됨 

UNION ALL 
1. 중복을 허용하는 UNION
2. select 쿼리1 UNION ALL select 쿼리2 UNION ...

INTERSECT 
1. 두 쿼리의 결과값 중 공통값을 찾아서 리턴함
2. select 쿼리1 INTERSECT select 쿼리2
3. 두 쿼리 결과 형식이 동일해야함 (기본적으로 DISTINCT적용)
4. 다른 테이블이라도 결과값의 형식만 일치하면 됨 

MINUS/ EXCEPT
1. 쿼리1 결과값에서 쿼리2 결과값을 빼서 리턴함
2. select 쿼리1 MINUS select 쿼리2

- MySQL은 INTERSECT/ MINUS는 지원하지 않음
- 다른 쿼리로 대체해서 사용해야함
SQL언어는 비절차적언어이기 때문에 서브쿼리가 발달했다고 볼 수 있다.
서브쿼리는 장점도 있지만 지나치게 쿼리가 길어지면 읽기가 어려운 문제가 있습니다.
728x90
반응형
Comments