티스토리 뷰
sql문은 실행될 때 순서가 아래와 같다.
FROM -> ON -> JOIN -> WHERE -> ...
즉, ON절 후에 JOIN을 하고 WHERE을 한다.
아래 예제를 확인해보자,
Test Table
AA | BB |
1 | 4 |
2 | 5 |
3 | 6 |
Test2 Table
AA | BB |
1 | 7 |
2 | 8 |
위와 같이 테이블이 있다면 아래 쿼리의 결과는 다음과 같다.
SELECT *
FROM test1 t1 LEFT JOIN test2 t2
ON (t1.aa = t2.aa)
WHERE t2.cc = 7;
AA | BB | AA | CC |
1 | 4 | 1 | 7 |
만약 ON절에 t2.cc = 7 이라는 조건을 where이 아닌 on절에 넣으면 어떤 결과가 나올까?
SELECT *
FROM test1 t1 LEFT JOIN test2 t2
ON (t1.aa = t2.aa AND t2.cc = 7);
AA | BB | AA | CC |
1 | 4 | 1 | 7 |
2 | 5 | null | null |
3 | 6 | null | null |
위와 같이 2개의 행이 더 생긴다.
왜그런 것일까?
Query의 실행순서는 다음과 같다. [ FROM -> ON -> JOIN -> WHERE -> ... ]
그렇기에 1. SELECT를 실행하면 해당 테이블이 각각 실행이되고,
SELECT * FROM test1 t1;
SELECT * FROM test2 t2;
2. ON절을 LEFT 에 있는 Table 기준으로 실행하기에
오른쪽에 있는 test2테이블을 아래 조건을 실행한다.
ON (t1.aa = t2.aa AND t2.cc = 7)
Test2 Table
AA | BB |
1 | 7 |
3. 후에 test1, test2 각각의 테이블을 left Table기준으로 outer join을 실행한다.
AA | BB | AA | CC |
1 | 4 | 1 | 7 |
2 | 5 | null | null |
3 | 6 | null | null |
결과적으로 ON절과 WHERE절의 차이는
ON 이 먼저 실행되고 각각의 테이블을 JOIN한 후 WHERE절이 실행된다.
아래 내용은 재미삼아..ㅎㅎ
select * from test1;
AA BB
1 | 4 |
2 | 5 |
3 | 6 |
select * from test2;
AA CC
1 | 7 |
2 | 8 |
-- 0)
SELECT *
FROM test1 t1 LEFT JOIN test2 t2;
AA BB AA CC
1 | 4 | 1 | 7 |
1 | 4 | 2 | 8 |
2 | 5 | 1 | 7 |
2 | 5 | 2 | 8 |
3 | 6 | 1 | 7 |
3 | 6 | 2 | 8 |
-- 1)
SELECT *
FROM test1 t1 LEFT JOIN test2 t2
ON (t1.aa = t2.aa);
AA BB AA CC
1 | 4 | 1 | 7 |
2 | 5 | 2 | 8 |
3 | 6 | null | null |
-- 1-2)
SELECT *
FROM test1 t1 right JOIN test2 t2
ON (t1.aa = t2.aa);
AA BB AA CC
1 | 4 | 1 | 7 |
2 | 5 | 2 | 8 |
-- 1-3)
SELECT *
FROM test1 t1 LEFT JOIN test2 t2
ON (t1.aa = t2.aa)
WHERE t2.cc = 7;
AA BB AA CC
1 | 4 | 1 | 7 |
-- 2)
SELECT *
FROM test1 t1 LEFT JOIN test2 t2
ON (t1.aa = t2.aa AND t2.cc = 7);
AA BB AA CC
1 | 4 | 1 | 7 |
2 | 5 | null | null |
3 | 6 | null | null |
-- 3)
SELECT *
FROM test1 t1 LEFT JOIN test2 t2
ON (t1.aa = t2.aa OR t2.cc = 7);
AA BB AA CC
1 | 4 | 1 | 7 |
2 | 5 | 1 | 7 |
2 | 5 | 2 | 8 |
3 | 6 | 1 | 7 |
- Total
- Today
- Yesterday
- webpack
- 자바8
- elasticsearch
- NPM
- vscode
- BeanFactory
- 차이
- container
- 중간연산
- springboot
- AnnotationConfigApplicationContext
- lambda
- install
- stream
- Intellij
- Vue
- 영속성 컨텍스트
- nginx
- docker
- mvn
- 스트림
- 람다
- java
- MAC
- ngnix
- ApplicationContext
- Vuex
- map
- JPA
- 최종연산
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |