본문 바로가기
스파르타/SQL

220311. 엑셀보다 쉬운 SQL 3주차 - Join쿼리, Union

by h.단디 2022. 3. 11.

 


 

한 테이블에 모든 정보 한꺼번에 담으면 되지 왜 굳이 따로 정리해둬 ?

-> 불필요하게 테이블의 크기가 커짐. 데이터를 종류별로 쪼개서 관리하고 기준이 되는 key와 Join을 통해 연결해서 읽어오는게 효율적임.

 


 

Join

두 테이블에 공통된 정보(key값)을 기준으로 테이블을 연결해서 한 테이블처럼 보이게 만드는 것

 

 

left join - 왼쪽에 있는 테이블을 기준으로 다른 테이블 데이터를 붙임. 따라서 '어디에&무엇을 붙일지' 순서가 매우 중요!

user_id를 key값으로 해서 users 테이블에 point_users 테이블 데이터를 붙임. 

null : 아직 수강을 시작하지 않는 등의 이유로 point가 쌓이지 않은 user라서 null 값으로 표시됨.

 

 

inner join

user_id를 key값으로 해서 users 테이블에 point_users 테이블 데이터를 붙임.

이 때, 두 테이블에서 모두 데이터를 갖고 있는 데이터만 출력함 -> 교집합처럼! (null값이 없음)

 

 


inner join 익숙해지기

 

  • [실습] orders 테이블에 users 테이블 연결해보기 (inner join으로)

  • [실습] checkins 테이블에 users 테이블 연결해보기 (inner join으로)

  • [실습] enrolleds 테이블에 courses 테이블 연결해보기 (inner join으로)

 

 

 

inner join이랑 다른 쿼리문 함께 써보기

일단 join한 후에는 하나의 테이블이라 생각하고 거기서 새로운 쿼리문 추가하면 됨!

 

  • checkins 테이블에 courses 테이블 연결해서 통계치 내보기 - 과목별 오늘의 다짐 갯수 세어보기 

 

  • point_users 테이블에 users 테이블 연결해서 순서대로 정렬해보기 - 많은 포인트를 얻은 순서대로 유저 데이터 정렬해서 보기

 

  • orders 테이블에 users 테이블 연결해서 통계치 내보기 - 네이버 이메일 사용하는 유저의 성씨별 주문건수 세어보기

 

  • [퀴즈] Join 연습1 - 결제 수단 별 유저 포인트의 평균값 구해보기

 

  • [퀴즈] Join 연습2 - 결제하고 시작하지 않은 유저들을 성씨별로 세어보기

 

  • [퀴즈] Join 연습3 - 과목 별로 시작하지 않은 유저들을 세어보기

 

  • [퀴즈] Join 연습4 - 웹개발, 앱개발 종합반의 week 별 체크인 수를 세어볼까요? 보기 좋게 정리해보기!

 

  • [퀴즈] Join 연습5 - 연습4번에서, 8월 1일 이후에 구매한 고객들만 발라내어 보세요!

 


left join 익숙해지기

한 쪽에는 데이터가 없고 한 쪽에는 데이터가 있는데 통계치를 내고 싶을 때 쓰임!

 

아직 point 없는 user만 골라보기 -> where절로 골라내는데 이때 null은 대문자 NULL로.

 

수업 시작한, 즉 point가 발생한 user만 골라보기 -> in not NULL

 

  • [퀴즈] 7월10일 ~ 7월19일에 가입한 고객 중, 포인트를 가진 고객의 숫자, 그리고 전체 숫자, 그리고 비율을 보고 싶어요!

💡count는 NULL을 세지 않는다

 

 


 

 

union

select를 두번하는 방법 대신, 한번에 모아서 볼 때! (필드명이 같아야 함)

 

💡 union 을 사용하면 내부 정렬 안 먹힘. 그래서 사실 order by 지워도 결과는 변함없음. 이거 해결하는 법은 다음주차에 배움!

 

 


 

[숙제] enrolled_id별 수강완료(done=1)한 강의 갯수를 세어보고, 완료한 강의 수가 많은 순서대로 정렬해보기.

           user_id도 같이 출력되어야 한다.