๐ 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๋ฒ ์คํ๊ฒฐ๊ณผ