바빠지는 레벨테스트 주간에 들어가기 전에 sql 관련 문법 중 헷갈리는 Join 정리!
1. 내부 조인과 외부 조인
1) 조인이란 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것.
ex) 회원 테이블에는 회원의 이름과 연락처가 있고, 구매 테이블에는 회원이 구매한 물건이 있음.
물건을 배송하려면 회원 테이블의 회원 이름과 연락처, 구매 테이블의 회원이 구매한 물건에 대한 정보가 필요함.
이 때 두 테이블을 엮어서 하나의 배송을 위한 정보를 추출하는 것이 조인.
2) 내부 조인(INNER JOIN)과 일대다 관계
- 내부 조인(Inner Join) : 참조키를 기준으로 일치하는 행, 관계가 있는 행만 조인.
- 일반적으로 조인 이라고 하면 보통 내부 조인을 의미함.
- 두 테이블의 조인을 위해서는 테이블이 일대다(1:n) 관계로 연결되어야 함.
ex) 한 명의 회사원이 여러 번의 급여를 받는 것.
ex) 한 명의 학생이 여러 과목의 학점을 받는 것.
- 데이터베이스의 테이블은 하나로 구성되는 것보다는 여러 정보를 주제에 따라 분리해서 저장하는 것이 효율적.
- 이 분리된 테이블은 서로 관계(relation)을 맺고 있음.
3) 내부 조인의 기본 형식
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블> -- INNER JOIN 은 JOIN 으로 써도 됨.
ON <조인 될 조건>
[WHERE 검색 조건] -- 생략 가능
4) 외부 조인 (OUTER JOIN)
- 참조키를 기준으로 일치하지 않는 행도 포함시키는 조인.
- 두 테이블을 조인할 때 필요한 내용이 한 쪽 테이블에만 있어도 결과를 추출함.
- 일치하는 행은 포함시켜(복제시켜) 조인하고, 일치하지 않는 행은 null 값으로 복제하여 조인.
- 기본 형식
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
-- LEFT 일 경우 왼쪽에 있는 첫번째 테이블을 다 가져오고, 중복되지 않은 값은 NULL 로 채워줌.
-- RIGHT 는 오른쪽의 두 번째 테이블을 다 가져오고, 중복되지 않은 값은 NULL 로 채워줌.
-- FULL 은 양쪽 다 가져옴.
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인될 조건>
[WHERE 검색 조건] ; -- 생략 가능
5) 기타 조인
- 상호 조인, 카티션 곱 이라고도 함 (Cartesian product)
- CROSS JOIN 예약어 사용하며 ON 구문을 사용할 수 없음.
- 한 쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능.
- 상호 조인 결과의 전체 행 개수는 각 행의 개수를 곱한 개수가 됨.
- 랜덤으로 조인하기 때문에 결과의 내용은 의미가 없음.
- 주 용도는 테스트하기 위해 대용량의 데이터를 생성할 때임.
- 기본 형식
SELECT COUNT(*)
FROM buy
CROSS JOIN product;
-- 대용량의 테이블을 만들고 싶으면 CREATE TABLE ~SELECT 문을 사용하면 됨.
-- 200건의 buy 테이블과 300건의 product 테이블이 조인되어 총 500건의 테이블이 생성됨.
CREATE TABLE cross_table
SELECT *
FROM buy -- 200건
CROSS JOIN product; -- 300건
6) 자체 조인 (SELF JOIN)
- 테이블의 컬럼을 확장하고자 할 때, 확장하고자 하는 컬럼의 데이터가 다른 곳이 아닌 자기 자신 테이블에 있는 것.
- 자신이 자신과 조인한다는 의미이므로 자체 조인은 한 개의 테이블을 사용함.
- 테이블이 한 개 이므로 다른 별칭을 사용해서 서로 다른 테이블인 것처럼 사용함.
SELECT A.*, B.NAME BOSS_NAME --별칭 설정
FROM MEMBER A
LEFT OUTER MEMBER B -- INNER JOIN 하면 일치하는 행만 출력하기 때문에
-- 모든 정보를 출력시 OUTER JOIN 사용해야함
ON B.ID = A.BOSS_ID;
[WHERE 검색 조건] -- 생략 가능
참고 : 혼자 공부하는 SQL [한빛미디어]
'TIL' 카테고리의 다른 글
자바스크립트 == vs === (22.10.16 TIL) (0) | 2022.11.28 |
---|---|
인수 테스트 작성하기 (22.11.27 TIL) (0) | 2022.11.27 |
Spring Boot - @Embeddable, @Embedded, @AttributeOverride, @AttributeOverrides (22.11.25 TIL) (0) | 2022.11.25 |
SQL 기본 문법 정리해보기 (22.11.24 TIL) (0) | 2022.11.24 |
스프링 @ActiveProfiles (22.11.23 TIL) (0) | 2022.11.23 |
댓글