ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL JOIN 총정리
    SQL 2023. 9. 30. 13:14
    • INNER JOIN
      • 조인하는 테이블의 ON 조건이 일치하는 결과만 출력
      • FROM 절에 콤마를 사용하면 INNER JOIN으로 사용 가능
      • OUTER JOIN과 다르게 어느 테이블에서 기준으로 조인을 하든 조인 관계에 부합되는 record를 모두 가지게 된다.
      • 조인에 부합되지 않는 record는 모두 삭제된다.
    select 
    	t1.name 
    from 
    	tbl_one as t1 
        	inner join tbl_two as t2 
    		on t1.seq = t2.seq 
    where 
    	t1.seq = "1" -- join을 완료하고 그다음 조건을 따진다.
        
    -- inner join 함축 구문
    select
    	t1.seq
    from
    	tbl_one t1, tbl_two t2
    where
    	t1.seq = t2.seq and t1.seq = "1"

     

    • OUTER JOIN
      • 기준 테이블의 것은 모두 출력
      • OUTER JOIN은 조인하는 테이블의 ON 조건 중 한쪽의 데이터를 모두 가져온다.
      • LEFT, RIGHT, FULL OUTER JOIN이 존재한다. (FULL OUTER JOIN은 성능상 거의 사용하지 않는다.)
    • LEFT JOIN
      • 왼쪽 테이블 기준으로 오른쪽 테이블을 조합
      • 여러 테이블을 LEFT JOIN하려면, 첫 번째 테이블로 SELECT문에 가장 많은 열을 가져와야할 테이블을 우선적으로 사용한다.
      • 조인을 LEFT JOIN으로 했다면 나머지 조인도 LEFT JOIN으로 이어간다.
    -- 예) 1학년 학생의 이름과 지도교수명을 출력하라. 단, 지도교수가 지정되지 않은 학생도 출력되게 하라.
    
    SELECT 
    	STUDENT.NAME
    	, PROFESSOR.NAME 
    FROM 
    	STUDENT 
        	LEFT OUTER JOIN PROFESSOR -- STUDENT를 기준으로 왼쪽 조인
    		ON STUDENT.PID = PROFESSOR.ID 
    WHERE 
    	GRADE = 1
    • RIGHT JOIN
      • 오른쪽 테이블 기준으로 왼쪽 테이블을 조합
    -- 예) 1학년 학생의 이름과 지도교수명을 출력하라. 단, 지도교수가 지정되지 않은 학생도 출력되게 하라.
    
    SELECT 
    	STUDENT.NAME
    	, PROFESSOR.NAME 
    FROM 
    	STUDENT 
    	RIGHT OUTER JOIN PROFESSOR -- PROFESSOR를 기준으로 오른쪽 조인
    		ON STUDENT.PID = PROFESSOR.ID 
    WHERE 
    	GRADE = 1
    • FULL OUTER JOIN
      • 대부분 데이터베이스는 FULL OUTER JOIN을 지원하지 않는다.
    select
    	*
    from 
    	TBL_ONE T1 
    	FULL OUTER JOIN TBL_TWO T2 
    		on T1.SEQ = T2.SEQ
    
    -- 같은 구문
    -- UNION 은 DISTICT자동 포함이라, 따로 중복제거 안해줘도 자동으로 중복제거 해준다
    (
    select
    	*
    from 
    	TBL_ONE T1 
    	LEFT JOIN TBL_TWO T2 
    		on T1.SEQ = T2.SEQ
    ) 
    UNION 
    (
    select
    	*
    from 
    	TBL_ONE T1 
    	RIGHT JOIN TBL_TWO T2 
    		on T1.SEQ = T2.SEQ
    )

     

    • EXCLUSIVE LEFT JOIN
      • 어느 특정 테이블에만 있는 컬럼만 출력
      • 만약 2개의 테이블이 조인된다면 한개의 테이블에만 존재하는 데이터 출력
      • LEFT JOIN과 WHERE절을 이용해 만든 JOIN
    SELECT 
    	* 
    FROM 
    	TBL_ONE A 
    	LEFT JOIN TBL_TWO B
    		ON A.SEQ = B.SEQ 
    WHERE 
    	B.SEQ IS NULL 
    -- 조인한 B 테이블의 값이 null만 출력하라는 말은, 조인이 안된 A 레코드 나머지값만 출력하라는 말

     

    • SELF JOIN
      • 자기 자신의 테이블을 조인해서 관계가 있는 데이터 출력
    -- 예) 모든 사원에 대해 사원의 이름과 직속 상사의 이름을 검색 해라.
    -- EMPNAME 테이블에 어떤 사원의 MANAGER 번호가 같은 테이블 내에서 어떤 사원의 EMPNO와 같으면 그 사원이 직속 상관
    
    SELECT 
    	E.EMPNAME as 사원
    	, M.EMPNAME as 직속상관
    FROM 
    	EMPLOYEE E, EMPLOYEE M -- inner join
    WHERE 
    	E.MANAGER = M.EMPNO;

     

    • JOIN에서 DISTINCT 사용하기
     -- DISTINCT를 사용하면 성능이 느리다.
     SELECT 
     	DISTINCT T1.SEQ
     	, T2.NAME 
     FROM 
     	TBL_ONE T1 
     	INNER JOIN TBL_TWO T2 
     		ON T1.SEQ = T2.SEQ;
            
    -- JOIN 전 중복 제거가 성능을 높일 수 있다.
    -- JION 전에 1:1 관계를 만들어 JOIN을 실행
    select 
    	A.NM
    	, A.CD 
    from 
    	TBL_A A 
    	left join ( select distinct NM, CD from TBL_B ) as B 
    		on A.CD = B.CD
    
    -- 조인할 테이블에 먼저 distinct로 중복을 제거한 select문을 서브쿼리로 불러와 임시테이블로 만든뒤 조인한다

     

    • 그림으로 JOIN 정리하기

     

    출처)

    https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-JOIN-%EC%A1%B0%EC%9D%B8-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EA%B8%B0%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC

    'SQL' 카테고리의 다른 글

    [SQL] 키 정리  (0) 2023.11.07
    [SQL] 관계선 정리  (0) 2023.11.07
    sql html 태그 제거 쿼리문  (0) 2023.09.30
    SQL UNION 간단하게 알아보기  (0) 2023.09.30
    트랜잭션(Transaction)이란?  (0) 2023.09.30
Designed by Tistory.