본문 바로가기
SQL/프로그래머스 SQL 스터디 2기

[프로그래머스 SQL 스터디 2기] 4주 차 TIL/후기

by codeok 2022. 3. 29.
반응형

 

4주 차는 DB에서 정말 중요한 집합조인에 대해서 학습했다.

 

집합

집합 연산자에는 합집합(UNION), 교집합(INTERSECT), 차집합(DIFFERENCE), 카티션 프로덕트(Catesian Product)가 존재한다.

 

  1. Union Compatible(합병가능) 제약 조건이란?
  2. UNION과 UNION ALL의 차이점은?

 

Union Compatible(합병가능) 제약 조건이란?

집합에서 합집합, 교집합, 차집합을 하기 위한 필수 조건을 Union Compatible 제약 조건이라고 한다.

 

첫 번째, 컬럼의 개수는 동일해야 한다.

두 번째, 동일 위치 컬럼은 데이터 타입이 상호 호환 가능해야 한다.

 

UNION과 UNION ALL의 차이점은?

UNION과 UNION ALL은 둘 다 합집합이다.

 

UNION은 합집합인데 중복을 제거하고 출력한다.

UNION ALL은 중복을 제거하지 않고 전부(ALL) 출력한다. 

 

 

조인

조인이란 서로 다른 테이블을 연결해서 사용하는 방법이다.

기본키와 외래 키의 조건이 서로 일치하는 테이블들을 이어 붙이는 방법이다.

 

  1. WHERE절 조인과 FROM절 조인의 차이점은?
  2. JOIN ON절과 USING 절의 차이점은?

 

WHERE절 조인과 FROM 절 조인의 차이점은?

WHERE 절 조인은 INNER JOIN 연산만 가능하고, 검색 조건과 조인 조건이 같이 존재한다.

 

FROM 절 조인은 INNER, NATURAL, OUTER, CROSS JOIN 모두 가능하고, 검색 조건은 WHERE 절에 나오고, 조인 조건은 FROM 절로 분리되어 있다.

 

예제) 직원의 직책이 'Sales Rep'인 직원 아이디, 직원 직책, 고객 이름 검색하기
 
WHERE 절 조인

하단에 검색조건과 조인 조건이 혼재한다.

WHERE 검색 조건으로 튜플을 필터링을 먼저 진행해서 조인의 연산을 줄일 수 있다는 장점이 있지만, 검색조건이 많아지고 코드가 길어지면 가독성이 떨어지고 다른 OUTER, SELF 조인등을 사용하지 못한다는 단점이 있다. 

SELECT	employeeId,
        jobTitle,
        name
FROM    employees E,
        customers C 
WHERE   jobTitle = 'Sales Rep'       -- 검색조건
AND     E.employeeId = C.SalesRepId; -- 조인조건

 

FROM 절 조인

조인 조건과 검색조건이 WHERE에 같이 있지 않고, 조인조건은 FROM 절, 검색조건은 WHERE에 나눠져 있다.

조인조건과 검색조건을 명시적으로 분리해서 가독성 있게 작성이 가능하다.

 

단점으로는 WHERE 절 조인처럼 먼저 필터링해주지 않아서 조인의 연산이 증가할 수 있다.

대안으로는 CTE 방법을 사용해서 해결이 가능하다.

SELECT	employeeId,
        jobTitle,
        name
FROM    employees E INNER JOIN customers C
        ON E.employeeId = C.SalesRepId -- 조인조건
WHERE   jobTitle = 'Sales Rep'         -- 검색조건

 

CTE 사용으로 튜플 필터링

employees 테이블의 jobTitle = 'Sales Rep'인 테이블을 WITH 구문으로 employeesTemp로 생성한다.

필터링한 직원 테이블과 고객 테이블을 연산한다.

 

꼭 이렇게 해야 하는가? 라고 할 수도 있다. 데이터가 적다면 그냥 WITH 구문 없이 해도 상관없을 것이다.

그렇지만, 데이터가 1만 또는 1억 개라고 가정을 한다면 조인의 연산의 수는 기하급수적으로 늘어난다.

성능을 고려한다면 CTE를 사용해서 해결한다. 

WITH employeesTemp AS 
(
   SELECT   employeeId,
            jobTitle
   FROM     employees
   WHERE    jobTitle = 'Sales Rep'     -- 검색조건
)
SELECT   employeeId,
         jobTitle,
         name
FROM     employeesTemp E INNER JOIN customers C
         ON E.employeeId = C.SalesRepId -- 조인조건

 

JOIN ON절과 USING절의 차이점은?

FROM 절 조인에서 테이블의 조인 조건 사용 방법은 ON 절USING 절이 있다.

 

ON 절은 두 개의 컬럼이 다를 때 또는 같을 때 사용이 가능하다.

조인 조건의 두 개의 컬럼이 모두 출력된다.

 

USING 절은 두 개의 컬럼이 같을 때 가능하다.

조인 조건의 공통된 컬럼인 하나만 출력된다. NATURAL JOIN과 같다.(A.studenId = B.studentId)

 

예제) 고객 테이블과 주문 테이블을 JOIN 후 모두 출력
 
ON 절

조인을 ON 절에서 하면 조인 조건에서 비교한 컬럼들이 같이 나온다.

ON 절은 같은 기본키와 외래 키를 구별해주기 위해 앞에 Alias를 붙여서 구분해서 사용한다.

SELECT   *
FROM     customers C 
         JOIN payments P ON C.customerId = P.customerId

 

 
USING 절

ON 절과는 다르게 조인 조건에서 사용된 customerId 컬럼 하나만 가장 앞에 나온다.

 

SELECT   *
FROM     customers C 
         JOIN payments P USING(customerId)

 

 

 

 

TIL : 집합과 조인 

 

4주차 TIL : 집합과 조인

오늘은 집합과 다중 테이블 검색문인 조인에 대해서 TIL을 진행한다.

www.notion.so

 

 

4주 차 후기 

해당 포스팅에서는 셀프 조인에 대해서 다루지 않았지만, 개인적으로 조인 중에서 셀프조인이 가장 어려웠다.

자기 자신을 참조하는 부모/자식 간의 테이블의 관계를 천천히 따져가며 학습하도록 하자.

 

해당 주차를 진행하면서 단테님 SQL도 다른 사람이 읽기 좋게! 즉, 가독성 있게 작성하는 것도 중요하다고 하셨다.

 

나만 알아볼 수 있는 코드가 아니라, 다른 사람이 읽기 좋은 코드를 작성하자.

 

이제 조인이라는 큰 산에 조금이나마 올라왔다. 다음 시간은 조금 더 높은 산인 서브쿼리DDL 무결성 제약 조건에 대해서 학습한다.

반응형