JOIN에서 WHERE, ON, USING()

Suhyeon Lee·2024년 10월 1일
0
post-thumbnail

ON vs. WHERE

  • ON: JOIN을 하기 전 필터링을 한다.

    • ON 조건으로 필터링이 된 레코드 간 JOIN이 이루어진다.
    • 컬럼명이 다르더라도 JOIN 조건을 사용할 수 있다.
    • WHERE절과 혼용해서 사용할 수도 있다.
    • 아래와 같이 검색 조건을 사용할 수 있지만, WHERE를 쓰는 것을 권장한다.
    SELECT  E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
    FROM    EMP E JOIN DEPT D
    ON      (E.DEPTNO = D.DEPTNO 
    AND      E.MGR = 7777) ;
    
    -- 위의 쿼리와 아래의 쿼리는 동일한 결과를 가짐
    SELECT  E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
    FROM    EMP E JOIN DEPT D
    ON      (E.DEPTNO = D.DEPTNO)
    WHERE   E.MGR = 7777 ; 
  • WHERE: JOIN을 한 후 필터링을 한다.

    • JOIN을 한 결과에서 WHERE 조건절로 필터링이 이루어진다.

INNER JOIN에서의 ON vs. WHERE

  • INNER JOIN에서의 ON 조건과 WHERE 조건은 같다.
    INNER JOIN ON vs WHERE clause

  • 아래 세 쿼리는 모두 같은 결과, 같은 퍼포먼스가 나옴

    • INNER JOIN + ON 조건절 + ON 조건절
    SELECT *
    FROM a INNER JOIN b ON a.key = b.key AND a.key2 = b.key2
    • 콤마 연산자(IMPLICIT JOIN) + WHERE 조건절
    SELECT *
    FROM a, b
    WHERE a.key = b.key AND a.key2 = b.key2
    • INNER JOIN + ON 조건절 + WHERE 조건절
    SELECT *
    FROM a INNER JOIN b ON a.key = b.key
    WHERE a.key2 = b.key2

※ , 보다는 INNER JOIN을 써야 하는 이유
1. 가독성
2. OUTER JOIN으로 수정할 때 편함
※ JOIN & CROSS JOIN & , JOIN (콤마 연산자; 콤마 조인)

  • JOIN, CROSS JOIN, COMMA JOIN 타입은 INNER JOIN과 같다.
  • 하지만 , 연산자는 다른 조인 타입과 다른 우선순위를 가지고 있어 문법 에러가 발생할 확률이 높아 사용하지 않는 것을 추천(다른 타입의 불가능한 문법 에러가 발생할 수 있음)

OUTER JOIN에서의 ON vs. WHERE

test sample

table1:

col1col2
1one
2two
3three

table2:

col1col2
1first
2second

ON

SELECT t1.col1, t1.col2, t2.col1, t2.col2
FROM table1 t1 LEFT OUTER JOIN table2 t2
ON t1.col1 = t2.col1
AND t1.col2 = 'first';

쿼리 실행 결과

t1.col1t1.col2t2.col1t2.col2
1one1first
2twonullnull
3threenullnull

→ table1의 전체 row와 table2의 col2 컬럼 값이 'first'인 row만 뽑은 row들을 OUTER JOIN
→ ON 조건은 JOIN을 하기 전 필터링!

WHERE

SELECT t1.col1, t1.col2, t2.col1, t2.col2
FROM table1 t1 LEFT OUTER JOIN table2 t2
ON t1.col1 = t2.col1
WHERE t2.col2 = 'first';

쿼리 실행 결과

t1.col1t1.col2t2.col1t2.col2
1one1first

→ table1의 전체 row와 table2의 전체 row를 OUTER JOIN한 후 table2의 col2 컬럼 값이 'first'인 row만 뽑는다.
→ WHERE 조건은 JOIN을 한 이후 필터링!

USING()

  • 같은 이름을 가진 컬럼들 중에서 원하는 컬럼에 대해 EQUI JOIN 가능
  • sql server에서는 지원하지 않음
  • USING() 조건절에는 테이블 이름이나 ALIAS, 접두사를 붙일 수 없다.

profile
2 B R 0 2 B

0개의 댓글