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
DATE_ADD(기준 날짜, INTERVAL) : 기준 날짜에 INTERVAL만큼 더함
DATE_SUB(기준 날짜, INTERVAL) : 기준 날짜에 INTERVAL만큼 뺌
JOIN은 테이블을 옆으로 붙이고 UNION은 위아래로 붙임
기본적으로 Union은 Union Distinct를 줄여서 쓰는 개념이다. 즉, 중복을 허락하지 않는다.
FULL OUTER JOIN은 MySQL에서 지원 안함.
그래서 LEFT JOIN UNION RIGHT JOIN 활용
UNION 시에 칼럼명은 같아야함. 만약 다르다면 as로 같게 만들어줘야 함
ORDER BY 구문은 UNION이 끝나고 나서 사용 가능
SELECT a.name
FROM city a
INNER JOIN country b
ON a.countrycode = b.code
WHERE b.continent = "Africa"
SELECT SUM(a.population)
FROM city a
INNER JOIN country b
ON a.countrycode = b.code
WHERE b.continent = 'Asia'
SELECT b.continent, FLOOR(AVG(a.population))
FROM city a
INNER JOIN country b
ON a.countrycode = b.code
GROUP BY b.continent
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에서는 테이블 alias까지 맞춰줘야 함
SELECT a.name Customers
FROM customers a
LEFT JOIN orders b
ON a.id = b.customerid
WHERE b.customerid IS NULL
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