SQL 중급_JOIN

Eunjung-Cho·2021년 7월 5일
0

SQL

목록 보기
9/16
SELECT
FROM

INNER JOIN

테이블 합치기 구식 방법

SELECT *
FROM users, orders
WHERE users_id = orders_id

users 와 orders 테이블을 합쳐서 만들 수 있는 모든 경우의 수 행에서 users_id = orders_id 조건 뽑기

요즘: JOIN 사용

  • INNER JOIN에 또 INNER JOIN을 사용해도 괜찮다. 잇고 싶은 table들을 INNER JOIN 계속 써서 붙일 수 있다.
  • JOIN하고 싶은 Column들 간의 붙이고 싶은 Column명이 서로 다를 수도 있다. -> ERD 다이어그램으로 알 수 있다.
SELECT *
FROM users
	INNER JOIN orders ON users_id = orders_id

두 테이블을 붙이는 기준은 users_id = orders_id 이다.

  • 합치고 싶은 테이블: Orders, Customers
  • 기준 컬럼: Orders.CustomerID = Customers.CustomerID

tip: sql joins visualizer

HACKER RANK 문제풀이1

SELECT city.name
FROM city
    INNER JOIN country ON CITY.CountryCode = COUNTRY.Code
WHERE country.continent = "Africa"
  • 결과:

HACKER RANK 문제풀이2

SELECT SUM(city.population)
FROM city
    INNER JOIN country ON CITY.CountryCode = COUNTRY.Code
WHERE country.continent = "Asia"
  • 결과:

HACKER RANK 문제풀이3

SELECT country.continent, FLOOR(AVG(CITY.Population))
FROM city
    INNER JOIN country ON CITY.CountryCode = COUNTRY.Code
GROUP BY country.continent
  • 결과:

OUTER JOIN

  • INNER JOIN제외하고는 다 OUTER JOIN

LEFT JOIN

  • FROM 뒤에 있는 table이름이 기준 table
  • 대부분 LEFT JOIN만 쓴다.
  • LEFT OUTER JOIN이라고 써도 동일하게 작동
  • 한번이상 주문을 한 고객 정보 뽑기
SELECT * 
FROM Customers 
	INNER JOIN Orders ON Customers .CustomerID = Orders.CustomerID
  • 상품 주문 건수에 상관 없이 고객 정보까지 뽑기
SELECT * 
FROM Customers 
	LEFT JOIN Orders ON Customers .CustomerID = Orders.CustomerID
  • 한번도 상품을 주문해보지 않은 고객 정보만 뽑기
SELECT * 
FROM Customers 
	LEFT JOIN Orders ON Customers .CustomerID = Orders.CustomerID
WHERE OrderID IS NULL

LEETCODE 문제풀이1

SELECT customers.Name AS Customers
FROM Customers AS Customers
    LEFT JOIN orders ON customers.Id = orders.CustomerId
WHERE orders.id IS NULL

RIGHT JOIN

  • JOIN 뒤에 있는 table이름이 기준 table

SELF JOIN

  • 자기 자신을 조인

LEETCODE 문제풀이2

SELECT Employee.Name as Employee
FROM Employee
    INNER JOIN Employee as Manager ON Employee.managerid = Manager.id
WHERE Employee.Salary > Manager.Salary

여기서 굳이 원래 테이블에 Manager 테이블은 따로 AS로 명명해주었지만 Employee는 AS를 쓰지 않았다.
만약 AS를 하고 싶다면 table명 수정이 필수!:

SELECT e.Name as Employee
FROM Employee AS e
    INNER JOIN Employee as Manager ON e.managerid = Manager.id
WHERE e.Salary > Manager.Salary

  • 생각의 흐름:
    1. SELECT FROM 먼저 쓰기
    1. FROM에 어떤 TABLE 참고 할지 확인: Employee
    2. SELECT에 어떤걸 써야할지 확인: Employee.name AS Employee
    3. 조건 확인: employee.Salary > Manager.Salary
      SELECT Employee.Name as Employee
      FROM Employee
      WHERE employee.Salary > Manager.Salary
    4. 조건 확인 후 고쳐야 할 것 확인
      5-1. Manager 정보는 같은 테이블 안에 있음으로 SELF JOIN을 써야한다:
      FROM Employee
      	INNER JOIN Employee as Manager
      5-2. 합치는 기준을 확인한다: 원래 테이블의 managerid = Manager 테이블의 id
      FROM Employee
      	INNER JOIN Employee as Manager ON Employee.managerid = Manager.id

시간 더하기, 빼기 함수

DATE_ADD(기준날짜, INTERVAL): 시간 더하기

  • SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND): 현재 시간보다 1초 더하기
  • SELECT DATE_ADD(NOW(), INTERVAL 1 MINUNTE): 현재 시간보다 1분 더하기
  • SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR): 현재 시간보다 1시간 더하기
  • SELECT DATE_ADD(NOW(), INTERVAL 1 DAY): 현재 시간보다 1일 더하기
  • SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH): 현재 시간보다 1달 더하기
  • SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR): 현재 시간보다 1년 더하기
  • SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR): 현재 시간보다 1년 빼기

DATE_SUB(기준날짜, INTERVAL): 시간 빼기

  • SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND): 현재 시간보다 1초 빼기

LEETCODE 문제풀이3

SELECT today.id
FROM Weather AS yesterday
    INNER JOIN Weather AS today ON DATE_ADD(yesterday.recordDate, INTERVAL 1 DAY) = today.recordDate
WHERE today.temperature > yesterday.temperature
  • 생각의 흐름:

    1. SELECT FROM 먼저 쓰기
    2. FROM에 어떤 TABLE 참고 할지 확인: Weather
    3. SELECT에 어떤걸 써야할지 확인: id
    4. 조건 확인: 오늘 온도 > 어제 온도
    5. 조건 확인 후 고쳐야 할 것 확인
    5-1. 어제와 오늘의 비교니까 FROM에서 SELF JOIN써야 한다: Weather AS yesterday INNER JOIN Weather AS today -> 하나는 어제 Weather로 다른 하나는 오늘 Weather로
    5-2. 합치는 기준은 어제 날짜 + 1 = 오늘 날짜: 그냥 더하기 연산자로는 날짜 데이터가 늘어나지 않음으로 DATE_ADD함수 사용
    5-3. 마지막으로 출력해야 할 것은 오늘 Weather의 id: SELECT today.id
profile
IT컨설팅 데이터 분석가

0개의 댓글