티스토리 뷰

SQL

SQL 3주차 개발일지

김기지 2022. 9. 3. 17:58

● 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으로 묶어준 후 마지막에 써준다.

 

728x90

'SQL' 카테고리의 다른 글

SQL 4주차 개발일지  (0) 2022.09.03
SQL 2주차 개발일지  (0) 2022.08.30
SQL 1주차 개발일지  (0) 2022.08.18