일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 파이썬
- 프로그래머스 조건에 맞는 개발자 찾기
- 리스트 컴프리헨션
- sql
- 백준 24499 파이썬
- AWS
- 정규화
- ROWNUM
- SQLD
- SAA-C02
- github
- 백준 크리문자열
- 알고리즘
- 백준 11059
- 백준 1756
- 깃허브
- 데이터베이스
- join
- 백준 2852
- react
- Today
- Total
-
[SQLD] #022 SQL 활용 - 집합 연산자 본문
목차
1. 집합 연산자
2. 집합 연산자의 연산
3. 집합 연산자 예제
1. 집합 연산자 (Set Operator)
두 개 이상의 테이블에서 JOIN을 사용하지 않고 연관된 데이터를 조회하는 방법중에 또 다른 방법은, 집합 연산자를 사용하는 방법이다.
기존의 JOIN에서는 FROM 절에 검색하고자 하는 테이블을 나열하고, WHERE 절에 JOIN 조건을 기술하여 원하는 데이터를 조회할 수 있었다. 하지만 집합 연산자는 여러 개의 질의 결과를 연결하여 하나로 결합하는 방식을 사용한다. 즉, 집합 연산자는 2개 이상의 질의 결과를 하나의 결과로 만들어준다.
일반적으로 집합 연산자를 사용하는 상황은
1. 서로 다른 테이블에서 유사한 형태의 결과를 반환하는 것을 하나의 결과로 합치고자 할때
2. 동일한 테이블에서 서로 다른 질의를 수행하여 결과를 합치고자 할 때
사용할 수 있다.
집합 연산자를 사용하기 위해서는 다음 제약조건을 만족해야 한다.
- SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능해야 한다.
2. 집합 연산자의 연산
집합 연산자는 개별 SQL 문의 결과 집합에 대해 합집합(UNION/UNION ALL), 교집합(INTERSECT), 차집합(EXCEPT)으로 집합간의 관계를 가지고 작업한다.
집합 연산자를 가지고 연산한 결과는 위 그림과 같다.
EXCEPT 연산에서는 순서가 중요하다. 위 그림은 차집합(R1 R2)의 결과는 {5}로 계산했지만, 만약 순서가 바뀌어서 차집합(R2 R1) 이었으면 결과는 {4}가 된다.
집합 연산자를 사용하여 만들어지는 SQL 문의 형태는 다음과 같다.
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블명1
[WHERE 조건식]
[GROUP BY 칼럼(Column)이나 표현식
HAVING 그룹조건식]
집합 연산자
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블명2
[WHERE 조건식]
[GROUP BY 칼럼(Column)이나 표현식
HAVING 그룹조건식]
[ORDER BY 1, 2 [ASC 또는 DESC]];
집합 연산자는 사용상의 제약 조건을 만족한다면 어떤 형태의 SELECT 문이라도 이용할 수 있다.
3. 집합 연산자 예제
예제 1) K리그 소속 선수들 중에서 소속이 삼성 블루윙즈팀인 선수들과 전남 드래곤즈팀인 선수들에 대한 내용을 모두 보고싶다.
-- 합집합을 이용한다.
SELECT TEMP_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER WHERE TEAM_ID = 'K02'
UNION
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER WHERE TEAM_ID = 'K07'
예제 2) K리그 소속 선수들 중에서 소속이 삼성블루윙즈팀인 선수들과 포지션이 골키퍼인 선수들을 모두 보고싶다.
-- 합집합을 이용한다.
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER WHERE TEAM_ID = 'K02'
UNION
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER WHERE POSITION = 'GK'
예제 3) K리그 소속 선수들에 대한 정보 중에서 포지션별 평균키와 팀별 평균키를 알고 싶다.
-- 합집합을 이용한다.
SELECT 'P' 구분코드, POSITION 포지션, AVG(HEIGHT) 평균키
FROM PLAYER GROUP BY POSITION
UNION
SELECT 'T' 구분코드, TEAM_ID 팀명, AVG(HEIGHT) 평균키
FROM PLAYER GROUP BY TEAM_ID ORDER BY 1;
예제 4) K리그 소속 선수들 중에서 소속이 삼성블루윙즈팀이면서 포지션이 미드필더인 선수들의 정보를 보고 싶다.
-- 차집합을 이용한다.
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER WHERE TEAM_ID = 'K02'
MINUS
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER WHERE POSITION = 'MF'
ORDER BY 1, 2, 3, 4, 5;
차집합은 앞의 집합의 결과에서 뒤의 집합의 결과를 빼는 것이기 때문에 이 예제에서 사용했다.
SQL Server에서는 MINUS 대신 EXCEPT 를 사용할 수 있다.
예제 5) K리그 소속 선수들 중에서 소속이 삼성블루윙즈팀이면서 포지션이 골키퍼인 선수들의 정보를 보고싶다.
-- 교집합을 이용한다.
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER WHERE TEAM_ID = 'K02'
INTERSECT
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER WHERE POSITION = 'GK'
ORDER BY 1, 2, 3, 4, 5;
출처
이 글의 내용은 모두 한국데이터베이스진흥원이 출판한 SQL 전문가 가이드 2013 Edition을 기본으로 한다.
'SQLD' 카테고리의 다른 글
[SQLD] #024 SQL 활용 - 서브 쿼리 (0) | 2021.05.10 |
---|---|
[SQLD] #023 SQL 활용 - 계층형 질의와 셀프 조인 (0) | 2021.05.10 |
[SQLD] #021 SQL 활용 - 표준 조인 (0) | 2021.05.06 |
[SQLD] #020 SQL 기본 - JOIN (0) | 2021.05.06 |
[SQLD] #019 SQL 기본 - ORDER BY 절 (0) | 2021.05.05 |