SQL 3주차 강의 노트정리 [국비지원_스파르타 코딩클럽]

    728x90

    스파르타 코딩클럽 SQL 3주차 강의 '핵심' 노트정리

    스파르타 코딩클럽 SQL 3주차 강의 '핵심' 노트정리

    1. Join ~ on -

    : 공통된 정보(key값)를 이용해서 두 테이블을 한 테이블처럼 잇는 것
    ▶ select * from 테이블1
    join 테이블2(조인하고 싶은 테이블) on 테이블1. key필드명 = 테이블2.key필드명

    ★쿼리문 읽는 순서★

    1) from 테이블1 : 테이블1 전체 데이터를 가져온다.
    2) join 테이블2 : 테이블2를 테이블1에 붙일건데
    3) on 테이블1.key필드명 = 테이블2.key필드명 : 테이블1의 key필드와 같은 key필드를 가지는 테이블2를 붙인다.
    이 때 테이블명을 꼭 적어줘야 이 필드가 어떤 테이블에서 온 필드인지 구분 가능. 대신 약칭으로 적어줘도 됨.
    4) select * : 붙여진 모든 데이터를 출력한다.


    2. Join의 종류 (Left Join, Inner Join)


    * Left join

    Left Join

    : A테이블에 B테이블을 붙이는 것.
    : 어디에 → 무엇을 붙일건지 순서가 중요함.
    : 두 테이블을 Left Join 했을 때 어떤 데이터는 모든 필드가 채워져있지만,
    어떤 데이터는 해당 필드가 비어있을 수 있음.(NULL)

    ex. users 테이블과 point_users 테이블의 공통된 값인 user_id 필드로 두 테이블을 Left Join 하는 경우

    select * from users u
    left join point_users pu on u.user_id = pu.user_id


    : user_id가 users테이블과 point_users테이블의 공통된 값(key값)
    : user_id를 기준으로 users테이블에 point_users 테이블을 가져다 붙임.
    : user_id마다 point_users테이블에서 각각의 포인트 정보가 출력되는데
    아직 활동을 시작하지 않은 user_id들은 포인트가 존재하지 않기 때문에 포인트 관련 필드가 다 비어있음.(NULL)

    * Inner join

    Inner Join

    : A테이블과 B테이블의 공통된 데이터만 출력

    ex. users 테이블과 point_users 테이블의 공통된 값인 user_id 필드로 두 테이블을 Inner Join 하는 경우

    select * from users u
    inner join point_users pu on u.user_id = pu.user_id


    : user_id가 users테이블과 point_users테이블의 공통된 값(key값)
    : user_id를 기준으로 users테이블과 point_users 테이블의 공통된 값이 출력됨.
    : 그래서 두 테이블을 Inner Join 했을 때는 비어있는 데이터가 없음.


    3. 연습문제

    문제1) 웹개발, 앱개발 종합반week 별 체크인 수 세어보고, 보기좋게 정리하기
    (courses 테이블과 checkins 테이블 참고)


    1) courses 테이블과 checkins 테이블에 각각 어떤 필드들이 있는지 Select쿼리문으로 출력해보기
    : courses_id가 두 테이블의 공통된 값이면서
    웹개발, 앱개발 종합반(courses)별 체크인 수를 세는 것이 목적이니까 key값이 됨.

    01


    2) courses_id를 기준으로 Inner Join 함.

    select * from courses c1
    inner join checkins c2 on c1.course_id = c2.course_id


    여기서 courses 옆의 c1과 checkins 옆의 c2가 각 테이블의 약칭.
    한 번 이렇게 지정해주면 그 다음부터는 그 테이블을 약칭으로 적어줘도 됨.


    3) 웹개발, 종합반 별 + week별 체크인 수를 세어줘야 하기 때문에
    c1.title 과 c2.week 로 group by해줌.
    그 뒤에 Selec쿼리문으로 group by한 항목들과 count(*)를 출력해줌.
    ※ Select문에 group by한 항목들 적을 때도 꼭 약칭 같이 써줘야 함.
    이 필드가 어떤 테이블에서 가지고 온 필드인지 지정해주지 않으면 오류 날 수 있음!

    select c1.title, c2.week, count(*) from courses c1
    inner join checkins c2 on c1.course_id = c2.course_id 
    group by c1.title, c2.week

    01


    두 번째 슬라이드 결과를 보면 앱개발, 웹개발 title과 week가 혼잡하게 섞여있음.

    4) order by를 이용해서 title과 week를 정렬해주면 끝!

    select c1.title, c2.week, count(*) from courses c1
    inner join checkins c2 on c1.course_id = c2.course_id 
    group by c1.title, c2.week
    order by c1.title, c2.week



    문제2) 문제1에서 8월1일 이후에 구매한 고객들만 발라내보기.
    (courses 테이블에 checkins 테이블을 붙이고, checkins 테이블에 orders 테이블을 한 번 더 붙이기)


    1) Select문으로 orders 테이블 출력해서 checkins 테이블과의 공통된 값(key값)찾아보기


    2) checkins테이블과 orders 테이블을 users_id 기준으로 Inner Join 함.

    select * 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


    3) [ 8월 1일 이후에 구매한 ] 고객들을 세어줘야 하기 때문에 where절로 조건 적어줌.

    select * 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'


    4) 마지막으로 문제1번에서 했던 group by와 order by 적용해주고, Select 문에 적어주면 끝!

    select c1.title, c2.week, count(*) 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

    완성!


    5. Union

    : Select를 두 번 할 게 아니라 한 번에 모아서 보고싶은 경우에 사용.
    단, 조건이 있음. 노란색과 파란색 박스의 필드명이 같아야 함.

    방금 전 문제의 쿼리문을 이용해서 아래 ↓ 결과 만들기
    7월과 8월 데이터 쿼리문을 union all로 이어주기

    (
    	select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
    	inner join courses c on c2.course_id = c.course_id
    	inner join orders o on o.user_id = c2.user_id
    	where o.created_at < '2020-08-01'
    	group by c2.course_id, c2.week
      order by c2.course_id, c2.week
    )
    union all
    (
    	select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
    	inner join courses c on c2.course_id = c.course_id
    	inner join orders o on o.user_id = c2.user_id
    	where o.created_at > '2020-08-01'
    	group by c2.course_id, c2.week
      order by c2.course_id, c2.week
    )
    728x90

    댓글