[TIL] 22.10.08~10

문종현·2022년 10월 8일
0

TIL

목록 보기
12/119

👉 오늘 한 일

  • SQL 중급 수강

SQL

JOIN

RDB(Relational Database) : 데이터들을 쭉 쌓는게 아니라, 테이블 간의 관계를 정의해서 연결함

  • 테이블 간의 연결을 위해 조인 필요

cartesian product(카테시안 곱) : From절에 2개 이상의 Table이 있을때 두 Table 사이에 유효 join 조건을 적지 않았을때 해당 테이블에 대한 모든 데이터를 전부 결합하여 Table에 존재하는 행 갯수를 곱한 만큼 결과값을 반환

  • cross join과 같음
-- 카테시안 곱
SELECT *
FROM users, orders
-- cross join
SELECT *
FROM users 
CROSS JOIN orders

sql join visualizer, join 시각화 사이트
https://sql-joins.leopard.in.ua/

INNER JOIN

OUTER JOIN(LEFT, RIGHT)

FULL OUTER JOIN

MySQL 시간 더하기, 빼기

DATE_ADD(기준 날짜, INTERVAL) : 기준 날짜에 INTERVAL만큼 더함

  • SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 MINUTE)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 DAY)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR)
  • SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR)

DATE_SUB(기준 날짜, INTERVAL) : 기준 날짜에 INTERVAL만큼 뺌

  • SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND)
    • SELECT DATE_ADD(NOW(), INTERVAL -1 SECOND)과 같음

UNION, UNION ALL

JOIN은 테이블을 옆으로 붙이고 UNION은 위아래로 붙임

기본적으로 Union은 Union Distinct를 줄여서 쓰는 개념이다. 즉, 중복을 허락하지 않는다.

  • UNION은 중복값을 없애고 합침
  • UNION ALL은 중복값을 포함해서 합침
  • UNION의 경우 중복을 제거하는 작업을 시행해주기 때문에 UNION ALL 에 비해 처리 속도가 느림. 그렇기 때문에 중복되어도 크게 이상이 없는 경우에는 되도록 UNION ALL 을 사용해주는 것이 좋음.

FULL OUTER JOIN은 MySQL에서 지원 안함.
그래서 LEFT JOIN UNION RIGHT JOIN 활용

UNION 시에 칼럼명은 같아야함. 만약 다르다면 as로 같게 만들어줘야 함
ORDER BY 구문은 UNION이 끝나고 나서 사용 가능

Hackerrank 문제풀이

  1. African Cities
SELECT a.name
FROM city a
INNER JOIN country b
ON a.countrycode = b.code
WHERE b.continent = "Africa"
  1. Population Census
SELECT SUM(a.population)
FROM city a
INNER JOIN country b
ON a.countrycode = b.code
WHERE b.continent = 'Asia'
  1. Average Population of Each Continent
SELECT b.continent, FLOOR(AVG(a.population))
FROM city a
INNER JOIN country b
ON a.countrycode = b.code
GROUP BY b.continent
  1. Symmetric Pairs
SELECT *
FROM functions
GROUP BY x, y
HAVING COUNT(x = y) >= 2

UNION

SELECT a.*
FROM functions a
INNER JOIN functions b
ON a.x = b.y AND b.x = a.y
WHERE a.x != a.y AND a.x <= a.y -- => a.x < a.y
ORDER BY x, y

leetcode 문제풀이

leetcode에서는 테이블 alias까지 맞춰줘야 함

  1. Customers Who Never Order
SELECT a.name Customers
FROM customers a
LEFT JOIN orders b
ON a.id = b.customerid
WHERE b.customerid IS NULL
  1. Employees Earning More Than Their Managers
SELECT a.name Employee
FROM employee a
JOIN employee m
ON a.managerid = m.id
WHERE a.salary > m.salary
/* 오답 케이스. 테스트 케이스에서는 날짜 순으로 정렬이 되어있지 않아서 틀리게 됨
SELECT today.id
FROM weather today
JOIN weather previous
ON today.recorddate = previous.recorddate + 1
WHERE today.temperature > previous.temperature

join 테이블
["id", "recordDate", "temperature", "id", "recordDate", "temperature"]
[[2, "2015-01-02", 25, 1, "2015-01-01", 10]
 [3, "2015-01-03", 20, 2, "2015-01-02", 25]
 [4, "2015-01-04", 30, 3, "2015-01-03", 20]
 */
 
SELECT today.id Id
FROM weather today
JOIN weather previous
ON today.recorddate = DATE_ADD(previous.recorddate, INTERVAL 1 DAY)
WHERE today.temperature > previous.temperature
profile
자라나라 새싹새싹🌱

0개의 댓글