πŸ’» μ½”λ”© 일기 : [SQL] 'JOIN' 편

ybkΒ·2024λ…„ 4μ›” 27일

sql

λͺ©λ‘ 보기
3/6
post-thumbnail

πŸ”” 'JOIN'에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž!


πŸ’Ÿ JOIN

두 개 μ΄μƒμ˜ ν…Œμ΄λΈ”μ„ κ²°ν•© μ‹œν‚€λŠ” 것을 λ§ν•©λ‹ˆλ‹€.

  • 컬럼 수 : 두 ν…Œμ΄λΈ”μ˜ 컬럼 수의 ν•©μž…λ‹ˆλ‹€. 쑰인 κ²°κ³ΌλŠ” 각 ν…Œμ΄λΈ”μ˜ μ»¬λŸΌμ„ λͺ¨λ‘ ν¬ν•¨ν•©λ‹ˆλ‹€. (단, 쑰회 μ‹œ μ›ν•˜λŠ” 컬럼만 μ„ νƒν•˜μ—¬ κ²°κ³Όλ₯Ό μΆ”μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.)
  • ν–‰(λ ˆμ½”λ“œ) 수 : 두 ν…Œμ΄λΈ”μ˜ ν–‰μ˜ κ³±μž…λ‹ˆλ‹€. 첫 번째 ν…Œμ΄λΈ”μ˜ 각 행에 λŒ€ν•΄ 두 번째 ν…Œμ΄λΈ”μ˜ λͺ¨λ“  행이 κ²°ν•©λ˜λ―€λ‘œ ν–‰ μˆ˜λŠ” 각 ν…Œμ΄λΈ”μ˜ ν–‰ 수λ₯Ό κ³±ν•œ 값이 λ©λ‹ˆλ‹€. 이λ₯Ό cartesian product(μΉ΄λ₯΄ν‹°μ…˜ ν”„λ‘œλ•νŠΈ)라고 ν•©λ‹ˆλ‹€.

πŸ’Ÿ INNER JOIN

INNER JOIN은 두 ν…Œμ΄λΈ”μ— μΌμΉ˜ν•˜λŠ” 값을 κΈ°μ€€μœΌλ‘œ 쑰인을 μˆ˜ν–‰ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. ν…Œμ΄λΈ”μ˜ νŠΉμ • μ—΄μ—μ„œ 값이 μΌμΉ˜ν•˜λŠ” κ²½μš°μ—λ§Œ ν•΄λ‹Ή 행을 결과에 ν¬ν•¨μ‹œν‚΅λ‹ˆλ‹€.

CREATE TABLE table3(col_a INT);
CREATE TABLE table4(col_b INT);

INSERT INTO table3 VALUES (5),(6),(7);
INSERT INTO table4 VALUES (7),(6),(7),(8);

SELECT * FROM table3 JOIN table4 ON col_a = col_b;
col_acol_b
77
66
77
  • table3의 col_a와 table4의 col_b이 λͺ¨λ‘ 7,6,7인 경우만 μ‘°νšŒλ©λ‹ˆλ‹€. 5λŠ” table3의 col_aμ—λ§Œ 있고 8은 table4의 col_bμ—λ§Œ 있기 λ•Œλ¬Έμ— μ‘°νšŒλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ’Ÿ LEFT OUTER JOIN

LEFT OUTER JOIN은 INNER JOIN + μ™Όμͺ½ ν…Œμ΄λΈ”μ˜ λͺ¨λ“  λ ˆμ½”λ“œλ₯Ό ν¬ν•¨ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ§Œμ•½ 였λ₯Έμͺ½ ν…Œμ΄λΈ”μ˜ ν•΄λ‹Ήν•˜λŠ” λ ˆμ½”λ“œκ°€ μ—†λŠ” κ²½μš°μ—λ„ μ™Όμͺ½ ν…Œμ΄λΈ”μ˜ λ ˆμ½”λ“œλŠ” 결과에 ν¬ν•¨λ©λ‹ˆλ‹€.

  • OUTER μƒλž΅ κ°€λŠ₯ν•©λ‹ˆλ‹€.(LEFT JOIN)
# table1의 컬럼 col_a, table2의 컬럼 col_b

INSERT INTO table1 VALUES (1),(2),(2),(3),(4);
INSERT INTO table2 VALUES (3),(4),(5),(5);

SELECT * FROM table1 LEFT JOIN table2 ON col_a = col_b;
col_acol_b
33
44
1null
2null
2null
  • col_a와 col_b λͺ¨λ‘ μžˆλŠ” 값인 3,4κ°€ λ°˜ν™˜λ˜κ³  μ™Όμͺ½ ν…Œμ΄λΈ”(table3)에 μžˆλŠ” 값인 1,2,2도 값이 λ°˜ν™˜λ˜λ©° ν•΄λ‹Ή κ°’μ˜ col_bμ—λŠ” μ—†μœΌλ―€λ‘œ null 값이 λ°˜ν™˜λ©λ‹ˆλ‹€.

문제 : ν•œλ²ˆλ„ 주문을 μ²˜λ¦¬ν•œ 적 μ—†λŠ” 직원 쑰회

SELECT e.LastName, e.FirstName FROM Employees e LEFT JOIN Orders o
ON o.EmployeeID = e.EmployeeID
WHERE o.OrderID IS NULL;

πŸ’Ÿ RIGHT OUTER JOIN

RIGHT OUTER JOIN은 INNER JOIN + 였λ₯Έμͺ½ ν…Œμ΄λΈ”μ˜ λͺ¨λ“  λ ˆμ½”λ“œλ₯Ό ν¬ν•¨ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ§Œμ•½ μ™Όμͺ½ ν…Œμ΄λΈ”μ˜ ν•΄λ‹Ήν•˜λŠ” λ ˆμ½”λ“œκ°€ μ—†λŠ” κ²½μš°μ—λ„ 였λ₯Έμͺ½ ν…Œμ΄λΈ”μ˜ λ ˆμ½”λ“œλŠ” 결과에 ν¬ν•¨λ©λ‹ˆλ‹€.

  • OUTER μƒλž΅ κ°€λŠ₯ν•©λ‹ˆλ‹€. (RIGHT JOIN)
SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.col_a = t2.col_b;
col_acol_b
33
44
null5
null5
  • col_a와 col_b λͺ¨λ‘ μžˆλŠ” 값인 3,4κ°€ λ°˜ν™˜λ˜κ³  였λ₯Έμͺ½ ν…Œμ΄λΈ”(table4)에 μžˆλŠ” 값인 5,5도 값이 λ°˜ν™˜λ˜λ©° ν•΄λ‹Ή κ°’μ˜ col_bμ—λŠ” μ—†μœΌλ―€λ‘œ null 값이 λ°˜ν™˜λ©λ‹ˆλ‹€.

πŸ’Ÿ FULL OUTER JOIN

FULL OUTER JOIN : LEFT OUTER JOINκ³Ό RIGHT OUTER JOIN의 κ²°κ³Όλ₯Ό ν•©μΉœ κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ 합집합을 λ§ν•©λ‹ˆλ‹€. MariaDBμ—μ„œλŠ” FULL JOIN을 μ§€μ›ν•˜μ§€ μ•Šμ•„ UNION을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  • UNION : μ€‘λ³΅λœ 행을 μ œκ±°λ©λ‹ˆλ‹€.
  • UNION ALL : λͺ¨λ“  행이 λ°˜ν™˜λ©λ‹ˆλ‹€. (쀑볡 제거X)

UNION

INSERT INTO table11 VALUES (3),(4),(7);
INSERT INTO table10 VALUES (3),(4),(4),(5);

# LEFT JOIN
SELECT * FROM table10 LEFT JOIN table11
ON col1 = col_a

UNION

# RIGHT JOIN
SELECT * FROM table10 RIGHT JOIN table11 ON col1 = col_a;
col1col_a
33
44
5null
null7

UNION ALL

# LEFT JOIN
SELECT * FROM table10 LEFT JOIN table11
ON col1 = col_a

UNION ALL

# RIGHT JOIN
SELECT * FROM table10 RIGHT JOIN table11 ON col1 = col_a;
col1col_a
33
44
44
5null
33
44
44
null7

πŸ’Ÿ SELF JOIN

SELF JOIN : ν•˜λ‚˜μ˜ ν…Œμ΄λΈ” λ‚΄μ—μ„œ 자기 μžμ‹ μ„ μ‘°μΈν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.

SELECT e2.name 
FROM employee e1 JOIN employee e2 
ON e1.manager_id = e2.id 
WHERE e1.name = '손ν₯λ―Ό';
  • 자체 쑰인을 ν•˜μ—¬ 각 μ§μ›μ˜ 상사λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. e1의 상사 아이디와 e2의 직원 아이디가 μΌμΉ˜ν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.

πŸ’Ÿ 2개 μ΄μƒμ˜ JOIN

JOIN의 κ°―μˆ˜κ°€ λŠ˜μ–΄λ‚˜λ©΄ 각 JOIN에 λŒ€ν•œ ON을 μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • JOIN 3개(Orders, Customers, Employees)
SELECT o.OrderID, OrderDate, c.CustomerID, CustomerName, e.EmployeeID, e.LastName, FirstName
FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID
JOIN Employees e ON o.EmployeeID = e.EmployeeID
WHERE o.OrderDate BETWEEN '1996-07-01' AND '1996-07-31';

1996λ…„ 7μ›” 1일뢀터 1996λ…„ 7μ›” 31μΌκΉŒμ§€ μ£Όλ¬Έν•œ 고객 및 직원 정보λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.


  • JOIN 4개(Orders, Customers, Employees, Shippers)
SELECT o.OrderID, OrderDate,
       c.CustomerID, CustomerName,
       e.EmployeeID, e.LastName, FirstName,
       s.ShipperID, s.ShipperName
FROM Orders o
	JOIN Customers c ON o.CustomerID = c.CustomerID
	JOIN Employees e ON o.EmployeeID = e.EmployeeID
	JOIN Shippers s ON o.ShipperID = s.ShipperID
WHERE o.OrderDate BETWEEN '1996-07-01' AND '1996-07-31'
ORDER BY OrderDate, c.CustomerID, e.EmployeeID, s.ShipperID;

1996λ…„ 7μ›” 1일뢀터 1996λ…„ 7μ›” 31μΌκΉŒμ§€ μ£Όλ¬Έν•œ 고객, 직원, 배솑업체 정보λ₯Ό κ°€μ Έμ˜€λŠ”λ° κ·Έ κΈ°μ€€μœΌλ‘œ OrderDate, CustomerID, EmployeeID, ShipperID 순으둜 κ°€μ Έμ˜΅λ‹ˆλ‹€.

profile
개발자 쀀비생~

0개의 λŒ“κΈ€