JOIN
✅ JOIN
to join tables
- table을 JOIN할 때, table끼리는 1:N 관계이다.
- FK로 JOIN한다.
- ON: join하는 조건인데, FK로 join
✅ INNER JOIN
- 두 table간 겹치는 부분을 return하는 JOIN
- 공통 컬럼명
가장 기본적인 JOIN은 INNER JOIN
- CROSS JOIN
- EQUI JOIN
- NON-EQUI JOIN
- NATURAL JOIN
1
2
3
4
SELECT *
FROM group_singer
INNER JOIN buy_history
ON buy_history.mem_id = group_singer.mem_id; --mem.id로 연결(FK)
✔️ alias 사용(줄임말)
1
2
3
4
SELECT G.mem_name, B.prod_name
FROM group_singer G
INNER JOIN buy_history B
ON B.mem_id = G.mem_id;
✔️ sub query
서울/경기 출신 그룹 중, 소모한 비용 SUM이 10000이상 되는 그룹이 몇 개인지 반환
1
2
3
4
5
6
7
8
9
10
SELECT COUNT(*)
FROM(
SELECT G.mem_number, G.mem_id, G.addr, SUM(B.price) as total_price
FROM group_singer G
INNER JOIN buy_history B
ON G.mem_id = B.mem_id
WHERE G.addr IN('서울', '경기')
GROUP BY G.mem_id -- FK로 GROUP BY하는 경우 많음
HAVING total_price > 10000
) sub; -- 안에 있는 표 내용을 sub라고 이름짓기
✅ OUTER JOIN
- 조건문에 만족하지 않는 행도 JOIN
매칭되는 데이터가 없는 경우
NULL
- FULL OUTER JOIN
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
LEFT JOIN
왼쪽 table에 있으면 무조건 넣어라.
합쳐지는 오른쪽 테이블에 값이 없어도 왼쪽 테이블에 있으면 무조건
null 값이라도 넣기RIGHT JOIN
FULL OUTER JOIN
- 합집합
- 모든 데이터가 합쳐진다.
1
2
3
4
SELECT {칼럼 목록}
FROM{기준 테이블}
<LEFT | RIGHT | FULL > OUTER JOIN {조인 대상 테이블}
ON {조건, FK}
1
2
3
4
SELECT *
FROM group_singer G
LEFT OUTER JOIN buy_history B
ON G.mem_id = B.mem_id;
구매 목록이 없는 그룹 가수 중에서 평균키가 큰 순서대로 3명 반환
1
2
3
4
5
6
7
SELECT *
FROM group_singer G
LEFT OUTER JOIN buy_history B
ON G.mem_id = B.mem_id
WHERE B.price IS NULL
ORDER BY G.height DESC
LIMIT 3;
구매 목록이 없는 가수는 총 몇 그룹인가?
1
2
3
4
5
6
7
8
SELECT COUNT(*)
FROM (
SELECT G.mem_id
FROM group_singer G
LEFT OUTER JOIN buy_history B
ON G.mem_id = B.mem_id
WHERE B.price IS NULL
) sub; --Sub Query 이름 붙여주기
✅ CROSS JOIN
경우의 수를 모두 표현하는 방식
서로를 모두 참조해야 함.
예를 들어 table A에 3개의 행이 있고, table B에 4개의 행이 있으면 3 * 4= 12개 행 만들어진다.
✅ Sub Query
쿼리 안에 또 쿼리 사용하기
⭐️ 만약 중복되는 column 명이 있다면 그 column을 없애기 위해 이름을 바꾸거나, alias로 바꾼다.
⭐️ 또 Sub Query라고 새로운 이름을 붙여준다.
✅ SELF JOIN
자기 자신 테이블을 참조 테이블로 둔다.
무조건 alias를 강제적으로 사용해야 한다.
내가 나를 참조하니까 이름 헷갈리므로 alias 쓰는 것이다.
1
2
3
4
SELECT *
FROM employee E1
JOIN employee E2
ON E1.manager_id = E2.employee.id;
This post is licensed under CC BY 4.0 by the author.