26 Fri

๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•œ ์ค‘๊ธ‰ SQL

๋‘ ๊ฐœ ์ด์ƒ ํ…Œ์ด๋ธ” ๊ฒฐํ•ฉํ•˜๊ธฐ

JOIN

  • ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” RDB, Relational DataBase ๋ผ๊ณ  ํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ๊ฐ„์˜ ๊ด€๊ณ„์„ฑ์„ ๊ฐ€์ง€๊ณ  ์—ฐ๊ฒฐ/๋ถ„๋ฆฌ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค

  • ํ•œ ํ…Œ์ด๋ธ”๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋ฉด ์ค‘๋ณต๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค. ์ด๋ฅผ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

  • ์ด ํ›„, ๋ถ„๋ฆฌ๋œ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•  ๋•Œ JOIN์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค

INNER JOIN

SELECT *
FROM Customers, Orders
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘ ํ…Œ์ด๋ธ”์„ ํ•ฉ์น˜๋ฉด ๊ต‰์žฅํžˆ ๋งŽ์€ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

    • ๋‘ ํ…Œ์ด๋ธ”์„ ํ•ฉ์น˜๋Š” ๊ฒƒ์„ Combination ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค

  • ๋‹ค์Œ์€ ๋‘ ํ…Œ์ด๋ธ”์„ ๊ฒฐํ•ฉํ•œ ๊ฒฐ๊ณผ์˜ ์ผ๋ถ€

    • ์กฐ๊ธˆ์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ด ํ‘œ์‹œ๋˜๋Š” ๋ชจ์Šต

  • ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ค‘๋ณต์„ ์—†์• ๊ณ  ๊ณตํ†ต๋œ ์ •๋ณด๋งŒ ์–ป๊ณ  ์‹ถ์„ ๋•Œ INNER JOIN ์„ ์‚ฌ์šฉํ•œ๋‹ค.

https://www.codespot.org/sql-join/ ์ดํ•˜ ๊ทธ๋ฆผ ์ถœ์ฒ˜ ๋™์ผ
SELECT *
FROM Customers, Orders
WHERE Customers.CustomerID = Orders.CustomerID
  • WHERE ๋ฌธ๋ฒ•์„ ํ†ตํ•ด ๋™์ผํ•œ ์ปฌ๋Ÿผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•

  • ์ด์ œ๋Š” ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค

SELECT *
FROM Customers
	INNER JOIN Orders ON Customers.CustomerId = Orders.CustomerID
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ˆ์•ฝ์–ด INNER JOIN ~ ON ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์–‘์ชฝ ํ…Œ์ด๋ธ”์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ•˜๋‹ค.

  • ์ด ๋•Œ Join ํ•˜๋Š” Key๊ฐ„์— name์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

    • ๋˜‘๊ฐ™์€ ์ปฌ๋Ÿผ์ผ์ง€๋ผ๋„ Orders๋Š” CustomerID, Customers๋Š” ID๋กœ ๋˜์–ด์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

    • ์ด๋Š” ๊ณ ๊ธ‰์—์„œ ๋‹ค๋ฃฐ ๋‚ด์šฉ => ERD, Entity Relational Diagram

OUTER JOIN

  • INNER JOIN์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ OUTER JOIN

  • LEFT, RIGHT, FULL ์˜ 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

  • LEFT JOIN ๊ณผ LEFT OUTER JOIN ์€ ๋™์ผํ•œ ๋ช…๋ น์–ด์ด๋‹ค

    • RIGHT ์™€ FULL ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

LEFT JOIN

SELECT *
FROM Customers
	LEFT JOIN Orders ON Orders.CustomerID = Customers.CustomerID
WHERE OrderID IS NULL
-- Order ํ…Œ์ด๋ธ”์— ์—†๋˜ ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅ --

RIGHT JOIN

  • ๊ทธ๋Ÿฌ๋‚˜ RIGHT JOIN ์€ ์ž˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

    • ์ˆœ์„œ๋งŒ ๋ฐ”๊พธ๋ฉด LEFT JOIN ๊ณผ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ

    • ํ•ด์„์ ์œผ๋กœ RIGHT JOIN ์ด ๋น„๊ต์  ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์žˆ๋‹ค

    • w3school ์—์„œ๋„ right์™€ full์€ ์ง€์›ํ•˜์ง€ ์•Š์Œ

SELF JOIN

LEET CODE 181

# Write your MySQL query statement below
select e.name as Employee
from employee as e
    inner join employee as m on e.managerid = m.id
where e.salary > m.salary
  • table ํ•˜๋‚˜๋ฅผ joinํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ table์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉ

  • ์ฃผ๋กœ as ๋ฅผ ํ†ตํ•ด ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

์‹œ๊ฐ„ ๋”ํ•˜๊ธฐ ๋นผ๊ธฐ

LEET CODE 197

# Write your MySQL query statement below
select n.id
from weather as y
    inner join weather as n on date_add(y.recorddate, interval 1 day) = n.recorddate
where y.temperature < n.temperature
  • DATE_ADD(๊ธฐ์ค€๋‚ ์งœ, INTERVAL)

    • SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND)

    • SECOND ๋Œ€์‹  MINUTE, HOUR, DAY, MONTH, YEAR ์‚ฌ์šฉ๊ฐ€๋Šฅ

  • DATE_SUB(๊ธฐ์ค€๋‚ ์งœ, INTERVAL)

    • DATE_ADD ์™€ ๋™์ผ

  • ๊ทธ๋Ÿฌ๋‚˜ INTERVAL ์— ์Œ์ˆ˜๋ฅผ ๋„ฃ์œผ๋ฉด ADD ์—์„œ๋„ SUB ์˜ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์Œ

Last updated

Was this helpful?