SQL JOIN
- 두개 이상의 테이블들에 있는 데이터를 한 번에 조회하는 것
- 여러 종류의 JOIN이 존재한다
implicit join
- from절에는 table들만 나열하고 where절에 join condition을 명시하는 방식
- old-style join syntax
- where절에 selection condition과 join condition이 같이 있기 때문에 가독성이 떨어진다
- 복잡한 join 쿼리를 작성하다 보면 실수로 잘못된 쿼리를 작성할 가능성이 크다
mysql > SELECT D.name
-> FROM employee AS E, department AS D
-> WHERE E.id = 1 and E.dept_id = D.id;
explicit join
- from절에는 JOIN키워드와 함께 joined table들을 명시하는 방식
- from절에서 ON 뒤에 join condition이 명시된다
- 가독성이 좋다
- 복잡한 join 쿼리 작성 중에도 실수할 가능성이 적다
mysql > SELECT D.name
-> FROM employee AS E JOIN department AS D ON E.dept_id = D.id
-> WHERE E.id = 1;
inner join
- 두 table에서 join condition을 만족하는 tuple들로 result table을 만드는 join
- FROM table1 [INNER] JOIN table2 ON join_condition
- join condition에 사용 가능한 연산자(operator) : =, <, >, != 등 여러 비교 연산자가 가능하다
- join condition에서 null 값을 가지는 tuple은 result table에 포함되지 못한다
mysql > SELECT *
-> FROM employee E INNER JOIN department D ON E.dept_id = D.id;
outer join
- 두 table에서 join condition을 만족하지 않는 tuple들도 result table에 포함하는 join
- FROM table1 LEFT [OUTER] JOIN table2 ON join_condition
- FROM table1 RIGHT [OUTER] JOIN table2 ON join_condition
- FROM table1 FULL [OUTER] JOIN table2 ON join_condition
- join condition에 사용 가능한 연산자(operator) : =, <, >, != 등 여러 비교 연산자가 가능하다
mysql > SELECT *
-> FROM employee E LEFT OUTER JOIN department D ON E.dept_id = D.id;
mysql > SELECT *
-> FROM employee E RIGHT OUTER JOIN department D ON E.dept_id = D.id;
pgrsql# SELECT *
-> FROM employee E FULL OUTER JOIN department D ON E.dept_id = D.id;
equi join
- join condition에서 = (equality comparator)를 사용하는 join
*equi join에 대한 두 가지 시각
- inner join, outer join 상관없이 = 를 사용한 join이라면 equi join으로 보는 경우
- inner join으로 한정해서 = 를 사용한 경우에 equi join으로 보는 경우
using
- 두 table이 equi join 할 때 join하는 attribute의 이름이 같다면, USING으로 간단하게 작성할 수 있다
- 이때 같은 이름의 attribute는 result table에서 한번만 표시 된다
- FROM table1 [INNER] JOIN table2 USING (attribute(s))
- FROM table1 LEFT [OUTER] JOIN table2 USING (attribute(s))
- FROM table1 RIGHT [OUTER] JOIN table2 USING (attribute(s))
- FROM table1 FULL [OUTER] JOIN table2 USING (attribute(s))
mysql > SELECT *
-> FROM employee E INNER JOIN department D USING(dept_id);
natural join
- 두 table에서 같은 이름을 가지는 모든 attribute pair에 대해서 equi jon을 수행
- join condition을 따로 명시하지 않는다
- FROM table1 NATURAL [INNER] JOIN table2
- FROM table1 NATURAL LEFT [OUTER] JOIN table2
- FROM table1 NATURAL RIGHT [OUTER] JOIN table2
- FROM table1 NATURAL FULL [OUTER] JOIN table2
cross join
- 두 table의 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으로 동작한다 (CROSS JOIN에 ON을 거의 안쓴다)
- INNER JOIN(or JOIN)이 ON(or USING) 없이 사용되면 cross join으로 동작한다
self join
- table이 자기 자신에게 join하는 경우
출처 - 쉬운코드 SQL로 데이터 조회하기
'백엔드 스터디 > 데이터베이스' 카테고리의 다른 글
트랜잭션 (0) | 2024.07.11 |
---|---|
RDB INDEX & RDB VIEW (0) | 2024.07.10 |
SQL - DDL, DML, DCL (0) | 2024.07.05 |
NoSQL 개념 (0) | 2024.07.05 |
SQL로 데이터 조회하기 - select를 활용해서 데이터를 읽어오는 기본적인 문법 (0) | 2024.07.04 |