목차
JOIN
JOIN 소개
- program, teacher 예시
- 강사 id에 대한 정보가 teacher table에 저장되어 있습니다.
- 아래처럼 프로그램, 가격, 강사 출신대학 4개의 컬럼 한번에 출력하려면 어떻게 해야할까요?
- 단순히 SELECT 문을 사용하면 아래와 같이 전체 조합이 출력됩니다. ( 5 x 3 )
-
SELECT * FROM program, teacher
-
- program의 강사id 컬럼과 teacher id 컬럼이 같은 행만 출력하도록 필터링 작업을 진행해주어야합니다.
-
SELECT * FROM program, teacher WHERE program.강사id=teacher.id
-
- 위 작업을 INNER JOIN 을 통해서 동일하게 구현 가능합니다.
-
SELECT * FROM program INNER JOIN teacher ON program.강사id=teacher.id
-
INNER JOIN
- INNER JOIN ~ ON ~ 은 두 테이블사이에서 공통점이 있는 행만 필터링하고 싶을 경우 사용합니다.
- INNER JOIN 문법
- 테이블 2개 합치가
-
SELECT 출력할컬럼들 FROM 테이블1 INNER JOIN 테이블2 ON 조건문
-
- 테이블 3개 합치기
-
SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 조건1 INNER JOIN 테이블3 ON 조건2
-
- 테이블 2개 합치가
CROSS JOIN
- CROSS JOIN 문법
-
SELECT 출력할컬럼들 FROM 테이블1 CROSS JOIN 테이블2
-
- CROSS JOIN은 테이블 2개 이상을 출력할 때 WHERE / ON 조건문을 넣지 않으면 기본적으로 CROSS JOIN이 됩니다.
- 아래 예시에서 모든 행의 조합이 나오는 것 (5 x 3)
LEFT / RIGHT / FULL OUTER JOIN
- INNER / FULL / LEFT / RIGHT 비교
- LEFT / RIGHT / FULL JOIN을 이해하기 위해 program 테이블과 teacher 테이블에 아래와 같은 데이터를 추가해줍니다.
- program
- teacher
- program
LEFT JOIN
- 왼쪽 테이블 전체 + 공통된 행 출력하고 싶을 경우 LEFT JOIN을 사용합니다.
-
SELECT 출력할컬럼들 FROM 테이블1 LEFT JOIN 테이블2 ON 조건문
- 예시
-
SELECT * FROM program LEFT JOIN teacher ON program.강사id = teacher.id
-
RIGHT JOIN
- 오른쪽 테이블 전체 + 공통된 행 출력하고 싶을 경우 LEFT JOIN을 사용합니다.
-
SELECT 출력할컬럼들 FROM 테이블1 RIGHT JOIN 테이블2 ON 조건문
- 예시
-
SELECT * FROM program RIGHT JOIN teacher ON program.강사id = teacher.id
-
FULL JOIN
- LEFT JOIN과 RIGHT JOIN 결과를 합해서 출력하고 싶은 경우 FULL JOIN을 사용합니다.
-
SELECT 출력할컬럼들 FROM 테이블1 FULL JOIN 테이블2 ON 조건문
- 하지만, MySQL, MariaDB, SQLite에서는 사용할수 없습니다. -> LEFT JOIN, RIGHT JOIN 결과를 UNION 연산자를 통해 묶어주면 됩니다.
-
SELECT 출력할컬럼들 FROM 테이블1 LEFT JOIN 테이블2 ON 조건문 UNION SELECT 출력할컬럼들 FROM 테이블1 RIGHT JOIN 테이블2 ON 조건문;
-
- 하지만, MySQL, MariaDB, SQLite에서는 사용할수 없습니다. -> LEFT JOIN, RIGHT JOIN 결과를 UNION 연산자를 통해 묶어주면 됩니다.
- 예시
-
SELECT * FROM program LEFT JOIN teacher ON program.강사id = teacher.id UNION SELECT * FROM program RIGHT JOIN teacher ON program.강사id = teacher.id;
-
예제
- 예시 데이터
- product
- sales
- user_table
- product
- sales 테이블을 아래와 같이 product 테이블에 있던 상품명, 가격도 같이 출력해보기.
-
SELECT sales.id,고객번호,구매날짜,상품명,가격 FROM sales INNER JOIN product ON sales.상품id=product.id
-
- sales 테이블을 출력하는데 아래와 같이 상품명, 가격, 고객명도 함께 출력해보기
-
SELECT sales.id,고객번호,구매날짜,상품명,가격,고객명 FROM sales INNER JOIN product ON sales.상품id=product.id INNER JOIN user_table ON sales.고객번호=user_table.id;
- INNER JOIN을 안쓰고 WHERE로도 작성이 가능합니다.
-
SELECT sales.id, 고객번호, 구매날짜, 상품명, 가격, 고객명 FROM sales, product, user_table WHERE sales.상품id = product.id AND sales.고객번호 = user_table.id;
-
-
- 날짜별 매출 합계를 출력하기
-
SELECT 구매날짜, SUM(가격) AS 일별합계 FROM sales INNER JOIN product ON sales.상품id=product.id GROUP BY 구매날짜
-
- 매출 내역에 없는 상품들을 출력해보기
-
SELECT 상품명 FROM sales RIGHT JOIN product ON sales.상품id = product.id WHERE 상품id IS NULL
-
- 매출 내역에 없는 고객들을 출력해보기
-
SELECT 고객명 FROM sales RIGHT JOIN user_table ON sales.고객번호=user_table.id WHERE 상품id IS NULL
-
출처
'Database > MySQL' 카테고리의 다른 글
SQL문 결과 테이블로 저장하기 / VIEW (1) | 2024.03.12 |
---|---|
UNION (SELECT 결과들 합치기) (0) | 2024.03.12 |
IF / CASE (0) | 2024.03.02 |
그룹지어 통계내기 (GROUP BY) (0) | 2024.03.02 |
select 안에 select (서브쿼리) (1) | 2024.03.01 |