티스토리 뷰
● JOIN : 테이블과 테이블을 붙이는 것.
두 테이블이 공통된 정보(key값)를 가지고 있어야함.
종류 : Left join, Inner join
-Left join : a테이블을 기준으로 b를 붙인다.
ex) users테이블에 point_users테이블 붙이기
1. 각 테이블을 실행시킨다.
2. 두 테이블이 공통적으로 갖고있는 필드를 찾는다.
3. 공통필드로 붙여준다.
selesct * from users u (별칭 붙여주기)
left join point_users pu on u.user_id = pu.user_id
→pu의 user_id를 u의 user_id에 이어준다
left join은 두 테이블의 공통 부분을 붙여주기 때문에 결과값이 없는 경우도 있다. (NULL)
● Inner join : 두 부분의 교집합 부분만 출력
(입력방법은 left join과 동일)
● 다른 문법과 함께 써보기
1) checkins 테이블에 course테이블을 연결하여 과목별 갯수 세기
- ① 두 테이블을 course_id로 inner join해준다.
② group by 를 이용하여 과목별로 묶어준다.
※여기서 지칭을 명확하게 해주지 않을 경우 오류가 뜬다. 지칭은 꼭 해주기!
2) point_users테이블에 users테이블을 연결해서 포인트가 많은 순서대로 정렬하기
-① 두 테이블을 course_id로 inner join
② 과목별로 group by해준다.
③ course_id와 count(*)로 출력
④ order by로 포인트가 많은 순서대로 정렬한다.
※ count(*)에 별칭을 달아주면 더 깔끔하게 출력된다.
3) orders테이블에 users테이블 연결해서 네이버사용자 성씨별 주문건수 세기
- ① email로 inner join해준다.
② where절을 용하여 email이 네이버인것만 골라준다.
③ 성씨별로 group by해준다.
여기서 쿼리가 실행되는 순서는 from - join - where - group by - select
순서 바꿔서 실행하면 오류남!
● left join 연습하기
- left join은 어디에 무엇을 붙여주는지 순서가 중요하다.
ex) users테이블에 point_users테이블을 붙여 회원 중 포인트가 없는 사람 추려내기
- ① user_id로 left join해준다.
② 포인트가 없는 경우 point_user_id가 NULL로 나오기 때문에
point_user_id 가 NULL인 경우만 출력한다. (포인트가 있는 사람만 출력시엔 is not NULL)
ex) 7/10 - 7/19 가입 유저 중, 포인트를 가진 고객의 수, 전체 수, 비율 구하기
- ① users테이블과 point_users테이블을 user_id로 left join해준다.
② created_at이 '2020-07-10' '2020-07-20'사이인 경우만 골라낸다.
③ 포인트를 가진 고객의 수 = count(pu.point_user_id) as pnt_user_cnt
전체 수 = count(*) as tot_user_cnt
비율 = count(pu.point_user_id) / count(*)
● UNION : 결과물 합치기 (두 테이블의 결과를 이어서 한번에 출력하기)
- (a)
union all
(b)
여기서 괄호 안 내용물은 들여쓰기를 꼭 해준다.
union 시 각 테이블 안에 들어있는 order by는 실행되지 않기 때문에 지워주고
union으로 묶어준 후 마지막에 써준다.
'SQL' 카테고리의 다른 글
SQL 4주차 개발일지 (0) | 2022.09.03 |
---|---|
SQL 2주차 개발일지 (0) | 2022.08.30 |
SQL 1주차 개발일지 (0) | 2022.08.18 |