๐ฏ ๋ชฉํ :ย SQL์ ๊ธฐ์ด ๊ฐ๋
๋ช ๋ น์ด๋ ๋์๋ฌธ์๋ฅผ ๊ฐ๋ฆฌ์ง ์๋๋ค, ํ์ง๋ง ์คํค๋ง ๋๋ ํ๋๋ช ์ ๋ํด์๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ค.
์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ๋ฐ๋์ ๋๋์ผํ๋ค.
ํ์ต์ ์ํ w3schools ์์ ์ง์ ๋ฐ์ดํฐ ๊ฐ์ ํ์ธ ํด๋ณผ ์ ์๋ค.
CREATE DATABASE database_name;
USE database_name;
ํ๋ ๋ช | ํ๋ ํ์ | ๊ทธ ์ธ ์์ฑ |
---|---|---|
id | INT | Primary key AUTO_INCREMENT |
name | ์ต๋ 255๊ฐ์ ๋ฌธ์ | ย |
์ต๋ 255๊ฐ์ ๋ฌธ์ | ย |
-- ํ
์ด๋ธ ์์ฑ
CREATE TABLE user (
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(255),
email varchar(255)
);
-- ํ
์ด๋ธ ์ ๋ณด ํ์ธ
DESCRIBE user;
-- AUTO_INCREMENT ์ ํ ์์ฑ์๋ง๋ค ์๋์ผ๋ก 1์ฉ ์ฆ๊ฐ
-- PRIMARY KEY ์ค๋ณต ์
๋ ฅ ๋ถ๊ฐ, NULL(๋น ๊ฐ) ๋ถ๊ฐ
-- UNIQUE ์ค๋ณต ์
๋ ฅ ๋ถ๊ฐ
-- NOT NULL NULL(๋น ๊ฐ) ์
๋ ฅ ๋ถ๊ฐ
-- UNSIGNED (์ซ์์ผ์) ์์๋ง ๊ฐ๋ฅ
-- DEFAULT ๊ฐ ์
๋ ฅ์ด ์์ ์ ๊ธฐ๋ณธ๊ฐ
CREATE TABLE people (
person_id INT AUTO_INCREMENT PRIMARY KEY,
person_name VARCHAR(10) NOT NULL,
nickname VARCHAR(10) UNIQUE NOT NULL,
age TINYINT UNSIGNED,
is_married TINYINT DEFAULT 0
);
SELECT * FROM Customers;
-- CustomerName, ContactName, Country column๋ง ๋ฐ์ดํฐ ํ์ธ
SELECT CustomerName, ContactName, Country
FROM Customers;
-- ๋ชจ๋ column ์ Orders ํ
์ด๋ธ์ EmployeeID = 3 ์ธ row๋ง ์ถ์ถ
SELECT * FROM Orders
WHERE EmployeeID = 3;
-- OrderDetails ํ
์ด๋ธ์์
-- ProductID๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ ํ Quantity๋ ๋ด๋ฆผ ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ์ถ
SELECT * FROM OrderDetails
ORDER BY ProductID ASC, Quantity DESC;
-- Customers ํ
์ด๋ธ์ 10๊ฐ ๋ฐ์ดํฐ ์ถ์ถ
SELECT * FROM Customers
LIMIT 10;
-- Customers ํ
์ด๋ธ์ 30๋ฒ์งธ ์ดํ ๋ฐ์ดํฐ ๋ถํฐ 10๊ฐ ๋ฐ์ดํฐ ์ถ์ถ
SELECT * FROM Customers
LIMIT 30, 10;
-- Customers ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ
-- CustomerId๋ ์์ด๋๋ก CustomerName๋ ๊ณ ๊ฐ๋ช
์ผ๋ก Address๋ ์ฃผ์๋ก,
-- column๋ช
์ ๋ณ๊ฒฝํ์ฌ ๋ฐ์ดํฐ ์ถ์ถ
SELECT
CustomerId AS '์์ด๋',
CustomerName AS '๊ณ ๊ฐ๋ช
',
Address AS '์ฃผ์'
FROM Customers;
-- ๋ฌธ์์ด์ ์ฌ์น์ฐ์ฐ์ ํ๋ฉด 0์ผ๋ก ์ธ์ํ๋ฉฐ,
SELECT 'ABC' + 3;
-- ์ซ์๋ก ๋ ๋ฌธ์์ด์ ์ซ์๋ก ์๋ ์ธ์
SELECT '1' + '002' * 3;
-- Productsํ
์ด๋ธ์์ ProductName ์ด๊ณผ Price๋ฅผ 2๋ก ๋๋ ๊ฐ์ ๊ฐ์ง HalfPrice ์ด๋ก ๋ช
๋ช
ํ์ฌ ์ถ์ถ
SELECT
ProductName,
Price / 2 AS HalfPrice
FROM Products;
-- AND(&&)๋ ์์ชฝ ๋ชจ๋ true์ผ๋๋ง true
-- OR(||)๋ ํ์ชฝ๋ง true ๋ฉด true
SELECT TRUE AND FALSE, TRUE OR FALSE;
-- ๊ฒฐ๊ณผ ๊ฐ์ TRUE AND FALSE = FALSE // TRUE OR FALSE = TRUE
-- = ์์ชฝ ๊ฐ์ด ๊ฐ์
-- !=, <> ์์ชฝ ๊ฐ์ด ๋ค๋ฆ
-- >, < (์ผ์ชฝ, ์ค๋ฅธ์ชฝ) ๊ฐ์ด ๋ ํผ
-- >=, <= (์ผ์ชฝ, ์ค๋ฅธ์ชฝ) ๊ฐ์ด ๊ฐ๊ฑฐ๋ ๋ ํผ
BETWEEN {MIN} AND {MAX} -- ๋ ๊ฐ ์ฌ์ด์ ์์
NOT BETWEEN {MIN} AND {MAX} -- ๋ ๊ฐ ์ฌ์ด๊ฐ ์๋ ๊ณณ์ ์์
-- LIKE '... % ...' 0~N๊ฐ ๋ฌธ์๋ฅผ ๊ฐ์ง ํจํด
-- LIKE '... _ ...' _ ๊ฐฏ์๋งํผ์ ๋ฌธ์๋ฅผ ๊ฐ์ง ํจํด
SELECT
'HELLO' LIKE 'hel%',
'HELLO' LIKE 'H%',
'HELLO' LIKE 'H%O',
'HELLO' LIKE '%O',
'HELLO' LIKE '%HELLO%',
'HELLO' LIKE '%H',
'HELLO' LIKE 'L%'
SELECT
'HELLO' LIKE 'HEL__',
'HELLO' LIKE 'h___O',
'HELLO' LIKE 'HE_LO',
'HELLO' LIKE '_____',
'HELLO' LIKE '_HELLO',
'HELLO' LIKE 'HEL_',
'HELLO' LIKE 'H_O'
-- ROUND ๋ฐ์ฌ๋ฆผ
-- CEIL ์ฌ๋ฆผ
-- FLOOR ๋ด๋ฆผ
-- ABS ์ ๋๊ฐ
-- GREATEST (๊ดํธ ์์์) ๊ฐ์ฅ ํฐ ๊ฐ
-- LEAST (๊ดํธ ์์์) ๊ฐ์ฅ ์์ ๊ฐ
-- MAX ๊ฐ์ฅ ํฐ ๊ฐ
-- MIN ๊ฐ์ฅ ์์ ๊ฐ
-- COUNT ๊ฐฏ์ (NULL๊ฐ ์ ์ธ)
-- SUM ์ดํฉ
-- AVG ํ๊ท ๊ฐ
-- POW(A, B), POWER(A, B) A๋ฅผ B๋งํผ ์ ๊ณฑ
-- SQRT ์ ๊ณฑ๊ทผ
-- TRUNCATE(N, n) N์ ์์ซ์ n์๋ฆฌ๊น์ง ์ ํ
SELECT
ROUND(0.5),
CEIL(0.4),
FLOOR(0.6);
SELECT
GREATEST(1, 2, 3),
LEAST(1, 2, 3, 4, 5);
SELECT
MAX(Quantity),
MIN(Quantity),
COUNT(Quantity),
SUM(Quantity),
AVG(Quantity)
FROM OrderDetails
WHERE OrderDetailID BETWEEN 20 AND 30;
SELECT
POW(2, 3),
POWER(5, 2),
SQRT(16);
SELECT
TRUNCATE(1234.5678, 1),
TRUNCATE(1234.5678, 2),
TRUNCATE(1234.5678, 3),
TRUNCATE(1234.5678, -1),
TRUNCATE(1234.5678, -2),
TRUNCATE(1234.5678, -3);
-- UCASE, UPPER ๋ชจ๋ ๋๋ฌธ์๋ก
-- LCASE, LOWER ๋ชจ๋ ์๋ฌธ์๋ก
-- CONCAT(...) ๊ดํธ ์์ ๋ด์ฉ ์ด์ด๋ถ์
-- CONCAT_WS(S, ...) ๊ดํธ ์์ ๋ด์ฉ S๋ก ์ด์ด๋ถ์
-- SUBSTR, SUBSTRING ์ฃผ์ด์ง ๊ฐ์ ๋ฐ๋ผ ๋ฌธ์์ด ์๋ฆ
-- LEFT ์ผ์ชฝ๋ถํฐ N๊ธ์
-- RIGHT ์ค๋ฅธ์ชฝ๋ถํฐ N๊ธ์
-- LENGTH ๋ฌธ์์ด์ ๋ฐ์ดํธ ๊ธธ์ด
-- CHAR_LENGTH, CHARACTER_LEGNTH ๋ฌธ์์ด์ ๋ฌธ์ ๊ธธ์ด
-- TRIM ์์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐ
-- LTRIM ์ผ์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐ
-- RTRIM ์ค๋ฅธ์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐ
-- LPAD(S, N, P) S๊ฐ N๊ธ์๊ฐ ๋ ๋๊น์ง P๋ฅผ ์ด์ด๋ถ์
-- RPAD(S, N, P) S๊ฐ N๊ธ์๊ฐ ๋ ๋๊น์ง P๋ฅผ ์ด์ด๋ถ์
-- REPLACE(S, A, B) S์ค A๋ฅผ B๋ก ๋ณ๊ฒฝ
-- INSTR(S, s) S์ค s์ ์ฒซ ์์น ๋ฐํ, ์์ ์ 0
-- CAST(A, T) A๋ฅผ T ์๋ฃํ์ผ๋ก ๋ณํ
SELECT
UPPER('abcDEF'),
LOWER('abcDEF');
SELECT CONCAT('HELLO', ' ', 'THIS IS ', 2021)
SELECT CONCAT_WS('-', 2021, 8, 15, 'AM')
SELECT
SUBSTR('ABCDEFG', 3),
SUBSTR('ABCDEFG', 3, 2),
SUBSTR('ABCDEFG', -4),
SUBSTR('ABCDEFG', -4, 2);
SELECT
LENGTH('์๋
ํ์ธ์'), -- 15
CHAR_LENGTH('์๋
ํ์ธ์'), -- 5
CHARACTER_LENGTH('์๋
ํ์ธ์'); -- 5
SELECT
REPLACE('๋งฅ๋๋ ๋์์ ๋งฅ๋๋ ๋ ํ๋ฒ๊ฑฐ๋ฅผ ๋จน์๋ค.', '๋งฅ๋๋ ๋', '๋ฒ๊ฑฐํน');
SELECT
'01' = '1',
CONVERT('01', DECIMAL) = CONVERT('1', DECIMAL);
-- CURRENT_DATE, CURDATE ํ์ฌ ๋ ์ง ๋ฐํ
-- CURRENT_TIME, CURTIME ํ์ฌ ์๊ฐ ๋ฐํ
-- CURRENT_TIMESTAMP, NOW ํ์ฌ ์๊ฐ๊ณผ ๋ ์ง ๋ฐํ
SELECT CURDATE(), CURTIME(), NOW();
-- DATE ๋ฌธ์์ด์ ๋ฐ๋ผ ๋ ์ง ์์ฑ
-- TIME ๋ฌธ์์ด์ ๋ฐ๋ผ ์๊ฐ ์์ฑ
SELECT * FROM Orders
WHERE
OrderDate BETWEEN DATE('1997-1-1') AND DATE('1997-1-31');
-- HOUR ์ฃผ์ด์ง DATETIME์ ์ ๋ฐํ
-- MINUTE ์ฃผ์ด์ง DATETIME์ ๋ถ ๋ฐํ
-- SECOND ์ฃผ์ด์ง DATETIME์ ์ด ๋ฐํ
SELECT
HOUR(NOW()), MINUTE(NOW()), SECOND(NOW());
-- ADDDATE, DATE_ADD ์๊ฐ/๋ ์ง ๋ํ๊ธฐ
-- SUBDATE, DATE_SUB ์๊ฐ/๋ ์ง ๋นผ๊ธฐ
SELECT
ADDDATE('2022-09-20', INTERVAL 1 YEAR),
ADDDATE('2022-09-20', INTERVAL -2 MONTH),
ADDDATE('2022-09-20', INTERVAL 3 WEEK),
ADDDATE('2022-09-20', INTERVAL -4 DAY),
ADDDATE('2022-09-20', INTERVAL -5 MINUTE),
ADDDATE('2022-09-20 13:01:12', INTERVAL 6 SECOND);
-- DATE_FORMAT ์๊ฐ/๋ ์ง๋ฅผ ์ง์ ํ ํ์์ผ๋ก ๋ฐํ
-- %Y ๋
๋ 4์๋ฆฌ
-- %y ๋
๋ 2์๋ฆฌ
-- %M ์ ์๋ฌธ
-- %m ์ ์ซ์
-- %D ์ผ ์๋ฌธ(1st, 2nd, 3rd...)
-- %d, %e ์ผ ์ซ์ (01 ~ 31)
-- %T hh:mm:ss
-- %r hh:mm:ss AM/PM
-- %H, %k ์ (~23)
-- %h, %l ์ (~12)
-- %i ๋ถ
-- %S, %s ์ด
-- %p AM/PM
SELECT REPLACE(
REPLACE(
DATE_FORMAT(NOW(), '%Y๋
%m์ %d์ผ %p %h์ %i๋ถ %์ด'),
'AM', '์ค์ '
),
'PM', '์คํ'
)
-- IF(์กฐ๊ฑด, T, F) ์กฐ๊ฑด์ด ์ฐธ์ด๋ผ๋ฉด T, ๊ฑฐ์ง์ด๋ฉด F ๋ฐํ
SELECT IF (1 > 2, '1๋ 2๋ณด๋ค ํฌ๋ค.', '1์ 2๋ณด๋ค ์๋ค.');
SELECT
Price,
IF (Price > 30, 'Expensive', 'Cheap'),
CASE
WHEN Price < 20 THEN '์ ๊ฐ'
WHEN Price BETWEEN 20 AND 30 THEN '์ผ๋ฐ'
ELSE '๊ณ ๊ฐ'
END
FROM Products;
-- GROUP BY ์กฐ๊ฑด์ ๋ฐ๋ผ ์ง๊ณ๋ ๊ฐ์ ๊ฐ์ ธ์จ๋ค
-- OrderDetails ํ
์ด๋ธ์์ ProductID ์ปฌ๋ผ๊ณผ Quantity ํฉ์ ๊ฐ์ ๊ฐ์ง QuantitySum ์ผ๋ก
-- ProductID ์ค๋ณต๊ฐ์ผ๋ก ๋ฌถ์ด QuantitySum ์ปฌ๋ผ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํด์ ์ถ์ถ
SELECT
ProductID,
SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID
ORDER BY QuantitySum DESC;
-- ๊ฒฐ๊ณผ ๊ฐ์ https://www.w3schools.com/mysql/trymysql.asp?filename=trysql_select_all์์ ํ์ธ๊ฐ๋ฅ
-- Orders ํ
์ด๋ธ์์ DATE('1996-12-31') ๋ณด๋ค ์ดํ์ ๋ ์ง ๋ฐ์ดํฐ ๋ค๋ง
-- ์นด์ดํธํ ๊ฐ์ ๊ฐ์ง Count ์ปฌ๋ผ๊ณผ OrderDate ์ปฌ๋ผ์
-- OrderDate์ ์ค๋ณต๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ ํ๋ค.
-- ๊ทธ๋ฃนํ ๋ ๋ฐ์ดํฐ์์ Count ์ปฌ๋ผ์ ๊ฐ์ด 2์ด์์ธ ๊ฐ๋ง ์ถ์ถํ๋ค.
SELECT
COUNT(*) AS Count, OrderDate
FROM Orders
WHERE OrderDate > DATE('1996-12-31')
GROUP BY OrderDate
HAVING Count > 2;
-- Customers ํ
์ด๋ธ์์ Country ์ปฌ๋ผ๊ณผ City ์ปฌ๋ผ์ ์ค๋ณต ์ ๊ฑฐ ํ๊ณ
-- Country ์ ์ํ City๋ฅผ ์นด์ดํฐ ํ ๊ฐ์
-- Country ์ค๋ณต๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ถ์ถ
-- ์ฆ, Country์ ์ํ City๊ฐ ๋ช๊ฐ๊ฐ ์๋์ง ๋ฐ์ดํฐ ์ถ์ถ
SELECT
Country,
COUNT(DISTINCT City)
FROM Customers
GROUP BY Country;