SQL (4) join

이석영·2021년 4월 30일
0

SQL

목록 보기
4/6

join

  • DB에 있는 여러 테이블을 이어주기위해 사용한다.
  • 테이블을 연결함으로써 여러 정보를 한눈에 보기좋다
  • 두 테이블의 공통된 정보(key값)을 기준으로 테이블을 연결한다. 엑셀의 vlookup과 동일한 기능

join의 종류 : left join, inner join

1. left join

  • 아래 그림과 같이 왼쪽에있는 테이블(A)에 key값을 연결시켜 다른 테이블(B)를 연결할 때 사용

    users 테이블과 orders 테이블을 이어보았다. 아래에 NULL이 보이는데 모든 유저가 코스를 등록한 것이 아니므로 미등록 유저의 orders테이블 정보는 NULL로 표시되었다.

2. inner join

  • 두 테이블의 교집합을 보고싶다면 inner join을 사용한다. 이런 경우에는 NULL 값이 발생할일이 없다.

실습

주문 정보에 유저 정보를 연결해 네이버 이메일을 사용하는 유저 중, 성씨별 주문건수를 세어보겠다.
아래 쿼리가 실행되는 순서는 다음과 같다.

  1. from orders o: orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙인다.
  2. inner join users u on o.user_id = u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users 테이블 데이터를 붙인다. (*users 테이블에 u라는 별칭을 붙인다)
  3. where u.email like '%naver.com': users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져온다.
  4. group by u.name: users 테이블의 name값이 같은 값들을 뭉쳐준다.
  5. select u.name, count(u.name) as count_name : users 테이블의 name필드와 name 필드를 기준으로 뭉쳐진 갯수를 세어서 출력해준다.

웹개발, 앱개발 종합반의 week별 체크인 수를 세어보자.
그리고 결과에서 8월 1일 구매한 고객들만 추려보자

  • 우선 웹/앱개발 종합반의 week별 체크인 수만 구해보면 아래와 같고 group by나 order by는 콤마를 이용해 두개 이상의 필드에 적용할 수 있음을 확인할 수 있다.
  • 그 후 inner join을 이용해 orders 테이블을 한번 더 이어준다. 그리고 where 명령어로 8월 1일 이후 생성된 주문에 대해서만 걸러주면 끝

7월10일 ~ 7월19일에 가입한 고객 중, 포인트를 가진 고객의 숫자, 그리고 전체 숫자, 그리고 비율 확인

  • count는 NULL을 세지않는다는 특성을 이용해 아래와 같이 구할 수 있다.

Union

필드가 같은 테이블에 대해서 이어붙여서 보고싶은 경우가 있다. 이런 경우 아래와 같이 union all이란 명령어를 사용한다.

profile
원하는 대로 살자

0개의 댓글