ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL - SELECT(3주차)
    DB 2023. 6. 2. 14:49
    728x90

     수업내용

    • join 문
    • union

     

    join 문

    SELECT
    [테이블 컬럼 ( 필드 ) ], [테이블 컬럼 ( 필드 )  ], ...
    FROM [TABLE1 명]
    JOIN(INNER JOIN, LEFT JOIN, OUTTER JOIN ..)  [TABLE2 명] ON 절(join 조건절)
    WHERE 절
    GROUP BY 절
    ...
    ORDER BY [테이블 컬럼 (필드)] (DESC, ASC), ...

    join문은 내가 조회하고자하는 내용이 2개의 테이블에 존재할 때, 사용한다.

    먼저 on 절에 두개의 테이블이 어떠한 관계로 연결을 지어주어 테이블을 합칠 것인지를 정해준다.

    sql의 실행순서를 한번 정리해보자

     

    sql 실행순서

    from + join (어떤 테이블에서) 

    ▶ on + where(어떤 조건을 가지고 <filter>) 

    ▶ group by (무엇을 기준으로 묶어서)

    ▶ select (조회할 것인지)

    ▶ order by (무엇을 기준으로 순서를 정해서)

     

    풀어보기
    enrolled_id별 수강완료(done=1)한 강의 갯수를 세어보고,
    완료한 강의 수가 많은 순서대로 정렬해보기.
    user_id도 같이 출력되어야 한다.


    SELECT * FROM enrolleds ;
    >> enrolled_id로 두 테이블이 묶여 있는 걸을 확인
         여기에는 user_id도 존재한다!


    SELECT * FROM enrolleds_detail ;
    >> done 에 대한 내용은 enrolleds_detail 에 존재한다.


    SELECT e.enrolled_id, e.user_id , count(ed.done) AS max_count
    FROM enrolleds_detail ed
    INNER JOIN enrolleds e
    ON e.enrolled_id = ed.enrolled_id
    GROUP BY e.enrolled_id;
    >> 현재 enrolled_id별로 count 되어 나온다.
         하지만 여기에는 done 값이 0, 1 모두 포함되어 있다!


    SELECT e.enrolled_id, e.user_id , count(ed.done) AS max_count
    FROM enrolleds_detail ed
    inner JOIN enrolleds e
    ON e.enrolled_id = ed.enrolled_id
    WHERE ed.done = 1
    GROUP BY e.enrolled_id
    ORDER BY max_count DESC;
    결과 도출 완료!

     

    union 문

    ( [테이블 조회내역] )
    UNION ALL
    ( [테이블 조회내역] )

    동일한 FIELD를 가진 테이블 두개를 단순히 붙이고 싶다면?

    이럴 때, 사용하는 것이 UNION 문법이다.

    SELECT '7월' AS month , c1.title, c2.week, count(*) as cnt
    FROM courses c1
    INNER JOIN checkins c2
    ON c1.course_id = c2.course_id
    INNER JOIN orders o
    ON c2.user_id = o.user_id
    WHERE o.created_at < '2020-08-01'
    GROUP BY c1.title, c2.week
    ORDER BY c1.title, c2.week;

    >> 7월에 대한 반별 수강평 갯수







    SELECT '8월' AS month , c1.title, c2.week, count(*) as cnt
    FROM courses c1
    INNER JOIN checkins c2
    ON c1.course_id = c2.course_id
    INNER JOIN  orders o
    ON c2.user_id = o.user_id
    WHERE o.created_at >= '2020-08-01'
    GROUP BY c1.title, c2.week
    ORDER BY c1.title, c2.week;

    >> 8월에 대한 반별 수강평 갯수






    두개의 만들어진 결과를 합치기 위해선?
    (
    SELECT '7월' AS month , c1.title, c2.week, count(*) as cnt
    FROM courses c1
    INNER JOIN checkins c2
    ON c1.course_id = c2.course_id
    INNER JOIN orders o
    ON c2.user_id = o.user_id
    WHERE o.created_at < '2020-08-01'
    GROUP BY c1.title, c2.week
    ORDER BY c1.title, c2.week;
    )
    UNION ALL
    (
    SELECT '8월' AS month , c1.title, c2.week, count(*) as cnt
    FROM courses c1
    INNER JOIN checkins c2
    ON c1.course_id = c2.course_id
    INNER JOIN  orders o
    ON c2.user_id = o.user_id
    WHERE o.created_at >= '2020-08-01'
    GROUP BY c1.title, c2.week
    ORDER BY c1.title, c2.week;
    )

     

    'DB' 카테고리의 다른 글

    index - mysql  (0) 2023.08.13
    MySQL - SELECT(4주차)  (0) 2023.06.02
    MySQL - SELECT(2주차)  (0) 2023.06.02
    MySQL - SELECT(1주차)  (0) 2023.06.01
Designed by Tistory.