SQL : SQL 문법의 실행 순서 + On vs Where

    SQL에는 여러가지 절이 있다. 보통은 순서대로 작성하는 것이 정석이지만, ORM을 라이브러리로 표현해주는 QUERY DSL 같은 것을 사용할 경우 사실 어떤 순서로 배치되는지는 아무 의미가 없다. 

    select(A).from(B)
    from(B).select(A)

    위 코드는 네이티브 쿼리에서는 다르게 동작하겠지만, QUERY DSL에서는 동일한 형식으로 동작하기 때문이다. 그런데 개발자가 중요하게 알아야 할 부분은 SQL 문법의 실행 순서다. 

    내가 SQL 문법을 어떻게 작성하던, 실제로 SQL 문법이 실행되는 우선순위는 정해져있다. 따라서 이 부분을 정확하게 알아야 QUERY되어오는 테이블을 최소화할 수 있고, 찾는 영역도 좀 더 정확하게 타겟팅해서 찾을 수 있게 된다. 

     

    SQL 실제 실행순서

    • FROM : 각 테이블 확인
    • ON : 조인 조건 확인
    • JOIN : 테이블 조인 (병합)
    • WHERE : 데이터 추출 조건 확인
    • GROUP BY : 특정 칼럼으로 데이터 그룹화
    • HAVING : 그룹화 이후 데이터 추출 조건 확인
    • SELECT : 데이터 추출
    • DISTINCT : 중복 제거
    • ORDER BY : 데이터 정렬

    위에서 한 가지 확인해야 할 부분은 Join의 앞 뒤로 있는 것이다. 실행 순서를 보면 From 테이블을 먼저 불러와서 On 조건을 바탕으로 Join Table과 Join을 한다고 한다. 그리고 Where절은 조인이 완료된 테이블에서 필터링을 하는 역할로 이해할 수 있다. 

     

    간단하게 확인해보기

    출처 : 아래 참고

    위와 같은 SQL문이 있다고 가정해보자. 이 때 ON절에 P.PRICE <= 5000이라는 용어가 들어간다. 위의 SQL을 간략히 이해해보면 다음과 같다.

    1.  BUY_HIS를 B라고 부르고, 이 때 PRODUCT_TABLE과 Outer Join을 한다.
    2. 이 때, Product Table에서 P<=PRICE가 5000을 만족하는 경우에 BUY_HIS와 PRODUCT_TABLE은 JOIN을 한다. 이 조건을 만족하지 않는 나머지 Entity들은 Outer 조인을 한다. 

    실제 실행 결과를 보면 다음과 같은 결과가 나온다. 5000보다 작은 Entity가 하나 밖에 없기 때문에 이 둘만 Joing을 한다. 나머지는 모두 Outer Join을 하게 된다. 

    여기서 P.PRICE <= 5000을 지우게 되면, P005에 대한 값도 JOIN이 된 것을 확인할 수 있다. 즉, ON절을 만족하면 JOIN을 하되, 나머지는 OuterJoing을 해서 Null 값이 나오게 한다는 뜻이다. 

    예를 들어 위의 테이블의 쿼리에 where P.PRICE = 6000 이라는 where문을 추가하면 다음과 같은 쿼리만 나오게 된다. 즉, Where문은 필터링을 처리하는데 주요 사용되는 것으로 이해를 할 수 있다.

     

    On절 좀 더 살펴보기

    "select m from Member m join Team t on m.id = t.id"

    위의 문장의 동작 방식을 한번 생각해보자.

    1. 먼저 Member 테이블 전체를 불러온다.
    2. 그리고 Member의 Id와 Team의 Id가 같은 Team Table에 대해서만 Team을 조인한다. 

    위를 보면 좀 더 잘 알 수 있는데, Member Id와 Team Id가 같은 경우에만 Team을 Member Table에 붙여준다. 그런데 어쨋든 Member Table은 From절에 있어서 전체를 가져와야한다. 그러면 On 조건을 만족하지 못하는 Team이 붙은데, 그런 값들은 모두 Null로 붙게 된다. 

     

     

    참고 사이트 

    https://become.tistory.com/entry/Oracle-%EA%B8%B0%EC%B4%88-OUTER-JOIN%EC%97%90%EC%84%9C%EC%9D%98-ON-%EA%B3%BC-WHERE%EC%9D%98-%EC%B0%A8%EC%9D%B4

    https://zu-techlog.tistory.com/29

    '기타 Tool > SQL' 카테고리의 다른 글

    ksqlDB : ksqlDB의 쿼리 종류  (0) 2022.12.17
    라인 1차 면접  (0) 2022.04.11

    댓글

    Designed by JB FACTORY