ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQLite 7. JOIN: INNER JOIN
    SQL/Sqlite 2021. 12. 30. 23:40
    반응형

    앞서 정규화를 살짝 언급하면서 자료의 중복을 금지라는 대원칙을 이야기 했다. 

    그렇기 때문에 자료는 테이블 단위로 조각 조각난 상태로 데이터베이스 안에 저장된다. 

    조각 조각 나기 전(?)의 상태로 보기 위해서는 테이블을 다시 합치는 과정이 필요하다. 

    합치는 과정을 JOIN이라고 한다. 

     

    크로스 조인(Cross Join)

    SELECT players.name, weights.weight
    FROM players, weights

    이렇게 조인을 하면 1,070,190 행이 출력되는데 --;

    모든 경우의 수,
    즉 players 테이블의 모든 행과
    weights 테이블의 모든 행을 곱한 숫자 만큼의
    행이 생성되기 때문이다. 

    이 숫자를 카디전 곱이라고 하고,
    이런 조인을 크로스 조인이라고 한다. 

     

    동등 조인(Equi-Join)

    크로스 조인의 엄청난 숫자(카디전 곱)를 줄이기 위해서는 조건이 필요하다. 

    SELECT players.id, players.name, weights.weight
    FROM players, weights
    WHERE players.id=weights.id

    동등은 '=' 이라는 조건을 사용했다는 의미이다. 

     

    내부 조인(Inner Join)

    동등 조인과 같으나 문법 표현만 다르다. 

    SELECT players.name, weights.weight
    FROM players INNER JOIN weights
    WHERE players.id=weights.id

    위와 같이 써도 작동하지만.. JOIN에는 역쉬 ON이지... 

    SELECT players.name, weights.weight
    FROM players INNER JOIN weights
    ON players.id=weights.id

     

    체중 측정횟수가 1이 아닌 선수들을 찾아보자. 

    SELECT *
    FROM players INNER JOIN (
    		SELECT id 
    		FROM weights 
    		GROUP BY id 
    		HAVING count(weight) <> 1
    		) AS w
    	ON w.id = players.id

    서브쿼리와 조인
    둘 다 테이블을 넘나드는 쿼리를 만들 때 유용하다. 

    다만 같은 일을 하더라도
    어떤 방식을 사용하냐에 따라
    성능의 차이가 발생할 수 있으므로 
    실행 시간을 참고해서 쿼리를 작성하자. 

     

    선수들의 체중 측정 횟수를 서브 쿼리를 이용해 알아보자. 

    (편의상 측정 횟수가 1회가 아닌 2명의 결과만 확인하자.)

    SELECT players.id, name, count(weight)
    FROM players 
    	INNER JOIN weights 
    		ON weights.id = players.id
    WHERE players.id IN (120, 641)
    GROUP BY players.id

    같은 결과라도 다양한 방법이 있을 수 있다.
    특히 조인 사용시엔 더욱 그러하다. 

    반응형
Designed by Tistory.