![[SQL] JOIN의 종류와 장단점 및 사용 예시 [SQL] JOIN의 종류와 장단점 및 사용 예시](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
JOIN이란?
- 하나의 테이블에 출력하고자 하는 데이터가 없을 경우, 다른 테이블과 엮어서 원하는 데이터를 출력하는 기능을 말한다.
- 두 개의 테이블을 묶어서 하나의 결과를 만들어 내는 것을 의미한다.
JOIN의 조건
- 두 개의 테이블이 PK-FK 관계로 맺어져 있어야 하고, 이를 일대 다 관계라고 한다.
- PK : Primary Key, FK : Foreign Key
JOIN의 종류
- INNER JOIN
- OUTER JOIN
- LEFT JOIN
- RIGHT JOIN
- CROSS JOIN
- SELF JOIN
- EQUI JOIN
- NON-EQUI JOIN
- NATURAL JOIN
이처럼 다양한 JOIN은 크게 ORACLE JOIN과 ANSI JOIN으로 분류된다.
ORACLE JOIN (ORACLE 8i)
- 카테시안 프로덕트(cartesian product)
- EQUI JOIN
- NON-EQUI JOIN
- OUTER JOIN
- SELF JOIN
ANSI JOIN(ORACLE 9i 이후)
- CROSS JOIN
- NATURAL JOIN
- Using을 이용한 JOIN
- OUTER JOIN
카테시안 프로덕트(Cartesian Product) 란?
수학에서는 '데카르트의 곱'이라고 불린다.
발생가능한 모든 경우의 수에 해당하는 행이 출력되는 문법이다.
엄밀히 말하면 JOIN이라고 볼 수 없는 JOIN으로, FROM절에 두 개의 테이블을 명시하지만
WHERE절이 없거나 JOIN 조건을 추가하지 않고 ON절이 없는 JOIN을 의미한다.
CROSS JOIN의 JOIN 문법이 카테시안 프로덕트에 해당하는 JOIN이다.
CROSS JOIN
![[SQL] JOIN의 종류와 장단점 및 사용 예시 - CROSS JOIN [SQL] JOIN의 종류와 장단점 및 사용 예시 - CROSS JOIN](https://blog.kakaocdn.net/dn/nvuOq/btrT5VqyOpE/WOyNSuo0Dd9FWVzThMrOKk/img.png)
발생할 수 있는 모든 경우의 수를 출력하는 JOIN 문법이다.
사용자가 원하는 값만을 얻기 위해 사용하는 JOIN의 기능상
단순히 CROSS JOIN만을 사용한 결과가 필요한 경우는 없다고 보면 된다.
그러나 CROSS JOIN을 공부하는 이유는 CROSS JOIN이 JOIN 연산을 이해하는데 많은 도움이 되기 때문이다.
INNER JOIN은 'Cartesian Product' 의 부분 집합(내부)이고,
OUTER JOIN은 'Cartesian Product' 를 포함하지 않는 결과(외부)를 출력하기 때문이다.
단점
모든 행에 대한 결합이 발생하므로 CPU에 과부하가 걸려 시스템이 다운되거나 데이터 공간을 많이 차지할 수 있다.
CROSS JOIN 예시
TABLE 구성
A TABLE | ID(PK) | NAME | B TABLE | ID(PK) | NAME |
1 | a | 1 | c | ||
2 | b | 2 | d |
SQL 문법
[ ORACLE JOIN ]
SELECT * FROM A as a, B as b
[ ANSI JOIN ]
SELECT * FROM A as a CROSS JOIN B as b
결과
RESULT | a.ID(PK) | a.NAME | b.ID(PK) | b.NAME |
1 | a | 1 | c | |
1 | a | 2 | d | |
2 | b | 1 | c | |
2 | b | 2 | d |
INNER JOIN
![[SQL] JOIN의 종류와 장단점 및 사용 예시 - INNER JOIN [SQL] JOIN의 종류와 장단점 및 사용 예시 - INNER JOIN](https://blog.kakaocdn.net/dn/BfVha/btrT5TUgruz/5OyXGUvDdQDSkHdltUz1Q0/img.png)
A 테이블과 B 테이블의 JOIN 조건 컬럼을 비교하여
값이 일치하는 데이터들만 결과로 출력해주는 JOIN 문법이다.
ANSI JOIN에서 JOIN앞에 어떤 조인을 쓸 것인지 명시하지않고 JOIN을 쓰면 INNER JOIN이 실행된다.
( SELECT <컬럼 목록> FROM A as a JOIN B as b ON a.PK = b.FK )
장점
IN 이나 EXISTS 에 비해서 처리 속도가 빠르다.
단점
쿼리가 직관적이지 못하고 가독성이 떨어진다.
IN 과 EXISTS
IN
장점
사용하기 쉽고 직관적이다.
단점
대량의 데이터를 조회하는 경우 조회 속도가 급격하게 느려진다. ( 모든 컬럼의 값을 하나씩 직접 비교하기 때문 )
EXISTS
장점
대량의 데이터 조회시 IN 보다 빠른 처리가 가능하다. ( 해당 값이 TRUE/FALSE인지만을 비교해서 데이터를 처리한다. )
단점
INNER JOIN 결론
- 조회 하는 데이터가 많지 않은 경우 >> IN 사용
- 조회 하는 데이터가 많을 경우 >> EXISTS 사용
- 매우 빠른 처리속도가 필요한 경우 >> INNER JOIN 사용
INNER JOIN을 많이 사용하다 보면 쿼리의 가독성이 떨어지고
실제 업무에서 빠르고 효율적인 쿼리를 짜기엔 부적합하고
대량의 데이터를 조회할 것이 아니면 IN 을 사용하는 것이 좋다.
INNER JOIN 예시
TABLE 구성
A TABLE | ID | NAME | B TABLE | ID | AGE |
1 | a | 1 | 22 | ||
2 | b | 2 | 23 |
SQL 문법
[ ORACLE JOIN ]
SELECT * FROM A as a, B as b WHERE a.ID = b.ID
[ ANSI JOIN ]
SELECT * FROM A as a INNER JOIN B as b ON a.ID = b.ID
결과
RESULT | a.ID | a.NAME | b.ID | b.AGE |
1 | a | 1 | 22 | |
2 | b | 2 | 23 |
OUTER JOIN
OUTER JOIN에는 LEFT OUTER JOIN( LEFT JOIN ), RIGHT OUTER JOIN( RIGHT JOIN ), FULL OUTER JOIN이 있다.
A 테이블과 B 테이블의 JOIN 조건에서 조건에 맞지 않는 데이터도 출력하고자 할 때 OUTER JOIN을 사용한다.
조건에 맞지 않아 데이터가 없는 값들은 null로 가져오게 된다.
1. FULL OUTER JOIN
![[SQL] JOIN의 종류와 장단점 및 사용 예시 - OUTER JOIN - 1. FULL OUTER JOIN [SQL] JOIN의 종류와 장단점 및 사용 예시 - OUTER JOIN - 1. FULL OUTER JOIN](https://blog.kakaocdn.net/dn/doSgL6/btrT5bg1Jya/KkBzV0OYOtoApJC0lbygK1/img.png)
JOIN하는 두 테이블의 모든 데이터를 읽어 중복된 값을 제외하고 JOIN된 결과를 출력해주는 JOIN 문법이다.
FULL OUTER JOIN은 ORACLE JOIN문법이 없어 ANSI JOIN문법만 사용할 수 있다.
FULL OUTER JOIN 예시
TABLE 구성
A TABLE | ID | NAME | B TABLE | ID | AGE |
1 | a | 1 | 22 | ||
2 | b | 3 | 23 |
SQL 문법
[ ANSI JOIN ]
SELECT * FROM A as a FULL OUTER JOIN B as b ON a.ID = b.ID
결과
RESULT | a.ID | a.NAME | b.ID | b.AGE |
1 | a | 1 | 22 | |
2 | b | (null) | (null) | |
(null) | (null) | 3 | 23 |
2. LEFT OUTER JOIN ( LEFT JOIN )
![[SQL] JOIN의 종류와 장단점 및 사용 예시 - OUTER JOIN - 2. LEFT OUTER JOIN ( LEFT JOIN ) [SQL] JOIN의 종류와 장단점 및 사용 예시 - OUTER JOIN - 2. LEFT OUTER JOIN ( LEFT JOIN )](https://blog.kakaocdn.net/dn/bgketH/btrT8oGvay3/PflLktqJ84LVBRVHTWjczk/img.png)
LEFT JOIN과 RIGHT JOIN은 기준 테이블의 위치에 따라 달라지는 JOIN 문법이다.
따라서 기준이 되는 테이블을 왼쪽으로 잡으면 LEFT JOIN을 사용해서 쿼리를 작성하면 된다.
기준이 되는 테이블을 LEFT JOIN 앞쪽에 쓰거나 ( ANSI ),
JOIN 조건의 기준 테이블이 아닌 테이블 컬럼 뒤에 (+)를 붙여주면 된다. ( ORACLE )
반드시, JOIN조건에서 기준이 되는 테이블의 COLUMN에는
반대 테이블의 JOIN 조건 COLUMN의 모든 값을 포함하고 있어야 한다.
INNER JOIN과 LEFT OUTER JOIN의 성능 이슈
많은 블로그와 자료들을 찾아봤지만 처리하는 데이터가 클 경우,
무분별하게 LEFT OUTER JOIN과 WHERE 절을 사용하는 것 보다는
상황에 맞게 INNER JOIN을 사용하는 것이 좋다고 한다.
LEFT OUTER JOIN 예시
TABLE 구성
A TABLE | ID | NAME | B TABLE | ID | AGE |
1 | a | 1 | 22 | ||
2 | b | 3 | 23 |
SQL 문법
[ ORACLE JOIN ]
SELECT * FROM A as a, B as b WHERE a.ID = b.ID(+)
[ ANSI JOIN ]
SELECT * FROM A as a LEFT JOIN B as b ON a.ID = b.ID
결과
RESULT | a.ID | a.NAME | b.ID | b.AGE |
1 | a | 1 | 22 | |
2 | b | (null) | (null) |
3. RIGHT OUTER JOIN ( RIGHT JOIN )
![[SQL] JOIN의 종류와 장단점 및 사용 예시 - OUTER JOIN - 3. RIGHT OUTER JOIN ( RIGHT JOIN ) [SQL] JOIN의 종류와 장단점 및 사용 예시 - OUTER JOIN - 3. RIGHT OUTER JOIN ( RIGHT JOIN )](https://blog.kakaocdn.net/dn/EMmES/btrT5THi66E/LV5rolXgo0o7iWh0sh65vk/img.png)
LEFT JOIN과 사용하는 문법은 동일하고 LEFT JOIN 대신 RIGHT JOIN을 사용하여 JOIN 문법을 작성한다.
기준이 되는 테이블을 RIGHT JOIN 우측에 적거나 ( ANSI ),
JOIN 조건의 기준 테이블이 아닌 테이블 컬럼 뒤에 (+)를 붙여주면 된다. ( ORACLE )
LEFT JOIN과 마찬가지로 반드시 JOIN조건에서 기준이 되는 테이블의 COLUMN에는
반대 테이블의 JOIN 조건 COLUMN의 모든 값을 포함하고 있어야 한다.
RIGHT OUTER JOIN 예시
TABLE 구조
A TABLE | ID | NAME | B TABLE | ID | AGE |
1 | a | 1 | 22 | ||
3 | b | 2 | 23 |
SQL 문법
[ ORACLE JOIN ]
SELECT * FROM A as a, B as b WHERE a.ID(+) = b.ID
[ ANSI JOIN ]
SELECT * FROM B as b RIGHT JOIN A as a ON b.ID = a.ID
결과
RESULT | b.ID | b.AGE | a.ID | a.NAME |
1 | 22 | 1 | a | |
2 | 23 | (null) | (null) |
SELF JOIN
![[SQL] JOIN의 종류와 장단점 및 사용 예시 - SELF JOIN [SQL] JOIN의 종류와 장단점 및 사용 예시 - SELF JOIN](https://blog.kakaocdn.net/dn/tmfdT/btrT8pr3fAS/MxePW7YIfL3ZYFcRGzjx11/img.png)
SELF JOIN이란 별도의 JOIN 문법은 따로 없고
INNER JOIN이나 OUTER JOIN으로 자기 자신 테이블과 JOIN하는 문법이다.
자기 자신과 JOIN하기 때문에 동일한 COLUMN을 갖고있다.
따라서, TABLE에 Alias를 사용해야만 하고 조회 COLUMN 목록을 정확하게 명시해야만 한다.
SELF JOIN 예시
TABLE 구조
A TABLE | ID | NAME | MANAGER_ID |
1 | a | 0 | |
2 | b | 1 | |
3 | c | 2 |
SQL 문법
[ ORACLE JOIN ]
SELECT a.ID, a.NAME, b.NAME FROM A as a, A as b WHERE a.MANAGER_ID = b.ID
[ ANSI JOIN ]
SELECT a.ID, a.NAME, b.NAME FROM A as a INNER JOIN A as b ON a.MANAGER_ID = b.ID
결과
RESULT | a.ID | a.NAME | b.NAME |
2 | b | a | |
3 | c | b |
마치며
여러 블로그와 문서들을 찾아보면서
JOIN의 오남용은 쿼리의 가독성을 떨어지게 하고 데이터를 처리하는데 있어
시스템에 과부하를 줄 수 있어 JOIN을 최대한 사용하지 않는 것이 좋다고 한다.
하지만 JOIN을 사용하지 않을 수는 없다.
따라서, 대량의 데이터를 조회할 것이 아니라면 대부분의 데이터 조회시에는 IN을 사용해도 무관하고
데이터의 양이 많아지면 EXISTS나 INNER JOIN으로 조회할 것을 권장하고 있다.
참고 사이트
https://m.blog.naver.com/jwyoon25/221288655539
SQL 조인(JOIN: 문법&알고리즘)과 성능 이슈 기초
검색하고자 하는 컬럼이 한 개의 테이블에서 전부 조회되지 않는 경우, 즉 여러 개의 테이블을 연결시켜서 ......
blog.naver.com
https://m.blog.naver.com/regenesis90/222190313921
[오라클/SQL] OUTER JOIN - LEFT JOIN, RIGHT JOIN : 한쪽 테이블의 전체 레코드를 기준으로 JOIN 결과에 출력
1. OUTER JOIN : LEFT JOIN, RIGHT JOIN의 개념과 표현 1) OUTER JOIN......
blog.naver.com
https://wakestand.tistory.com/511
SQL IN EXISTS JOIN 성능 비교 및 용도 정리글
각종 SQL에서 데이터 조회 시 IN EXIST INNER JOIN을 사용해 조회를 하게 되는데 여기서 IN, EXIST, INNER JOIN 중 뭘 써야 성능이 가장 좋은가 싶을거다 일단 정답은 몇백~몇천건을 조회하는 정도라면 의미...
wakestand.tistory.com
댓글