SQL 첫걸음(ch31. 집합 연산 ~ ch32. 테이블 결합)

김도형·2022년 10월 17일
0

31장 집합 연산

관계형 데이터 모델은 수학의 집합론을 따른다.

UNION(합집합)

합집합의 기능하면 단 사용 조건이 있다.

  • 열 개수와 자료형이 서로 같아야함.
  • 단, 열을 따로 지정하여 열 개수와 자료형을 맞춰준다면 UNION 사용 가능
  • 합집합은 중복제거 기능도 가지기 떄문에 UNION DISTINCT라는 문법은 사용 불가

합집합은 나열 순서에 여향을 주지않고, SELECT 순서에 맞게 결과값들이 달라진다.

UNION + ORDER BY

ORDER BY를 지정할 때 마지막 SELECT 명령에만 저장한다.

SELECT a FROM samlple71_a
UNION
SELECT b FROM sample71_b ORDER BY b; 

UNION ALL

합집합의 개념인데, 단순히 중복제거를 하지 않는 기능을 가짐.

UNION ALL vs UNION 성능 차이

UNION ALL 성능이 더 좋다.
그 이유는 중복처리 작업을 해주지 않기 때문이다.

교집합과 차집합

MySQL에서는 적용이 안되고, Orcale에서는 적용 가능한 예약어가 존재한다.
[Oracle]

  • 교집합 : INTERSECT
  • 차집합 : EXCEPT

32장 테이블 결합

곱집합와 교차결합

아래와 같이 행렬에서 곱하는 것와 같다.

그러면 곱집합을 활용해서 SQL에서는 교차결합이라고 하는데
아래와 같이 구현된다.

출처 : SQL 첫걸음 아사이 아츠시 지음 [한빛미디어] p.287

FROM 구에서 복수의 테이블을 지정하면 교차결합한다.
또한 결합은 열(가로)방향으로 확대된다.

데이터 확대 방향

UNION -> 세로방향

FROM 교차결합 -> 가로방향

내부결합

교차결합을 할 경우 데이터의 양이 커지게 때문에, 내부결합을 자주 사용

순서는,

  • FROM 구에 테이블을 복수 지정해 가로 방향으로 테이블을 결합
  • 교차결합을 하면 곱집합으로 계산
  • WHERE 조건을 지정해 곱집합에서 필요한 조합만 검색

INNER JOIN으로 내부 결합

위 내부결합은 구식방법으로 주로 INNER JOIN을 많이 사용한다.

[문법(별명 없는 경우)]

SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건 

[문법(별명 있는 경우)]

SELECT * FROM 테이블명1 [별명1] INNER JOIN 테이블명2 [별명2] ON 결합조건 

예시

SELECT S.상품명, M.메이커명 
FROM 상품2 S INNER JOIN 메이커 M 
ON S.메이커코드 = M.메이커코드
WHERE S.상품분류 ='식품료';

외부키와 기본키

두 개의 테이블의 외부키와 기본키의 관계에 대해 일대다, 다대일, 일대일 등 관계를 아는 것이 중요

외부결합

외부결합은 어느 한쪽에만 존재하는 데이터행을 어떻게 다룰지 변경하는 결합 방법

예제로 상품 테이블과 재고수 테이블이 있는데 변경사항으로

  • 상품 테이블에는 상품코드 9 행이 추가되고,
  • 재고수 테이블에는 상품코드 9 행이 추가 되지 않음.

INNER JOIN 쿼리문을 실행되면 어떻게 될까?

SELECT S.상품명, M.메이커명 
FROM 상품2 S INNER JOIN 메이커 M 
ON S.메이커코드 = M.메이커코드
WHERE S.상품분류 ='식품료';

결과

상품4의 결과값은 나오지 않음.
재고수 테이블에는 상품코드 9 행에 대한 데이터가 없기 때문이다.

그럼 외부결합은 아까 설명한거 와 같이 설명했는데, 어느 한쪽을 상품 테이블에 만 존재하는 데이터행을 다룰려고 한다.

외부결합은 어느 한쪽에만 존재하는 데이터행을 어떻게 다룰지 변경하는 결합 방법

[LEFT JOIN]

SELECT S.상품명, M.메이커명 
FROM 상품2 S LEFT JOIN 메이커 M 
ON S.메이커코드 = M.메이커코드
WHERE S.상품분류 ='식품료';

상품4에 대한 결과값은 나오지만 아직 재고수 테이블에는 해당 데이터가 없기 때문에 NULL 출력.

RIGHT JOIN 도 사용 가능한다. LEFT JOIN과의 차이는 단순히 방향의 차이다.
[RIGHT JOIN]

SELECT S.상품명, M.메이커명 
FROM 메이커 M RIGHT JOIN 상품2 S 
ON S.메이커코드 = M.메이커코드
WHERE S.상품분류 ='식품료';

해당 쿼리를 사용해도 LEFT JOIN과 같은 결과가 나온다.

출처 : SQL 첫걸음 아사이 아츠시 지음 [한빛미디어]

profile
3년간 웹/앱, 자동제어 QA 🔜 개발자로 전향하여 현재 교육 회사에서 백엔드 개발자로 근무 중입니다.(LinkedIn : https://www.linkedin.com/in/dohyoung-kim-5ab09214b)

0개의 댓글