두 개 이상의 테이블 다루기 - JOIN

hyeh·2022년 8월 8일
0

SQL 기초

목록 보기
4/9

JOIN

  • 관계형 데이터베이스에서는 중복 데이터를 피하기 위해 데이터를 쪼개 여러 테이블로 나눠서 저장한다. 이렇게 분리되어 저장된 데이터에서 원하는 값을 추출하기 위해서는 여러 테이블을 조합할 필요가 있다. 이때 JOIN 연산자를 사용해 원하는 칼럼을 기준으로 행을 합칠 수 있다.
  • 쉽게 할 수 있는 판단 오류. 단순히 FROM 절에 2개 이상의 테이블을 나열하면 레코드 해석이 불가능한 단순 결합이 된다 (예를 들어 테이블 A 아래에 테이블 B의 데이터가 붙는 것 = 세로/열 방향) !!!!
  • JOIN은 가로/행 방향으로 데이터가 결합된다!

샘플 데이터

Book 테이블과 Orders 테이블, Customer 테이블로 구성된 마당 서점의 데이터를 활용했다.

  • Book 테이블
  • Orders 테이블
  • Customer 테이블

일반조인

일반조인 = 내부조인 = 동등조인
일반조인은 조인 조건문에 따라 2개의 테이블의 컬럼을 합쳐 새로운 테이블을 생성한다.

  • 방법1: 결합 조건이 되는 칼럼을 WHERE절에 지정 = 암묵적 표현법
SELECT * -- 속성들
FROM customer, orders -- 테이블1, 테이블 2
WHERE customer.custid = orders.custid; -- 조인조건 AND 검색조건 순으로 작성
  • 방법2: FROM절에 테이블 나열 시 JOIN을 넣어주고, ON으로 결합 조건이 되는 칼럼 지정 = 명시적 표현법
SELECT *
FROM customer JOIN orders -- JOIN 이라고만 하면 INNER JOIN으로 인식한다
	ON customer.custid = orders.custid;
  • 예제1: 고객별로 주문한 모든 도서의 총 판매액을 구하고 고객별로 정렬
SELECT customer.name, SUM(orders.saleprice)
FROM customer JOIN orders
ON customer.custid = orders.custid
GROUP BY 1
ORDER BY 1;
  • 예제2: 고객 이름과 고객이 주문한 도서 이름
-- 고객 이름 : customers 테이블의 name 칼럼
-- 도서 이름 : book 테이블의 bookname 칼럼
-- 연결 : order 테이블의 custid, bookid
SELECT customer.name, book.bookname
FROM customer 
	JOIN orders
	ON customer.custid = orders.custid
    JOIN book
    ON orders.bookid = book.bookid;
-- JOIN과 동일한 값 추출
SELECT customer.name, book.bookname
FROM customer, orders, book
WHERE customer.custid = orders.custid
    AND orders.bookid = book.bookid;
  • 예제3: 가격이 20,000원인 도서를 주문한 고객의 이름과 도서의 이름
-- INNER JOIN 활용 
SELECT customer.name, book.bookname
FROM customer
	JOIN orders
	ON customer.custid = orders.custid
    JOIN book
    ON orders.bookid = book.bookid
WHERE book.price = 20000;
-- 암묵적 표현법 활용
SELECT customer.name, book.bookname
FROM customer, orders, book
WHERE customer.custid = orders.custid
    AND orders.bookid = book.bookid
    AND book.price = 20000;

외부조인

내부조인의 경우 공통 칼럼명을 기반으로 결과 집합을 생성한다면, 외부조인은 조건문에 만족하지 않는 행도 표시한다. 한쪽 테이블에 데이터가 없어도 기준이 되는 테이블에 데이터가 있다면 조인 결과에 포함시킨다.

  • FROM절에 조인 종류를 적고 ON을 이용해 조인 조건을 명시
    • OUTER는 생략가능하다
SELECT 속성들
FROM 테이블 1 {LEFT | RIGHT | FULL[OUTER]}JOIN 테이블 2
	ON 조인조건
WHERE 검색조건
  • 예시1: 도서를 구매하지 않은 고객을 포함하여 고객의 이름과 고객이 주문한 도서의 판매가격을 구하시오.
    • 기본적으로 LEFT JOIN을 사용한다
    • LEFT JOIN은 먼저 명시된 테이블1을 기준으로 조인조건에 의해서 LEFT JOIN 뒤에 명시된 테이블2를 합체시켜 준다
SELECT customer.name, orders.saleprice -- 속성들
FROM customer LEFT JOIN orders -- 테이블
	ON customer.custid = orders.custid; -- 조인조건
  • 예시2
SELECT *
FROM table1
  LEFT OUTER JOIN table2
    ON table1.n = table2.n;
  • table1의 모든 데이터 + table2에서 table1.n과 겹치는 table2.n 행
    (이미지 출처: advenoh님 블로그)

셀프조인

셀프조인은 테이블에 별칭을 붙이는 기능을 활용해 자기 자신과 결합하는 조인이다.
특별한 명령어가 정해져있지는 않고 INNER JOIN이나 FROM-WHERE의 암묵적 표현법을 사용할 수 있다.
임직원 중에 같은 부서에서 일하는 직원을 알고 싶을 때 셀프조인을 사용할 수 있다.

--  암묵적 표현법
SELECT A.first_name AS EmployeeName1, B.first_name AS EmployeeName2, A.dept_no
FROM employees AS A, employees AS B
WHERE A.emp_no <> B.emp_no
AND A.dept_no = B.dept_no;

(쿼리문 및 이미지 출처: advenoh님 블로그)


정리

  • 완전 외부 조인(FULL OUTER JOIN)은 MySQL에서 지원하지 않는다. 대신 UNION 구문으로 표현해 사용할 수 있다.
  • JOIN은 개념보다 문제를 해결하며 어떻게 적용되는지 직접 익히는 게 중요하다! 문제를 많이 풀어보자!
profile
좌충우돌 천방지축 룰루랄라 데이터 공부

0개의 댓글