SQL

SQL ๊ธฐ์ดˆ & ์ž์ฃผ์“ฐ๋Š” ์ฟผ๋ฆฌ๋ฌธ ์ •๋ฆฌ

Albosa2lol 2025. 2. 7. 10:42

๐Ÿ“Œ SQL ์ž์ฃผ ์“ฐ๋Š” ์ฟผ๋ฆฌ๋ฌธ

์ฟผ๋ฆฌ๋ฌธ์€ ์–ด๋–ค ๊ฒƒ์„ ์ œ์–ดํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์–ด๋ฌธ, ํ…Œ์ด๋ธ” ์ œ์–ด๋ฌธ, ๋ฐ์ดํ„ฐ ์ œ์–ด๋ฌธ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์ž์ฃผ ์“ฐ๋Š” ๊ตฌ๋ฌธ๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด์ž.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‹ค๋ฃจ๊ธฐ

-- ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ
SHOW DATABASES;

-- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ
CREATE DATABASE practice DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ญ์ œ
DROP DATABASE IF EXISTS practice;

ํ…Œ์ด๋ธ” ๋‹ค๋ฃจ๊ธฐ

-- ํ…Œ์ด๋ธ” ์กฐํšŒํ•˜๊ธฐ
use mysql;
SHOW TABLES;

-- ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ํ™•์ธํ•˜๊ธฐ
DESC [ํ…Œ์ด๋ธ”๋ช…];

-- ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ
CREATE DATABASE practice DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- ์กฐํšŒ ๊ฒฐ๊ณผ๋กœ ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ
CREATE TABLE [์ƒ์„ฑํ•  ํ…Œ์ด๋ธ”๋ช…] AS (SELECT * FROM [๊ธฐ์กด ํ…Œ์ด๋ธ”๋ช…]);

-- ํ…Œ์ด๋ธ” ์‚ญ์ œํ•˜๊ธฐ
DROP DATABASE IF EXISTS practice;

๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

์ฟผ๋ฆฌ๋ฌธ์˜ ์‹คํ–‰ ์ˆœ์„œ

๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์•ž์„œ ์ฟผ๋ฆฌ๋ฌธ์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ณด์ž.

-- ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ์ˆœ์„œ ์•Œ์•„๋ณด๊ธฐ
SELECT city AS ๋„์‹œ, COUNT(city) AS ์ง‘๊ณ„
  FROM user
    WHERE user.age >= 18
      GROUP BY city
        HAVING city >= 'b'
          ORDER BY city

์œ„์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY ์ˆœ์„œ๋กœ ์ž‘์„ฑํ–ˆ์„ ๋•Œ, ์ฟผ๋ฆฌ๋ฌธ์€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ์‹คํ–‰ ์ˆœ์„œ๋Š” FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY ์ˆœ์ด๋‹ค. ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ ์‹คํ–‰๋˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์„ค๋ช…์„ ์ฐธ๊ณ ํ•ด๋ณด์ž.

1. ์šฐ์„  FROM์—์„œ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๋งŒ๋“ ๋‹ค.
2. ๊ทธ๋ฆฌ๊ณ  WHERE์œผ๋กœ FROM์—์„œ ๋งŒ๋“  ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ผ๋ถ€๋ฅผ ์„ ํƒํ•œ๋‹ค.
3. GROUP BY๋Š” WHERE์—์„œ ์„ ํƒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•œ๋‹ค.
4. HAVING์€ GROUP BY์—์„œ ๊ทธ๋ฃนํ•‘ํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๋‹ค์‹œ ์กฐ๊ฑด์— ๋งž๊ฒŒ ํ•„ํ„ฐ๋งํ•œ๋‹ค.
5. SELECT๋Š” ๊ทธ๋ฃนํ™” ๋ฐ ํ•„ํ„ฐ๋ง๋œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ง‘๊ณ„ํ•œ๋‹ค.
6. ORDER BY๋Š” ์ง‘๊ณ„ํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ตœ์ข…์ ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ - ๊ธฐ๋ณธ

-- ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์กฐํšŒํ•˜๊ธฐ
SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…];

-- ๋ณ„์นญ ์‚ฌ์šฉํ•˜๊ธฐ (ORDER BY์— ์‚ฌ์šฉ๊ฐ€๋Šฅ, WHERE์— ์‚ฌ์šฉ๋ถˆ๊ฐ€)
SELECT CustomerName AS ๊ณ ๊ฐ, Address AS ์ฃผ์†Œ, PostalCode AS ์šฐํŽธ๋ฒˆํ˜ธ FROM Customers;

-- ํŠน์ • ํ–‰ ํŠน์ • ์—ด ์กฐํšŒํ•˜๊ธฐ
SELECT [์—ด1, ์—ด2, ...] FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE [ํ–‰ ์„ ํƒ ์กฐ๊ฑด์‹]
SELECT * FROM Customers WHERE Country = 'Germany';
SELECT * FROM Orders WHERE ShipperID <> 2;
SELECT * FROM OrderDetails WHERE Quantity > 100;
SELECT * FROM Employees WHERE FirstName >= 'O';
SELECT * FROM Employees WHERE BirthDate <= '1950-01-01';

-- ํŠน์ • ํŒจํ„ด ์กฐํšŒํ•˜๊ธฐ
SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE text LIKE '%์šฐ์•„ํ•œ%';
SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE number BETWEEN 1 and 3;
SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE text IN (1, 2, 3);
SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE text IS NULL;

-- ๊ฒ€์ƒ‰๊ฒฐ๊ณผ ์ผ๋ถ€ ์ถœ๋ ฅ ํ›„ ์ •๋ ฌํ•˜๊ธฐ (๋‚ด๋ฆผ์ฐจ์ˆœ DESC)
SELECT [์—ด1, ์—ด2, ...] FROM [ํ…Œ์ด๋ธ”๋ช…] ORDER BY [์—ด1, ์—ด2, ...] ASC LIMIT 5;

-- ๋ฐ์ดํ„ฐ ๊ฐ€๊ณตํ•˜๊ธฐ
SELECT 1 - 2 + 2 * 3;
SELECT MOD(10, 3)
SELECT ROUND(30.60, 1)
SELECT CONCAT('์šฐ์•„ํ•œ', 'ํ˜•์ œ๋“ค')  
SELECT SUBSTRING('20190422', 1, 4)
SELECT CURDATE();
SELECT CURTIME();

-- ๋ฐ์ดํ„ฐ ์ง‘๊ณ„ํ•˜๊ธฐ
SELECT COUNT(*) FROM [ํ…Œ์ด๋ธ”๋ช…]
SELECT DISTINCT [์—ด๋ช…] FROM [ํ…Œ์ด๋ธ”๋ช…]
SELECT SUM([์—ด๋ช…]) FROM [ํ…Œ์ด๋ธ”๋ช…]

๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ - ์‹ฌํ™”

-- ์ฟผ๋ฆฌ ์ค‘์ฒฉํ•˜๊ธฐ
SELECT MIN(a) FROM sample;
DELETE FROM sample WHERE a = (SELECT MIN(a) FROM sample);
SELECT (SELECT COUNT(*) FROM [Customers] WHERE Country = 'Germany') AS GermanyCount,
       (SELECT COUNT(*) FROM [Customers] WHERE Country = 'Mexico') AS MexicoCount;
SELECT * FROM (SELECT FirstName, LastName FROM [Employees] WHERE EmployeeID < 10);
SELECT * FROM [OrderDetails] WHERE Quantity = (SELECT MAX(Quantity) FROM [OrderDetails]);

-- ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ถ€๋ชจ์ฟผ๋ฆฌ์™€ ์—ฐ๊ด€๋œ ๊ฒฝ์šฐ
DELETE FROM [Customers] WHERE EXISTS (SELECT * FROM [Orders] WHERE OrderDate >= "1996-07-08");

-- ์—ฌ๋Ÿฌํ…Œ์ด๋ธ” ๋‹ค๋ฃจ๊ธฐ: ํ•ฉ์ง‘ํ•ฉ
SELECT Country FROM [Customers] UNION SELECT Country FROM [Suppliers] ORDER BY Country;
SELECT Country FROM [Customers] UNION ALL SELECT Country FROM [Suppliers] ORDER BY Country;

-- ์—ฌ๋Ÿฌํ…Œ์ด๋ธ” ๋‹ค๋ฃจ๊ธฐ: ๋‚ด๋ถ€๊ฒฐํ•ฉ
SELECT * FROM [Products], [Employees] WHERE [Employees].EmployeeID = [Products].SupplierID;
SELECT * FROM [Products] INNER JOIN [OrderDetails] ON Products.ProductID = OrderDetails.ProductID;

-- ์—ฌ๋Ÿฌํ…Œ์ด๋ธ” ๋‹ค๋ฃจ๊ธฐ: ์™ธ๋ถ€๊ฒฐํ•ฉ
SELECT * FROM [Products] LEFT JOIN [Employees] ON [Employees].EmployeeID = [Products].SupplierID;
SELECT * FROM [Employees] RIGHT JOIN [Products] ON [Employees].EmployeeID = [Products].SupplierID;

 

 

๐Ÿš€ SQL ์ฟผ๋ฆฌ๋ฌธ ์ ์šฉํ•ด๋ณด๊ธฐ

๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฌธ์„ ์‚ดํŽด๋ณด์•˜์œผ๋‹ˆ ์ด์ œ ๋ฏธ์…˜์— ์ ์šฉํ•ด๋ณผ ์‹œ๊ฐ„์ด๋‹ค. ์ฝ”์น˜ CU์˜ ๋ฏธ์…˜์€ ์ฃผ์–ด์ง„ 3๊ฐ€์ง€ ๊ณผ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์‹ค์Šต ์‚ฌ์ดํŠธ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ๋‹ค. ๊ฐ ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ํด๋ฆญํ•˜๋ฉด 'SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…];' ์ฟผ๋ฆฌ๋ฌธ์ด ์ž๋™ ์‹คํ–‰๋œ๋‹ค. ์ด์ œ ํ•œ ๋ฌธ์ œ์”ฉ ํ•ด๊ฒฐํ•ด๋ณด์ž!

์ฒซ ๋ฒˆ์งธ ๋ฏธ์…˜ ํ•ด๊ฒฐ! โœŒ๏ธ

๋ฏธ์…˜ 1. 200๊ฐœ ์ด์ƒ ํŒ”๋ฆฐ ์ƒํ’ˆ๋ช…๊ณผ ๊ทธ ์ˆ˜๋Ÿ‰์„ ์ˆ˜๋Ÿ‰ ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ณด์—ฌ์ฃผ์„ธ์š”.

์ฒซ ๋ฒˆ์งธ ๋ฏธ์…˜์„ ์œ„ํ•ด ํ•„์š”ํ•œ ํ•ญ๋ชฉ์€ '์ƒํ’ˆ๋ช…(ProductName)', 'ํŒ๋งค์ˆ˜๋Ÿ‰(Quantity)'์ด๊ณ , ๊ฐ๊ฐ 'Products'ํ…Œ์ด๋ธ”๊ณผ, 'OrderDetails'ํ…Œ์ด๋ธ”์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

(์™ผ์ชฝ๊ทธ๋ฆผ) Products ํ…Œ์ด๋ธ”   /   (์˜ค๋ฅธ์ชฝ๊ทธ๋ฆผ) OrderDetails ํ…Œ์ด๋ธ”

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์›ํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 2๊ฐœ์˜ ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐํ•  ๋•Œ์— INNER JOIN [ํ…Œ์ด๋ธ”2] ON ์กฐ๊ฑด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

-- 1. ๋‘ ํ…Œ์ด๋ธ” ProductID ๋กœ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ
SELECT Products.ProductName, OrderDetails.Quantity 
  FROM Products 
    INNER JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID;


-- 2. ํŒ๋งค์ˆ˜๋Ÿ‰์„ ProductName ๋ณ„๋กœ ํ•ฉ์น˜๊ธฐ
SELECT Products.ProductName, SUM(OrderDetails.Quantity) 
  FROM Products 
    INNER JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID 
      GROUP BY Products.ProductName;


-- 3. ํŒ๋งค์ˆ˜๋Ÿ‰์ด 200 ์ด์ƒ์ธ ์ƒํ’ˆ๋งŒ ํ•„ํ„ฐ๋งํ•˜๊ธฐ
SELECT Products.ProductName, SUM(OrderDetails.Quantity) AS OrderQuantity 
  FROM Products 
    INNER JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID 
      GROUP BY Products.ProductName 
        HAVING SUM(OrderDetails.Quantity) >= 200


-- 4. ํŒ๋งค์ˆ˜๋Ÿ‰ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ
SELECT Products.ProductName, SUM(OrderDetails.Quantity) AS OrderQuantity 
  FROM Products 
    INNER JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID 
      GROUP BY Products.ProductName 
        HAVING SUM(OrderDetails.Quantity) >= 200 
          ORDER BY OrderQuantity DESC;

(์™ผ์ชฝ๊ทธ๋ฆผ) 1๋ฒˆ ์‹คํ–‰๊ฒฐ๊ณผ    /    (์ค‘์•™๊ทธ๋ฆผ) 2๋ฒˆ,3๋ฒˆ ์‹คํ–‰๊ฒฐ๊ณผ    /    (์˜ค๋ฅธ์ชฝ๊ทธ๋ฆผ) 4๋ฒˆ ์‹คํ–‰๊ฒฐ๊ณผ

 

๋‘ ๋ฒˆ์งธ ๋ฏธ์…˜ ํ•ด๊ฒฐ! โœŒ๏ธ

 

๋ฏธ์…˜ 2. ๋งŽ์ด ์ฃผ๋ฌธํ•œ ์ˆœ์œผ๋กœ ๊ณ ๊ฐ ๋ฆฌ์ŠคํŠธ(ID, ๊ณ ๊ฐ๋ช…)๋ฅผ ๊ตฌํ•ด์ฃผ์„ธ์š”. (๊ณ ๊ฐ๋ณ„ ๊ตฌ๋งคํ•œ ๋ฌผํ’ˆ ์ด ๊ฐœ์ˆ˜)

๋‘ ๋ฒˆ์งธ ๋ฏธ์…˜์„ ์œ„ํ•ด ํ•„์š”ํ•œ ํ•ญ๋ชฉ์€ '๊ณ ๊ฐ ์•„์ด๋””(CustomerID)', '๊ณ ๊ฐ ์ด๋ฆ„(CustomerName)',) 'Quantity(์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰)'์ด๊ณ , ๊ฐ๊ฐ 'Customers'ํ…Œ์ด๋ธ”๊ณผ, 'Orders', 'OrderDetails'ํ…Œ์ด๋ธ”์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

(์™ผ์ชฝ๊ทธ๋ฆผ) Customers ํ…Œ์ด๋ธ”    /    (์ค‘์•™๊ทธ๋ฆผ) Orders ํ…Œ์ด๋ธ”    /    (์˜ค๋ฅธ์ชฝ๊ทธ๋ฆผ) OrderDetails ํ…Œ์ด๋ธ”

์ฒซ ๋ฒˆ์งธ ๋ฏธ์…˜์—์„œ ํ™œ์šฉํ–ˆ๋˜ ๊ตฌ๋ฌธ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•ด๋ณด์ž. ์ด๋ฒˆ์—๋Š” ํ…Œ์ด๋ธ” 3๊ฐœ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๋•Œ๋Š” INNER JOIN ๊ตฌ๋ฌธ์„ ํ•œ๋ฒˆ ๋” ์ ์–ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. A - B - C ์ˆœ์œผ๋กœ ์—ฐ๊ฒฐํ•  ๊ฒƒ์ด๋ผ๋ฉด FROM ๋’ค์—๋Š” A ํ…Œ์ด๋ธ”์„ ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์ž.

-- 1. [Orders]-[OrderDetails] ๋‘ ํ…Œ์ด๋ธ” OrderID ๋กœ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ
SELECT Orders.CustomerID, OrderDetails.Quantity
  FROM Orders 
    INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID;


-- 2. ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰์„ ProductName ๋ณ„๋กœ ํ•ฉ์น˜๊ธฐ
SELECT Orders.CustomerID, SUM(OrderDetails.Quantity) AS OrderQuantity 
  FROM Orders 
    INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID 
      GROUP BY Orders.CustomerID;


-- 3. Customers ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐํ•ด์„œ ๊ณ ๊ฐ์ด๋ฆ„ ํ‘œ์‹œํ•˜๊ธฐ
SELECT Orders.CustomerID, Customers.CustomerName, SUM(OrderDetails.Quantity) AS OrderQuantity 
  FROM Customers
    INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
      INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
        GROUP BY Orders.CustomerID;


-- 4. ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ
SELECT Orders.CustomerID, Customers.CustomerName, SUM(OrderDetails.Quantity) AS OrderQuantity 
  FROM Customers
    INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
      INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
        GROUP BY Orders.CustomerID
          ORDER BY OrderQuantity DESC;

(์™ผ์ชฝ๊ทธ๋ฆผ) 1๋ฒˆ ์‹คํ–‰๊ฒฐ๊ณผ    /    (์ค‘์•™๊ทธ๋ฆผ) 2๋ฒˆ ์‹คํ–‰๊ฒฐ๊ณผ    /    (์˜ค๋ฅธ์ชฝ๊ทธ๋ฆผ) 4๋ฒˆ ์‹คํ–‰๊ฒฐ๊ณผ

 

์„ธ ๋ฒˆ์งธ ๋ฏธ์…˜ ํ•ด๊ฒฐ! โœŒ๏ธ

๐Ÿšจ์ฃผ์˜: ์•„๋ž˜์˜ ํ•ด์„ค์„ ์ •๋‹ต์ด ์•„๋‹™๋‹ˆ๋‹ค. (์„œ๋‹ˆ ์ œ๋ณด ๊ฐ์‚ฌํ•ด์š”!)
Customer ์ค‘์— ์•„์˜ˆ ๊ตฌ๋งค๋ฅผ ํ•˜์ง€ ์•Š์€ 2๋ช…์ด ์žˆ์–ด์„œ INNER JOIN์ด ์•„๋‹Œ LEFT JOIN์ด๋‚˜ RIGHT JOIN์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ์ •๋‹ต ์ธ์› ์ˆ˜ 91๋ช…์ด ์‚ฐ์ถœ๋ฉ๋‹ˆ๋‹ค!

๋ฏธ์…˜ 3. ๋งŽ์€ ๋ˆ์„ ์ง€์ถœํ•œ ์ˆœ์œผ๋กœ ๊ณ ๊ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ•ด์ฃผ์„ธ์š”.

์„ธ ๋ฒˆ์งธ ๋ฏธ์…˜์„ ์œ„ํ•ด ํ•„์š”ํ•œ ํ•ญ๋ชฉ์€ '๊ณ ๊ฐ ์•„์ด๋””(CustomerID)', '๊ณ ๊ฐ ์ด๋ฆ„(CustomerName)', 'Quantity(์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰)', Price(๊ฐ€๊ฒฉ)์ด๊ณ , ๊ฐ๊ฐ 'Customers'ํ…Œ์ด๋ธ”๊ณผ, 'Orders', 'OrderDetails'ํ…Œ์ด๋ธ”, 'Products'ํ…Œ์ด๋ธ”์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

(์™ผ์ชฝ๊ทธ๋ฆผ) Orders ํ…Œ์ด๋ธ”    /    (์ค‘์•™๊ทธ๋ฆผ) OrderDetails ํ…Œ์ด๋ธ”    /    (์˜ค๋ฅธ์ชฝ๊ทธ๋ฆผ) Products ํ…Œ์ด๋ธ”

์ด๋ฒˆ์—๋Š” ํ…Œ์ด๋ธ” 4๊ฐœ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผํ•˜๋Š”๋ฐ, ์—ญ์‹œ INNER JOIN ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜๋‹ˆ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

-- 1. [OrderDetails]-[Products] ๋‘ ํ…Œ์ด๋ธ” OrderID ๋กœ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ
SELECT SUM(OrderDetails.Quantity * Products.Price) AS PaymentAmount 
  FROM OrderDetails 
    INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID;


-- 2. [Orders] ํ…Œ์ด๋ธ” ์ถ”๊ฐ€๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ
SELECT Orders.CustomerID, SUM(OrderDetails.Quantity * Products.Price) AS PaymentAmount 
  FROM Orders
    INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
      INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID
        GROUP BY Orders.CustomerID;


-- 3. [Customers] ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐํ•ด์„œ ๊ณ ๊ฐ์ด๋ฆ„ ํ‘œ์‹œํ•˜๊ธฐ
SELECT Orders.CustomerID, Customers.CustomerName, SUM(OrderDetails.Quantity * Products.Price) AS PaymentAmount 
  FROM Customers
    INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
      INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
        INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID
          GROUP BY Orders.CustomerID;


-- 4. ๊ฒฐ์ œ๊ธˆ์•ก ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ
SELECT Orders.CustomerID, Customers.CustomerName, SUM(OrderDetails.Quantity * Products.Price) AS PaymentAmount 
  FROM Customers
    INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
      INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
        INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID
          GROUP BY Orders.CustomerID;
            ORDER BY SUM(OrderDetails.Quantity * Products.Price) DESC;

(์™ผ์ชฝ๊ทธ๋ฆผ) 1๋ฒˆ ์‹คํ–‰๊ฒฐ๊ณผ    /    (์ค‘์•™๊ทธ๋ฆผ) 2๋ฒˆ ์‹คํ–‰๊ฒฐ๊ณผ    /    (์˜ค๋ฅธ์ชฝ๊ทธ๋ฆผ) 4๋ฒˆ ์‹คํ–‰๊ฒฐ๊ณผ