관리 메뉴

TEAM EDA

[SQL 기초] 4장. 다수의 테이블 제어하기 본문

EDA Study/SQL

[SQL 기초] 4장. 다수의 테이블 제어하기

김현우 2020. 3. 19. 18:35

본 자료는 Elice Academy에서 진행한 SQL 기초라는 과목을 정리한 자료입니다. 

 

목차 

 

  • GROUP BY

  • HAVING

  • INNER JOIN

  • LEFT OUTER JOIN 

  • RIGHT OUTER JOIN

1. GROUP BY 

데이터를 GROUP 지어서 정보를 확인할 때 사용하는 명령어입니다. 예를 들어, 대여 정보가 저장되어있는 rental 테이블에서 각 회원이 책을 몇 번 대여하였는지 검색해보려고 할 때 사용합니다. 

rental 테이블에서 user_id 기준으로 데이터가 몇 개인지 그룹지어서 출력 

GROUP BY 절의 기본 문법으로는 SELECT 검색할 컬럼 FROM 테이블 GROUP BY 기준 컬럼입니다.

 

실습 1. 데이터 그룹 짓기 

문제 : rental테이블에는 어떤 사람이 어떤 책을 빌려 갔는지 저장되어있습니다. 이 정보를 이용해서 어떤 사람이 몇 권의 책을 빌려 갔는지 확인하려고 합니다. 앞서 배운 group by문을 이용해 유저별로 몇 권의 책을 빌렸는지 확인해 봅시다. 

 

지시사항

  • rental테이블의 user_id컬럼과 해당 컬럼값에 해당하는 데이터의 수를 차례대로 조회해 보세요.

 

-- 누가 몇권의 책을 빌려갔는지 조회해 봅시다.
SELECT user_id, count(*) FROM rental GROUP BY user_id; 

2. HAVING 

HAVING은 GROUP BY와 함께 사용하는 명령어로서 GROUP에 대해 조건을 적용하는 명령어입니다. 예를 들어, 대여 정보가 저장되어 있는 rental 테이블에서 각 회원이 책을 몇 번 대여하였는지 검색하고 2번 이상 대여한 사람만 출력해보는 경우입니다. 

rental 테이블에서 user_id 기준으로 데이터가 2개 이상인 데이터를 그룹지어 출력

GROUP BY/ HAVING절의 기본 문법은 아래와 같습니다. GROUP BY 이후에 HAVING을 통해서 조건을 걸어주면 됩니다. 

rental 테이블에서 user_id 기준으로 1개 초과의 데이터가 몇 개 있는지 검색

실습 2. 데이터 조건에 따라 그룹 짓기 

문제 : 엘리스에서는 올해에 2권 이상 빌린 사람들만 우수회원으로 정하고 관리하려고 합니다. 따라서 앞서 조회했던 리스트에서 2권 이상인 경우만 따로 조회해 봅시다. group by문 뒤에 having을 통해 조건을 걸어 조회하면 됩니다.

 

지시사항 

  • rental 테이블의 user_id 컬럼과 해당 컬럼값에 해당하는 데이터의 수를 차례대로 출력해 보세요.

  • 출력할 때 데이터의 수가 2 이상인 경우만 출력하도록 해 보세요.

-- 누가 몇권의 책을 빌려갔는지 조회해 봅시다.
-- 이때 두권 이상 빌린 사람들만 조회해 봅시다.

SELECT user_id, count(*) FROM rental GROUP BY user_id HAVING COUNT(*) >= 2

 

3. INNER JOIN

JOIN은 테이블을 연결할 때 사용하는 명령어입니다. INNER JOIN의 경우 교집합으로 연결하는 테이블과 연결되는 테이블 모두 값을 가지는 경우에 대해 연결됩니다.

 

위의 user 테이블과 rental 테이블을 user 테이블의 id와 rental 테이블의 user_id를 기준으로 연결하면, 아래와 같은 결과를 얻을 수 있습니다. 

JOIN 문의 기본 문법은 SELECT 검색할 컬럼 FROM 테이블 --- JOIN 테이블 ON 조건으로 이루어집니다.

rental 테이블의 user_id와 user 테이블의 id가 겹치도록 합침

실습 3. 2개의 테이블을 조건으로 연결하기 

문제 : id를 기준으로 연결하여 책을 빌려 간 유저의 정보만 조회되도록 해 봅시다.

지시사항 

  • *을 사용해 rental 테이블의 모든 컬럼을 조회하되 user테이블과 연결해 조회해 보세요.

  • 연결할 때에는 user테이블의 id와 rental테이블의 user_id를 기준으로 연결해 보세요.

SELECT * FROM rental INNER JOIN user ON rental.user_id = user.id

※참고 

조건 없이 연결하는 경우 조인되는 테이블의 한 로우에 합쳐지는 테이블의 모든 로우가 대응되게 됩니다. 

 

SELECT * FROM girl_group INNER JOIN hit_song;

4. LEFT OUTER JOIN

OUTER JOIN의 경우 INNER JOIN과 달리 하나의 테이블만을 기준으로 조인을 하는 명령어입니다. 예를 들어, 회원 정보를 저장하는 user 테이블에 대여 정보를 저장하는 rental 테이블을 user_id를 기준으로 연결해보는 경우가 있습니다.

user 테이블에 rental 테이블을 user_id 기준으로 연결
기존의 inner join과는 달리 user_id가 2인 경우가 남아있음

LEFT JOIN의 기본 문법은 INNER JOIN과 동일하고 INNER가 LEFT로 바뀌는 것만 달라지게 됩니다. 참고로 JOIN을 기준으로 LEFT면 왼쪽의 테이블이 RIGHT면 오른쪽의 테이블이 기준 테이블이 됩니다. 

 

5. RIGHT OUTER JOIN 

RIGHT JOIN의 경우 LEFT JOIN과 동일합니다. 하지만 차이점은 JOIN의 기준이 누가 되느냐입니다.

user 테이블에 rental 테이블을 user_id 기준으로 연결
LEFT JOIN의 결과
RIGHT JOIN의 결과

LEFT JOIN의 경우 user_id가 1, 2, 3이 모두 존재하지만 RIGHT JOIN의 경우 id가 1, 3만 있는 것을 확인할 수 있습니다. 

 

 

※참고 

SQL를 구성하는 모든 JOIN 

 

출처 : http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg