2.2.2 집합 연산자

YJ·2022년 8월 30일
0

2.2.2 집합 연산자

  • 집합연산자 사용 시 여러 개의 질의 결과를 연결하여 하나로 결합함
  • SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 교환 가능하다
  • UNION, INTERSECT, EXCEPT는 중복된 행을 하나의 행으로 만들지만, UNION ALL은 중복된 행을 하나의 행으로 만들어주지 않고, 중복된 결과가 항상 존재한다

합집합

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;
  • WHERE 절에 IN 또는 OR 연산자로도 변환이 가능
  • 결과 행을 구분하기 위해 SELECT 절에 칼럼('구분코드')를 추가할 수 있다는 것을 위 쿼리에서 알 수 있다.
  • 구분코드, 포지션, 평균키라는 칼럼을 가진 결과가 생성되었고, 팀명 대신 포지션이라는 말이 먼저 나왔기에 첫번째 SQL 문에서 사용된 HEADING이 적용되었다.

차집합

  • ORACLE에서는 MINUS가 사용되고 SQL Server에서는 EXCEPT가 사용된다
  • 논리연산자로는 <>가 사용될 수 있다.
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND    POSITION <> 'MF'
ORDER BY 1, 2, 3, 4, 5;

NOT EXISTS 또는 NOT IN 서브쿼리를 이용한 SQL 문으로도 변경 가능

NOT EXISTS

SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM PLAYER X
WHERE TEAM_ID = 'K02'
AND NOT EXISTS(SELECT 1 FROM PLAYER Y 
               WHERE Y.PLAYER_ID = X.PLAYER_ID AND POSITION = 'MF')
ORDER BY 1, 2, 3, 4, 5;

NOT IN

SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND PLAYER NOT IN (SELECT PLAYER_ID FROM PLAYER
                  WHERE POSITION = 'MF')
ORDER BY 1, 2, 3, 4, 5;

교집합

INTERSECT로 표현 가능

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;

논리연산자 AND

SELECT	TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM	PLAYER 
WHERE	TEAM_ID = 'K02'
AND	POSITION = 'GK' 
ORDER	BY 1, 2, 3, 4, 5;

EXISTS 또는 IN 서브쿼리를 이용한 SQL 문으로 변경 가능

SELECT	TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM	PLAYER X 
WHERE	X.TEAM_ID = 'K02' 
    	AND	EXISTS(SELECT 1 
        		   FROM PLAYER Y
				   WHERE Y.PLAYER_ID = X.PLAYER_ID
                   AND Y.POSITION = 'GK') 
ORDER BY 1, 2, 3, 4, 5;
SELECT	TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM PLAYER 
WHERE	TEAM_ID = 'K02' 
    	AND	PLAYER_ID IN(SELECT PLAYER_ID 
        				 FROM PLAYER 
        				 WHERE POSITION = 'GK')
ORDER BY 1, 2, 3, 4, 5;
profile
💻귀찮으니 필요할 때만 쓰는 Computer Vision 일지 ㅇㅇ💻

0개의 댓글