[4일차] SQL 효율적으로 짜기(Subquery, Join)

jay bong·2024년 4월 18일

SQL

목록 보기
4/9
post-thumbnail

목차

  • Subquery

    • 기본 구조
  • join

    • left join
    • inner join
  • Point to check


  • Subquery
    연산이 한번에 끝나는 단순한 형태의 쿼리도 있지만, 문자 변경, 숫자 연산, 그 결과로 또 연산을 해야할 때도 있다. 그럴때는 하나의 쿼리문보다는 서브쿼리를 이용하는 것이 효율적이다. 서브쿼리가 자주 사용되는 상황은 다음과 같다.

    여러번의 연산을 수행해야 할 때
    조건문에 연산 결과를 사용해야 할 때
    조건에 Query 결과를 사용하고 싶을 때

    • 기본구조
      서브쿼리는 말 그대로 쿼리에 sub로 들어가는 구문이다.

      select column1, special_column 
      # 서브쿼리에서 설정한 별명을 다시 사용할 수 있다.
       from
        (
        select column1, column2 special_column
        from table1
        ) a 
        /* a라는 subquery를 설정한 후 쿼리문안에서 사용하였다. */

      다른 테이블에서 일부의 칼럼을 가져와 사용할 수 있다.

      select column1, column2
       from table1
       where column1 = (select col1 from table2)
      # 서브쿼리(table2 의 col1)을 가져온 후
      # table 1 과 같을 때(조건)
      # column1, column2를 가져온다.

      [실습]

      select restaurant_name,
          	 case when sum_of_quantity<=5 then 0.1
               	  when sum_of_quantity>15 and sum_of_price>=300000 then 0.005
               	  else 0.01 end ratio_of_add
                  # 각각의 값들을 기준으로 수수료를 설정하는 조건문 완성
      from 
      (
      select restaurant_name,
           sum(quantity) sum_of_quantity,
           sum(price) sum_of_price
      from food_orders
      group by 1
      ) a
      # food_orders에서 restaurant_name별로 quantity,price의 합계를 가져오는 서브쿼리 설정
      

      [결과]

  • join

    필요한 데이터들이 각기 다른 테이블에 있을 때, 테이블을 합칠 수 있다. left join과 inner join의 차이점은 사진으로 확인할 수 있다.

    • left join

      공통 컬럼 (키값) 을 기준으로, 하나의 테이블에 값이 없 더라도 모두 조회할 수 있다.

       select 조회 할 컬럼
       from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명

      [실습]

      select a.order_id,
          a.customer_id,
          a.restaurant_name,
          a.price,
          b.name,
          b.age,
          b.gender
      from food_orders a left join customers b on a.customer_id=b.customer_id

      [결과]

  • inner join

    공통 컬럼 (키값) 을 기준으로, 두 테이블 모두에 있는 값만 조회한다.

    select 조회 할 컬럼
     from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명

    [실습]

    select cuisine_type,
    	   sum(price) "원래 가격",
           sum(price)-sum(discount_price) "할인 적용 가격",
           sum(discount_price) "할인 가격" 
    from 
    (
    select a.cuisine_type,
          price,
          price*((b.age-50)*0.005) discount_price
    from food_orders a inner join customers b on a.customer_id=b.customer_id
    where b.age>=50
    )t
    # 서브쿼리에서 나이가 50세 이상일 때, 가격과, 할인 가격을 설정한다
    # 이후 본 쿼리에서 원래 가격, 할인 적용가격, 할인 가격을 가져온다.
    group by 1 #cuisine_type별로 그룹화
    order by 4 desc
    

    [결과]


  • Point to check

    • 서브 쿼리문에서 만약 별명을 한글로 작성한다면 그 값들을 외부에서 사용하려고 하면 어떻게 해야하는가?

      -> 만약 특수문자가 포함되어 큰 따옴표로 묶었다면 큰 따옴표까지 적어서 사용하면 되고 만약 한글과 언더바로만 이루어져있다면 그냥 영문 별명과 동일하게 사용해도 된다.

    • join을 사용할 때, 값이 완전히 같다면 컬럼명이 달라도 된다.

profile
Fly High

0개의 댓글