스터디/SQL

[MySQL] ch08_조인문 정리/ INNER JOIN, OUTER JOIN(LEFH JOIN, RIGHT JOIN, FULL JOIN), SELF JOIN

skyggg3 2022. 3. 22. 23:29

본 글은 인프런의 '[백문이불여일타] 데이터 분석을 위한 중급 SQL'강의를 듣고 직접 실습한 내용입니다.

 

[백문이불여일타] 데이터 분석을 위한 중급 SQL - 인프런 | 강의

인프런 누적 수강생 8000명 이상, 풍부한 온/오프라인 강의 경험을 가진 데이터리안의 SQL 중급 강의. SQL 중급 이론을 배우고, 실습 문제를 함께 풀어봅니다., - 강의 소개 | 인프런...

www.inflearn.com

 

Dashboard | HackerRank

Join over 16 million developers in solving code challenges on HackerRank, one of the best ways to prepare for programming interviews.

www.hackerrank.com

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

SQL Joins Visualizer

Please select how do you want to do SQL JOIN between two table Copy SQL

sql-joins.leopard.in.ua

 

 

RDB(Relational Database)

관계형 데이터 모델(테이블의 행과 행이 연결되는 관계)을 기초로 두고 모든 데이터를 2차원 테이블 형태로 표현하는 데이터베이스

 

고객 아이디 연락처 주소 구매 상품 가격 개수 결제수단
A 010-0000-1234 사동 NULL NULL NULL NULL
B 010-0000-5678 월피동 사료 30000 1 국민카드
B 010-0000-5678 월피동 휴지 10000 1 휴대폰결제
B 010-0000-5678 월피동 폼클렌징 12000 2 카카오페이
B 010-0000-5678 월피동 냄비 30000 1 카카오페이
  • A는 가입은 했는데 구매 이력이 없는 상태
  • B는 가입하자마자 여러가지 상품 구매
  • A의 칼럼에 NULL값이 들어가서 공간 낭비가 되고 있음
  • B의 경우 중복 해서 저장 할 필요가 없는 정보가 계속 저장되어 공간 낭비가 되고 있음 테이블을 나눠서 저장하고 JOIN시켜서 연결한다.

 

Users

id 고객 아이디 연락처 주소
1 A 010-0000-1234 사동
2 B 010-0000-5678 월피동

 

Orders

userid  구매 상품 가격 개수 결제수단
2 사료 30000 1 국민카드
2 휴지 10000 1 휴대폰결제
2 폼클렌징 12000 2 카카오페이
2 냄비 30000 1 카카오페이

 

 

RDBMS(Relational Database Management System)

관계형 데이터베이스를 생성하고 수정하고 관리할 수 있는 소프트웨어

ex) MySQL, Oracle

 

 

JOIN문

  • INNER JOIN(교집합)

     관련성이 있는 2개 이상의 테이블을 이어 붙여서 흩어진 정보들을 한번에 가져오기 위해 사용한다.

  • 기준 테이블과 조인 테이블 모두 데이터가 존재해야 조회 가능
  • 한 번도 주문한 적 없는 user는 출력되지 않는다.

 

SELECT *
FROM Orders
INNER JOIN Customers ON Orders.CustomerID  = Customers.CustomerID

 

  • OUTER JOIN
    • LEFT JOIN
      • 첫 번째 테이블은 무조건 표시하고, 두 번째 테이블에 매치되는 레코드가 없으면 NULL로 표시
      • 한 번도 주문한 적 없는 user가 표시됨
    • RIGHT JOIN
      • LEFT JOIN과 반대, 두 번째 테이블을 기준으로 첫 번째 테이블의 값이 있으면 나오고 없으면 NULL

 

SELECT *
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID  = Orders.CustomerID;

 

SELECT *
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID  = Orders.CustomerID;

 

  • FULL JOIN(합집합)
    • 첫 번째 테이블과 두 번째 테이블을 연결하고 중복된 데이터는 삭제
    • MySQL에서는 지원하지 않으므로 구현하려면 LEFT JOIN + UNION + RIGHT JOIN으로 사용해야 한다.
    •  

 

  • SELF JOIN (자기 자신에게 테이블을 조인)
    • 헷갈리므로 테이블에 별칭을 붙이자

해커링크 문제풀이

 

1. African Cities

SELECT city.name
FROM city
     INNER JOIN country ON city.countrycode = country.code
WHERE country.continent = 'Africa';

 

 

2. Population Census

 

SELECT SUM(city.population)
FROM city
     INNER JOIN country ON city.countryCode = country.code
WHERE country.continent = 'Asia'

 

3. Average Population of Each Continent

SELECT country.continent
      , FLOOR(AVG(city.population))
FROM city
     INNER JOIN country ON city.countrycode = country.code
GROUP BY country.continent;

 

리트코드 문제풀이

 

4. 183. Customers Who Never Order

SELECT Customers.name AS Customers
FROM Customers
     LEFT JOIN Orders ON Customers.id = Orders.customerId 
WHERE Orders.id IS NULL;

 

 

5. 181. Employees Earning More Than Their Managers

SELECT Employee.name AS Employee
FROM Employee
     INNER JOIN Employee AS Manager ON Employee.managerid = Manager.id
WHERE  Employee.salary  > Manager.salary;

'스터디 > SQL' 카테고리의 다른 글

[MySQL] ch10_UNION, UNION ALL  (0) 2022.03.24
[MySQL] ch09_ DATE_ADD, DATE_SUB  (0) 2022.03.23
[MySQL] ch07_조건문(CASE)  (0) 2022.03.21
[MySQL] ch06_GROUP BY, HAVING, AS  (0) 2022.03.18
[MySQL] ch05_집계 함수(COUNT, SUM, AVG, MAX, MIN)  (0) 2022.03.18