일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 알림생성
- N+1
- unnest
- 메뉴바 한번에
- 3계층구조
- getComputedStyle
- 이미지가 포함된 게시글
- JWT 쓰는이유
- 스테이지어스
- route 53
- element.style
- JWT
- .env
- 네비게이션 한번에
- 환경변수
- 포트번호
- JSON Web Token
- 패스파라미터
- 쿼리스트링
- secret코드
- 게시글 이미지 업로드
- 레포지토리
- 토큰
- Winston
- JWT 쓰는 방법
- 게시글 이미지
- 알림생성모듈
- N+1문제
- 메뉴바
- 부트캠프
- Today
- Total
기주
[DB] Join 종류 공부하기 본문
Join 종류 공부하기
Join
두 개 이상의 테이블에 있는 데이터를 합쳐서 한 번에 조회하는 것
Implicit join
SELECT D.name
FROM employee E, department D
WHERE E.id = 1 AND E.dept_id = D.id
-조인 테이블을 FROM문에 Join condition(조인조건)을 WHERE문에 작성하는 방식
-Old style 조인 문법
-WHERE문에 selection condition과 join condition이 같이 있기 떄문에 가독성이 떨어진다
-가독성이 떨어지니 복잡한 join 쿼리를 작성하다보면 실수로 잘못된 쿼리를 작성할 가능성이 높다.
Explicit join
SELECT D.name
FROM employee E
JOIN department D
ON E.dept_id = D.id
WHERE E.id=1;
-FROM문에 JOIN 키워드와 함께 join된 테이블들을 명시하는 방식
-FROM 절에서 ON 뒤에 join condition이 명시된다
-가독성이 좋다
-복잡한 join쿼리 작성에도 실수할 가능성이 적다
Inner join
-두 테이블에서 join condition을 만족하는 tuple들로 result table을 만드는 join
(Join condition을 만족하는 튜플만 가져오는 조인)
FROM table1 [INNER] JOIN table2 ON join_condition
(inner join은 기본조인으로 inner은 안써도 inner 조인이 적용된다)
-join condition에서 null값을 가지는 tuple은 result table에 포함되지 못한다
- inner Join condition에서 사용 가능한 연산자: =, <,>,!=
Outer join
-두 테이블에서 join condition을 만족하지 않는 tuple들도 result table에 포함하는 join
(Join condition을 만족하지않는 튜플도 가져온다.)
-Join condition을 만족하지 않은 상대 테이블과 매칭되지 않는 튜플은 상대 테이블에 대한 속성을 모두 null로 가져온다
Outer join의 종류 3가지
[outer] 역시 생략가능하다
1.LEFT [OUTER] JOIN: 왼쪽 테이블에서 매칭되지 못한(조인조건 만족 못하는) 튜플도 가져온다
2. RIGHT [OUTER] JOIN: 오른쪽 테이블에서 매칭되지 못한(조인 조건 만족못하는) 튜플도 가져온다
3. FULL [OUTER] JOIN: 양쪽테이블에서 매칭되지못한(조인 조건만족 못하는) 튜플도 가져온다
(MYSQL은 FULL OUTER JOIN을 지원하지 않는다. PSQL은 지원.)
outer Join condition에 사용가능한 연산자: =,<,>,!=
Equi join
Join condition에서 =연산자를 사용하는 join
Using
두 테이블이 equi join을할 때 join하는 속성의 이름이 같다면 USING으로 간단하게 작성할 수 있다.
이때 같은 이름의 attribute는 result table의 맨 앞에서 한번만 표시된다.
2개이상의 속성을 조인조건으로 쓴다면 USING 에 추가 속성명을 적으면 된다. USING(속성1, 속성2...)
FROM table1 [INNER] JOIN table2 USING(속성)
FROM table1 LEFT [OUTER] JOIN table2 USING(속성)
Natural join
두 테이블에서 같은 이름을 가지는 *모든 attribute pair에 대해서 equi join을 수행
Join condition을 따로 명시하지 않는다
FROM table1 NATURAL [inner] JOIN table2
FROM table1 NATURAL LEFT[OUTER] JOIN table2
Cross join
-두 tuple의 tuple pair로 만들 수 있는 모든 조합(Cartesian product)을 result table로 반환한다
-Join condition이 없다
Implicit cross join
FROM table1, table2
Explicit cross join
FROM table1 CROSS JOIN table2
MYSQL에서의 cross join
-MYSQL에서는 cross join = inner join = join
-CROSS JOIN에 ON(or USING)(조인 조건이 있다면)을 같이 쓰면 inner join으로 동작한다
-Inner JOIN(or JOIN)이 ON (or USING)(조인 조건이 없다면) cross join으로 동작한다
Self join
table이 자기 자신에게 join하는 경우
조인예제
예제에 사용될 테이블
(부서, 직원, 프로젝트, 프로젝트 참여 목록)
DEPARTMENT
id, name, leader_id
EMPLOYEE
id, name, birth_date, sex, position, salary, dept_id
Project
id, name, leader_id, start_date, end_date
WORKS_ON
empl_id, proj_id
Q) ID가 1003인 부서에 속하는 임직원중 리더를 제외한 부서원의 ID, 이름, 연봉을 알고싶다.
SELECT id, name, salary
FROM EMPLOYEE E
JOIN DEPARTMENT D
ON D.ID = E.DEPT_ID
WHERE D.ID=1003 AND E.id != D.leader_id;
Q) ID가 2001인 프로젝트에 참여한 임직원들의 이름과 직군과 소속 부서 이름을 알고 싶다
SELECT E.name, E.position, D.name
FROM employee E
JOIN works_on W
ON W.empl_id = E.id
LEFT JOIN department D
ON E.dept_id = D.id
WHERE W.proj_id = 2001;
LEFT JOIN을 쓰는 이유
EMPLOYEE 테이블에 dept_id가 null인 튜플도 있을 수 있다.
'DBMS > 데이터베이스 이론' 카테고리의 다른 글
[DB] DB 인덱스 기초 (0) | 2025.01.29 |
---|---|
[DB] Nested loop join, Merge join, Hash join 알아보기 (0) | 2025.01.27 |
[DB] SQL - 집계함수, group by, order by 공부하기 (0) | 2025.01.16 |
[DB] SQL에서 NULL의 의미와 three-valued logic에 대해 알아보기 (0) | 2025.01.14 |
[DB] SQL 실행순서 (0) | 2025.01.10 |