본문 바로가기
Database/MySQL

[MySQL] - JOIN / SUBQUERY

by nam_ji 2024. 1. 6.

JOIN / SUBQUERY 사용해보기

JOIN

  • 조인은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말합니다.
  • INNER JOIN(내부조인) : 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 합니다.
  • OUTER JOIN(외부조인) : 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나옵니다.
  • CROSS JOIN(상호조인) : 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능입니다.
  • SELF JOIN(자체 조인) : 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용합니다.
    • INNER JOIN(내부조인) : 두 테이블을 연결할 때 가장 많이 사용하는 것이 내부조인입니다.
      SELECT <열 목록>
      FROM <첫 번째 테이블>
          INNER JOIN <두 번째 테이블>
          ON <조인 조건>
      [WHERE 검색 조건]
      
      -- INNER JOIN을 JOIN이라고만 써도 INNER JOIN으로 인식합니다.​
    • OUTER JOIN(외부조인) : 내부 조인은 두 테이블에 모두 데이터가 있어야 하지만, 외부 조인은 한쪽에만 데이터가 있어도 결과가 나옵니다.
    • LEFT OUTER JOIN : 왼쪽 테이블의 모든 값이 출력되는 조인
    • RIGHT OUTER JOIN : 오른쪽 테이블의 모든 값이 출력되는 조인
    • FULL OUTER JOIN : 왼쪽 또는 오른쪽 테이블의 모든 값이 출력되는 조인
      SELECT <열 목록>
      FROM <첫 번째 테이블(LEFT 테이블)>
          <LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
           ON <조인 조건>
      [WHERE 검색 조건]​​
       
    • CROSS JOIN(상호조인) : 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능입니다.
    • 상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수만큼 됩니다.
    • 카티션 곱(Cartesian Product)라고도 합니다.
    • SELECT *
      FROM <첫 번째 테이블>
          CROSS JOIN <두 번째 테이블>​
       
    • SELF JOIN(자체조인) : 자체 조인은 자기 자신과 조인하므로 1개의 테이블을 사용합니다.
    • 별도의 문법이 있는 것은 아니고 1개로 조인하면 자체 조인이 됩니다.
    • SELECT <열 목록>
      FROM <테이블> 별칭A
          INNER JOIN <테이블> 별칭B
      [WHERE 검색 조건]​

SubQuery

  • 서브쿼리란 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말합니다.
  • 서브쿼리는 메인쿼리가 서브쿼리를 포함하는 종속적인 관계입니다.
  • -- SubQuery를 사용하는 겨우?
    -- 여러번의 연산을 수행해야 할 때
    -- 조건문에 연산 결과를 사용해야 할 때
    -- 조건에 Query 결과를 사용하고 싶을 때
    
    -- SubQuery 기본 문법
    
    -- select column1, special_column
    -- from
    --     ( /* subquery */
    --     select column1, column2 special_column
    --     from table1
    --     ) a
    -- a는 서브쿼리의 이름이라고 생각하면 됩니다.;
        
    -- select column1, column2
    -- from table1
    -- where column1 = (select col1 from table2);
    
    SELECT 컬럼명1 / 컬럼명2
    FROM 
    (
    SELECT 컬럼명1, 컬럼명2
    FROM 테이블명
    ) 서브쿼리명;
    
    SELECT 컬럼명1, 컬럼명2, 컬럼명3
    FROM (
    SELECT 컬럼명1, 컬럼명2, 컬럼명3
    FROM 테이블명) 서브쿼리명;
    
    SELECT 컬럼명1, 컬럼명2, if(조건, 조건 충족 시, 조건 충족 못할 시)
    FROM (
    SELECT 컬럼명1, 컬럼명2, 컬럼명3-25(컬럼명으로 계산하기)
    FROM 테이블명) 서브쿼리명;
    
    SELECT 컬럼명1, 컬럼명2, 컬럼명3-25(컬럼명으로 계산하기)
    FROM 테이블명;
    
    select 컬럼명1,
           지정이름*지정이름2 이름지정
    from 
    (
    select 컬럼명1,
           case when 지정이름<5000 then 0.005
                when 지정이름 between 5000 and 19999 then 0.01
                when 지정이름 between 20000 and 29999 then 0.02
                else 0.03 end 지정이름2,
           지정이름
    from 
    (
    select 컬럼명1, avg(컬럼명2/컬럼명3) 지정이름
    from 테이블명
    group by 1
    ) 서브쿼리명1
    ) 서브쿼리명2;