[SQLD] 집합 연산자

younghyun·2023년 6월 7일
0

SQLD

목록 보기
8/18

조인을 사용하지 않고 연관된 데이터를 조회하는 방법
집합 연산자는 여러 질의의 결과를 연결하여 하나로 결합하는 방식 사용

UNION: 합집합
UNION ALL: 합집합이면서 중복된 행도 그대로 표시
INTERSECT: 교집합
EXCEPT: 차집합(앞-뒤)

INTERSECT

// PLAYER 중 소속이 K02인 선수들이면서 골키퍼인 선수들의 집합의 교집합 
// 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;

// EXISTS를 사용
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;

// IN 서브쿼리를 사용
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;

[82번] UNION ALL

SELECT ENAME AAA, JOB AAB
...
UNION ALL
SELECT ENAME BBA, JOB BBB
...

UNION ALL을 사용하는 경우 컬럼은 첫번째 SQL 모듈 기준으로 표시된다.
따라서 AAA와 AAB를 사용한다.

[83번] UNION ALL과 UNION

...
UNION ALL  // 위의 결과를 모두 더한다
...
UNION    // 위의 결과의 합집합을 실행한다
...

UNION을 실행하는 과정에서 UNION ALL에서 만들어졌던 중복이 모두 제거된다.

profile
🌱 주니어 백엔드 개발자입니당

0개의 댓글