Search

SQL

๋ฐ์ดํ„ฐ ์กฐํšŒํ•˜๊ธฐ

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค

SELECT * FROM customers;
SQL
๋ณต์‚ฌ

ํŠน์ • ์—ด ๊ฐ€์ ธ์˜ค๊ธฐ

SELECT CustomerName, ContactName FROM Customers;
SQL
๋ณต์‚ฌ

๋ณ„์นญ ์‚ฌ์šฉํ•˜๊ธฐ

SELECT CustomerName AS ๊ณ ๊ฐ, Address AS ์ฃผ์†Œ, PostalCode AS ์šฐํŽธ๋ฒˆํ˜ธ FROM Customers;
SQL
๋ณต์‚ฌ

SELECT์—์„œ ์ง€์ •ํ•œ ๋ณ„์นญ์€ WHERE๊ตฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ORDER BY๊ตฌ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. SQL ๊ตฌ๋ฌธ ์ฒ˜๋ฆฌ ์ˆœ์„œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

์—ฐ์Šต

๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•„๋ž˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•œ๋‹ค.
DROP TABLE IF EXISTS mst_users; CREATE TABLE mst_users( user_id varchar(255) , sex varchar(255) , birth_date varchar(255) , register_date varchar(255) , register_device varchar(255) , withdraw_date varchar(255) ); INSERT INTO mst_users VALUES ('U001', 'M', '1977-06-17', '2020-10-01', 'pc' , NULL ) , ('U002', 'F', '1953-06-12', '2020-10-01', 'sp' , '2020-10-10') , ('U003', 'M', '1965-01-06', '2020-10-01', 'pc' , NULL ) , ('U004', 'F', '1954-05-21', '2020-10-05', 'pc' , NULL ) , ('U005', 'M', '1987-11-23', '2020-10-05', 'sp' , NULL ) , ('U006', 'F', '1950-01-21', '2020-10-10', 'pc' , '2020-10-10') , ('U007', 'F', '1950-07-18', '2020-10-10', 'app', NULL ) , ('U008', 'F', '2006-12-09', '2020-10-10', 'sp' , NULL ) , ('U009', 'M', '2004-10-23', '2020-10-15', 'pc' , NULL ) , ('U010', 'F', '1987-03-18', '2020-10-16', 'pc' , NULL ) ; DROP TABLE IF EXISTS action_log; CREATE TABLE action_log( session varchar(255) , user_id varchar(255) , action varchar(255) , category varchar(255) , products varchar(255) , amount integer , stamp varchar(255) ); INSERT INTO action_log VALUES ('989004ea', 'U001', 'purchase', 'drama' , 'D001,D002', 2000, '2020-11-03 18:10:00') , ('989004ea', 'U001', 'view' , NULL , NULL , NULL, '2020-11-03 18:00:00') , ('989004ea', 'U001', 'favorite', 'drama' , 'D001' , NULL, '2020-11-03 18:00:00') , ('989004ea', 'U001', 'review' , 'drama' , 'D001' , NULL, '2020-11-03 18:00:00') , ('989004ea', 'U001', 'add_cart', 'drama' , 'D001' , NULL, '2020-11-03 18:00:00') , ('989004ea', 'U001', 'add_cart', 'drama' , 'D001' , NULL, '2020-11-03 18:00:00') , ('989004ea', 'U001', 'add_cart', 'drama' , 'D001' , NULL, '2020-11-03 18:00:00') , ('989004ea', 'U001', 'add_cart', 'drama' , 'D001' , NULL, '2020-11-03 18:00:00') , ('989004ea', 'U001', 'add_cart', 'drama' , 'D001' , NULL, '2020-11-03 18:00:00') , ('989004ea', 'U001', 'add_cart', 'drama' , 'D002' , NULL, '2020-11-03 18:01:00') , ('989004ea', 'U001', 'add_cart', 'drama' , 'D001,D002', NULL, '2020-11-03 18:02:00') , ('989004ea', 'U001', 'purchase', 'drama' , 'D001,D002', 2000, '2020-11-03 18:10:00') , ('47db0370', 'U002', 'add_cart', 'drama' , 'D001' , NULL, '2020-11-03 19:00:00') , ('47db0370', 'U002', 'purchase', 'drama' , 'D001' , 1000, '2020-11-03 20:00:00') , ('47db0370', 'U002', 'add_cart', 'drama' , 'D002' , NULL, '2020-11-03 20:30:00') , ('87b5725f', 'U001', 'add_cart', 'action', 'A004' , NULL, '2020-11-04 12:00:00') , ('87b5725f', 'U001', 'add_cart', 'action', 'A005' , NULL, '2020-11-04 12:00:00') , ('87b5725f', 'U001', 'add_cart', 'action', 'A006' , NULL, '2020-11-04 12:00:00') , ('9afaf87c', 'U002', 'purchase', 'drama' , 'D002' , 1000, '2020-11-04 13:00:00') , ('9afaf87c', 'U001', 'purchase', 'action', 'A005,A006', 1000, '2020-11-04 15:00:00') ; DROP TABLE IF EXISTS purchase_log; CREATE TABLE purchase_log( dt varchar(255) , order_id integer , user_id varchar(255) , purchase_amount integer ); INSERT INTO purchase_log VALUES ('2019-01-01', 1, 'rhwpvvitou', 13900) , ('2019-01-01', 2, 'hqnwoamzic', 10616) , ('2019-01-02', 3, 'tzlmqryunr', 21156) , ('2019-01-02', 4, 'wkmqqwbyai', 14893) , ('2019-01-03', 5, 'ciecbedwbq', 13054) , ('2019-01-03', 6, 'svgnbqsagx', 24384) , ('2019-01-03', 7, 'dfgqftdocu', 15591) , ('2019-01-04', 8, 'sbgqlzkvyn', 3025) , ('2019-01-04', 9, 'lbedmngbol', 24215) , ('2019-01-04', 10, 'itlvssbsgx', 2059) , ('2019-01-05', 11, 'jqcmmguhik', 4235) , ('2019-01-05', 12, 'jgotcrfeyn', 28013) , ('2019-01-05', 13, 'pgeojzoshx', 16008) , ('2019-01-06', 14, 'msjberhxnx', 1980) , ('2019-01-06', 15, 'tlhbolohte', 23494) , ('2019-01-06', 16, 'gbchhkcotf', 3966) , ('2019-01-07', 17, 'zfmbpvpzvu', 28159) , ('2019-01-07', 18, 'yauwzpaxtx', 8715) , ('2019-01-07', 19, 'uyqboqfgex', 10805) , ('2019-01-08', 20, 'hiqdkrzcpq', 3462) , ('2019-01-08', 21, 'zosbvlylpv', 13999) , ('2019-01-08', 22, 'bwfbchzgnl', 2299) , ('2019-01-09', 23, 'zzgauelgrt', 16475) , ('2019-01-09', 24, 'qrzfcwecge', 6469) , ('2019-01-10', 25, 'njbpsrvvcq', 16584) , ('2019-01-10', 26, 'cyxfgumkst', 11339) ; DROP TABLE IF EXISTS purchase_detail_log; CREATE TABLE purchase_detail_log( dt varchar(255) , order_id integer , user_id varchar(255) , item_id varchar(255) , price integer , category varchar(255) , sub_category varchar(255) ); INSERT INTO purchase_detail_log VALUES ('2019-12-01', 1, 'U001', 'D001', 2000, 'ladys_fashion', 'bag' ) , ('2019-12-08', 95, 'U002', 'D002', 3000, 'dvd' , 'documentary') , ('2019-12-09', 168, 'U003', 'D003', 5000, 'game' , 'accessories') , ('2019-12-11', 250, 'U004', 'D004', 8000, 'ladys_fashion', 'jacket' ) , ('2019-12-11', 325, 'U005', 'D005', 2000, 'mens_fashion' , 'jacket' ) , ('2019-12-12', 400, 'U006', 'D006', 4000, 'cd' , 'classic' ) , ('2019-12-11', 475, 'U007', 'D007', 4000, 'book' , 'business' ) , ('2019-12-10', 550, 'U008', 'D008', 6000, 'food' , 'meats' ) , ('2019-12-10', 625, 'U009', 'D009', 6000, 'food' , 'fish' ) , ('2019-12-11', 700, 'U010', 'D010', 2000, 'supplement' , 'protain' ) ;
SQL
๋ณต์‚ฌ
1. action_log ์ค‘ session๊ณผ action ์ •๋ณด๋ฅผ ์กฐํšŒํ•œ๋‹ค.
2. mst_users ์ •๋ณด ์ค‘ user_id, sex (AS ์„ฑ๋ณ„), birth_date(AS ์ƒ์ผ)์„ ์กฐํšŒํ•œ๋‹ค.

๊ฒ€์ƒ‰ ์กฐ๊ฑด

ํ–‰์„ ์„ ํƒํ•  ๋•Œ๋Š” WHERE ๊ตฌ๋ฅผ, ์—ด์„ ์„ ํƒํ•  ๋•Œ๋Š” SELECT ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
SELECT [์—ด1, ์—ด2, ...] FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE [์กฐ๊ฑด์‹]
Plain Text
๋ณต์‚ฌ

๋น„๊ต ์—ฐ์‚ฐ์ž

Search
์—ฐ์‚ฐ์ž
์˜๋ฏธ
๊ฐ™์ง€ ์•Š๋‹ค
๋ณด๋‹ค ํฌ๋‹ค
๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค
๋ณด๋‹ค ์ž‘๋‹ค
๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค
โ€ข
๋Œ€์†Œ๊ด€๊ณ„
1 < 2 < 10 < 100 '1988-11-30' < '2020-01-01' < '2020-03-02' '์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค' < '์šฐ์•„ํ•œํ˜•์ œ๋“ค' < 'ํฌ๋น„'
SQL
๋ณต์‚ฌ

์ƒ์ˆ˜ ์ž๋ฃŒํ˜•

์ˆ˜์น˜ํ˜• ์ƒ์ˆ˜ย : 1 100 -3.8 ๋ฌธ์ž์—ด ์ƒ์ˆ˜ย : 'ABC' '์šฐ์•„ํ•œํ˜•์ œ๋“ค' ๋‚ ์งœ์‹œ๊ฐ„ํ˜• ์ƒ์ˆ˜ย : '2020-03-02' '2020-03-02 19:00:00'

a. ๊ณ ๊ฐ ์ค‘ ๊ตญ๊ฐ€๊ฐ€ ๋…์ผ์ธ ๊ฒฝ์šฐ

SELECT * FROM Customers WHERE Country = 'Germany';
SQL
๋ณต์‚ฌ

b. ์ฃผ๋ฌธ ์ค‘ ๋ฐฐ์†ก์—…์ฒด ID๊ฐ€ 2๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

SELECT * FROM Orders WHERE ShipperID <> 2;
SQL
๋ณต์‚ฌ

c. ์ฃผ๋ฌธ ์ƒ์„ธ ๋‚ด์—ญ ์ค‘ ์ˆ˜๋Ÿ‰์ด 100์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ

SELECT * FROM OrderDetails WHERE Quantity > 100;
SQL
๋ณต์‚ฌ

d. ์ง์› ์ค‘ ์„ฑ์ด O ์ดํ›„์ธ ๊ฒฝ์šฐ

SELECT * FROM Employees WHERE FirstName >= 'O';
SQL
๋ณต์‚ฌ

e. ์ง์› ์ค‘ ์ƒ์ผ์ด 1950๋…„ 01์›” 01์ผ ์ด์ „์ธ ๊ฒฝ์šฐ

SELECT * FROM Employees WHERE BirthDate <= '1950-01-01';
SQL
๋ณต์‚ฌ

ํŒจํ„ด ๋งค์นญ -ย LIKE

# text : 'SQL ๊ฐ•์˜ - ๋ ˆ๋ฒจ2' SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE text LIKE 'SQL%'; # text : '์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค์—์„œ ์ง„ํ–‰ํ•˜๋Š” ์ž…๋ฌธ์šฉ SQL' SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE text LIKE '%SQL'; # text : 'LIKE ๋ฌธ์€ SQL์—์„œ ์‚ฌ์šฉํ•˜๋Š” ...' SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE text LIKE '%SQL%';
SQL
๋ณต์‚ฌ

๊ทธ ์™ธ ์กฐํšŒ ์กฐ๊ฑด

Search
์—ฐ์‚ฐ์ž
์˜๋ฏธ
a์™€ b ์‚ฌ์ด์— ๊ฐ’์ด ์žˆ๋‹ค (a, b ๊ฐ’ ํฌํ•จ)
list ์ค‘ ์–ด๋А ๊ฐ’์ด๋ผ๋„ ์ผ์น˜ํ•œ๋‹ค
null ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค

์กฐ๊ฑด ์กฐํ•ฉํ•˜๊ธฐ -ย AND / OR / NOT

# ๋‘ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค. ์œ„์˜ ๊ฒฝ์šฐ, WHERE 2๋Š” ํ•ญ์ƒ TRUE ์กฐ๊ฑด์ด๋‹ค. SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE no = 1 OR 2; SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE no = 1 OR no = 2;
SQL
๋ณต์‚ฌ
โ€ข
์šฐ์„ ์ˆœ์œ„ (AND๊ฐ€ OR์— ์šฐ์„ )
# ์ด ๊ฒฝ์šฐ, a = 2 AND b = 1 ๊ฐ€ ๋จผ์ € ๊ณ„์‚ฐ SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE a = 1 OR a = 2 AND b = 1 OR b = 2; # ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. SELECT * FROM [ํ…Œ์ด๋ธ”๋ช…] WHERE (a = 1 OR a = 2) AND (b = 1 OR b = 2);
SQL
๋ณต์‚ฌ

a. ์ฃผ๋ฌธ ์ค‘ ์ฃผ๋ฌธ์ผ์ž๊ฐ€ 1996๋…„ 07์›” 01์ผ๋ถ€ํ„ฐ 1996๋…„ 07์›” 05์ผ ์‚ฌ์ด์ธ ๊ฒฝ์šฐ

SELECT * FROM Orders WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-05';
SQL
๋ณต์‚ฌ

b. ๋ฌผํ’ˆ ์ค‘ ์นดํ…Œ๊ณ ๋ฆฌ ID๊ฐ€ (5, 6)์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ

SELECT * FROM Products WHERE CategoryID IN (5, 6);
SQL
๋ณต์‚ฌ

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ •๋ ฌํ•˜๊ธฐ -ย ORDER BY

SELECT [์—ด1, ์—ด2, ...] FROM [ํ…Œ์ด๋ธ”๋ช…] ORDER BY [์—ด1, ์—ด2, ...] { ASC | DESC }
SQL
๋ณต์‚ฌ

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ผ๋ถ€๋งŒ ์ถœ๋ ฅํ•˜๊ธฐ -ย LIMIT

SELECT [์—ด1, ์—ด2, ...] FROM [ํ…Œ์ด๋ธ”๋ช…] LIMIT [ํ–‰์ˆ˜]
SQL
๋ณต์‚ฌ

a. ๊ณ ๊ฐ ์ •๋ณด๋ฅผ ๊ตญ๊ฐ€๋ณ„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ

SELECT * FROM Customers ORDER BY Country;
SQL
๋ณต์‚ฌ

b. ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๊ฐ€๊ฒฉ๋ณ„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ ํ›„ ์ƒ์œ„ 5๊ฐœ ์กฐํšŒ

SELECT * FROM Products ORDER BY Price DESC LIMIT 5;
SQL
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ๊ฐ€๊ณตํ•˜๊ธฐ

a. ์‚ฌ์น™์—ฐ์‚ฐ

# ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์˜ ์—ฐ์‚ฐ # + ๋ณด๋‹ค * ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. SELECT 1 - 2 + 2 * 3; # ๋‚˜๋จธ์ง€ ๊ฐ’ ๋ฐ˜ํ™˜ํ•˜๊ธฐ SELECT MOD(10, 3) # ๋ฐ˜์˜ฌ๋ฆผํ•˜๊ธฐ SELECT ROUND(30.60, 1)
SQL
๋ณต์‚ฌ

b. ๋ฌธ์ž์—ด ์—ฐ์‚ฐ

# ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ SELECT CONCAT('์šฐ์•„ํ•œ', 'ํ˜•์ œ๋“ค') # ๋ฌธ์ž์—ด ์ž๋ฅด๊ธฐ SELECT SUBSTRING('20190422', 1, 4)
SQL
๋ณต์‚ฌ

c. ๋‚ ์งœ ์—ฐ์‚ฐ

๋ฐ์ดํ„ฐ ์ง‘๊ณ„ํ•˜๊ธฐ

a. ์ง‘๊ณ„ํ•จ์ˆ˜

# ํ–‰ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ SELECT COUNT(*) FROM [ํ…Œ์ด๋ธ”๋ช…] # ์ค‘๋ณต ์ œ๊ฑฐํ•˜๊ธฐ SELECT DISTINCT [์—ด๋ช…] FROM [ํ…Œ์ด๋ธ”๋ช…] # SUM, AVG, MIN, MAX SELECT SUM([์—ด๋ช…]) FROM [ํ…Œ์ด๋ธ”๋ช…]
SQL
๋ณต์‚ฌ

b. GROUP BY

โ€ข
์ง‘๊ณ„ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋ฉด, ํ…Œ์ด๋ธ” ์ „์ฒด ํ˜น์€ WHERE ๊ตฌ๋กœ ๊ฒ€์ƒ‰ํ•œ ํ–‰์ด ๊ฒ€์ƒ‰์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค. ์—ด์˜ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ์ง‘๊ณ„ํ•จ์ˆ˜์— ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” 'GROUP BY' ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
SELECT Country, COUNT(*) AS CountByCountry FROM [Customers] GROUP BY Country
Plain Text
๋ณต์‚ฌ

c. HAVING

โ€ข
์ง‘๊ณ„ํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ดย WHEREย ์กฐ๊ฑด์‹์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. (์•„๋ž˜ ์ฟผ๋ฆฌ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค)ย GROUP BY์™€ย WHERE ์ฒ˜๋ฆฌ ์ˆœ์„œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
SELECT Country, COUNT(Country) AS CountByCountry FROM [Customers] WHERE COUNT(Country) = 1 GROUP BY Country
Plain Text
๋ณต์‚ฌ
โ€ข
HAVING์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
SELECT Country, COUNT(Country) AS CountByCountry FROM [Customers] GROUP BY Country HAVING COUNT(Country) = 1
Plain Text
๋ณต์‚ฌ
โ€ข
GROUP BY์—์„œ ์ง€์ •ํ•œ ์—ด ์ด์™ธ์˜ ์—ด์€ ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฃนํ™”ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ๊ฐ’ ์ง‘ํ•ฉ ์ค‘ ์–ด๋А ๊ฐ’์„ ์ถœ๋ ฅํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
โ€ข
์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ,ย SELECT DISTINCT์™€ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰๋œ๋‹ค.

๋‹ค์‹œ, SQL๋ฌธ ์‹คํ–‰์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ณด์ž.

5) SELECT city AS ๋„์‹œ, COUNT(city) AS ์ง‘๊ณ„ 1) FROM user 2) WHERE user.age >= 18 3) GROUP BY city 4) HAVING city >= 'b' 6) ORDER BY city 1. FROM์—์„œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๋งŒ๋“ ๋‹ค. 2. WHERE๋Š” FROM์—์„œ ๋งŒ๋“  ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๊ฑธ๋Ÿฌ๋‚ธ๋‹ค. 3. GROUP BY๋Š” WHERE์—์„œ ํ•„ํ„ฐ๋งํ•œ (์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ธ) ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•œ๋‹ค. 4. HAVING์€ GROUP BY์—์„œ ์ง‘๊ณ„ํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๋‹ค์‹œ ์กฐ๊ฑด์— ๋งž๊ฒŒ ํ•„ํ„ฐ๋งํ•œ๋‹ค. 5. SELECT๋Š” ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ง‘๊ณ„ํ•œ๋‹ค. 6. ORDER BY๋Š” ์ง‘๊ณ„ํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ •๋ ฌํ•œ๋‹ค.
Plain Text
๋ณต์‚ฌ

์—ฐ์Šต

๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•„๋ž˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ด๋ณธ๋‹ค.
DROP TABLE IF EXISTS purchase_log; CREATE TABLE purchase_log( dt varchar(255) , order_id integer , user_id varchar(255) , purchase_amount integer ); INSERT INTO purchase_log VALUES ('2014-01-01', 1, 'rhwpvvitou', 13900) , ('2014-01-01', 2, 'hqnwoamzic', 10616) , ('2014-01-02', 3, 'tzlmqryunr', 21156) , ('2014-01-02', 4, 'wkmqqwbyai', 14893) , ('2014-01-03', 5, 'ciecbedwbq', 13054) , ('2014-01-03', 6, 'svgnbqsagx', 24384) , ('2014-01-03', 7, 'dfgqftdocu', 15591) , ('2014-01-04', 8, 'sbgqlzkvyn', 3025) , ('2014-01-04', 9, 'lbedmngbol', 24215) , ('2014-01-04', 10, 'itlvssbsgx', 2059) , ('2014-01-05', 11, 'jqcmmguhik', 4235) , ('2014-01-05', 12, 'jgotcrfeyn', 28013) , ('2014-01-05', 13, 'pgeojzoshx', 16008) , ('2014-01-06', 14, 'msjberhxnx', 1980) , ('2014-01-06', 15, 'tlhbolohte', 23494) , ('2014-01-06', 16, 'gbchhkcotf', 3966) , ('2014-01-07', 17, 'zfmbpvpzvu', 28159) , ('2014-01-07', 18, 'yauwzpaxtx', 8715) , ('2014-01-07', 19, 'uyqboqfgex', 10805) , ('2014-01-08', 20, 'hiqdkrzcpq', 3462) , ('2014-01-08', 21, 'zosbvlylpv', 13999) , ('2014-01-08', 22, 'bwfbchzgnl', 2299) , ('2014-01-09', 23, 'zzgauelgrt', 16475) , ('2014-01-09', 24, 'qrzfcwecge', 6469) , ('2014-01-10', 25, 'njbpsrvvcq', 16584) , ('2014-01-10', 26, 'cyxfgumkst', 11339) ;
SQL
๋ณต์‚ฌ
Search
dt
purchase_count
total_amount
avg_amount
2014/01/01
24516
12258.00
2014/01/02
36049
18024.50
2014/01/03
53029
17676.33
...
...

์ถ”๊ฐ€ ์—ฐ์Šต

โ€ข
์•„๋ž˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ SQL๋ฌธ์„ ์ž‘์„ฑํ•˜์„ธ์š”.์‹ค์Šต ์‚ฌ์ดํŠธ๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”.
1.
ํŒŒ๋ฆฌ์™€ ๋Ÿฐ๋˜ ๊ณ ๊ฐ์˜ ๊ณ ๊ฐ ์ด๋ฆ„๊ณผ ์ฃผ์†Œ, ๋„์‹œ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
2.
์ƒํ’ˆ ๊ฐ€๊ฒฉ์ด 50 ~ 70 ์‚ฌ์ด์ธ ์ƒํ’ˆ ์ค‘ ์นดํ…Œ๊ณ ๋ฆฌ ID๊ฐ€ 7์ดํ•˜์ธ ์ƒํ’ˆ์„ ์ด๋ฆ„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
3.
์ง์› ์ค‘ BA ํ•™์œ„๋ฅผ ๋ฐ›์€ ์‚ฌ๋žŒ ์ค‘ ๋‚˜์ด๊ฐ€ ์–ด๋ฆฐ 3๋ช…์˜ FirstName, LastName์„ ์ถœ๋ ฅํ•œ๋‹ค.
4.
๊ณต๊ธ‰์—…์ž ์ •๋ณด๋ฅผ ๊ตญ๊ฐ€, ๋„์‹œ, ์ฃผ์†Œ, ์šฐํŽธ๋ฒˆํ˜ธ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ํ•ด๋‹น ์ •๋ณด๋งŒ ์ถœ๋ ฅํ•œ๋‹ค. ์ด ๋•Œ ์ฃผ์†Œ์— ์‰ผํ‘œ(,)์™€ ์˜จ์ (.)์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•œ๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ์ค‘์ฒฉํ•˜์ž

โ€ข
์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋Š” ๋ฆด๋ ˆ์ด์…˜์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฟผ๋ฆฌ๋ฅผ ์กฐํ•ฉํ•ด ์กฐ๊ธˆ ๋” ๋ณต์žกํ•œ ์ˆ ์–ด๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
# sample ๋ฐ์ดํ„ฐ ์ค‘ a ์—ด์˜ ์ตœ์†Ÿ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. SELECT MIN(a) FROM sample; # ์ตœ์†Ÿ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ–‰์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. DELETE FROM sample WHERE a = (SELECT MIN(a) FROM sample);
SQL
๋ณต์‚ฌ

a. ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ : SELECT ์ ˆ์— ์ถ”๊ฐ€๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

โ€ข
์Šค์นผ๋ผ ๊ฐ’์ด๋ž€,ย SELECTย ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.
SELECT (SELECT COUNT(*) FROM [Customers] WHERE Country = 'Germany') AS GermanyCount, (SELECT COUNT(*) FROM [Customers] WHERE Country = 'Mexico') AS MexicoCount
SQL
๋ณต์‚ฌ

b. ์ธ๋ผ์ธ๋ทฐ ์„œ๋ธŒ์ฟผ๋ฆฌ : FROM ์ ˆ์—์„œ ํ…Œ์ด๋ธ”๋“ค์ด ์žˆ๋Š” ์œ„์น˜ ๊ด„ํ˜ธ ์•ˆ์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ

SELECT * FROM (SELECT FirstName, LastName FROM [Employees] WHERE EmployeeID < 10)
SQL
๋ณต์‚ฌ

c. ์„œ๋ธŒ์ฟผ๋ฆฌ : WHERE ์ ˆ์— ์ถ”๊ฐ€๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

SELECT * FROM [OrderDetails] WHERE Quantity = (SELECT MAX(Quantity) FROM [OrderDetails])
SQL
๋ณต์‚ฌ

์ƒ๊ด€์„œ๋ธŒ์ฟผ๋ฆฌ

โ€ข
์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ๋ถ€๋ชจ์ฟผ๋ฆฌ๊ฐ€ ์„œ๋กœ ์—ฐ๊ด€๋œ ๊ฒฝ์šฐ, ๋‘ ํ…Œ์ด๋ธ”์— ๊ฑธ์ณ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

a. EXISTS

DELETE FROM [Customers] WHERE EXISTS (SELECT * FROM [Orders] WHERE OrderDate >= "1996-07-08")
SQL
๋ณต์‚ฌ

b. IN

โ€ข
์Šค์นผ๋ผ ๊ฐ’๋ผ๋ฆฌ ๋น„๊ตํ•  ๋•Œ๋Š” = ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ง‘ํ•ฉ์„ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.ย IN์„ ํ™œ์šฉํ•˜๋ฉด ์ง‘ํ•ฉ ์•ˆ์— ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
SELECT * FROM [Customers] WHERE Country IN ('Germany', 'UK')
SQL
๋ณต์‚ฌ

๋ณต์ˆ˜์˜ ํ…Œ์ด๋ธ” ๋‹ค๋ฃจ๊ธฐ

โ€ข
๊ธฐ๋ณธ์ ์œผ๋กœย JOIN์€ย INNER JOIN๊ณผ ๊ฐ™๋‹ค.ย LEFT JOIN์€ย LEFT OUTER JOIN๊ณผ ๊ฐ™๋‹ค.

a. ํ•ฉ์ง‘ํ•ฉ

โ€ข
UNION์€ ๋‘ ๊ฐœ์˜ SELECT ๋ช…๋ น์„ ํ•˜๋‚˜๋กœ ์—ฐ๊ณ„ํ•ด(์ค‘๋ณต ์ œ๊ฑฐ), ์งˆ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์—ด ๊ตฌ์„ฑ์€ ๊ฐ™์•„์•ผ ํ•˜๋ฉฐ,ย ORDER BYย ๋Š” ๋งˆ์ง€๋ง‰ SELECT ๋ช…๋ น์—๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
SELECT Country FROM [Customers] UNION SELECT Country FROM [Suppliers] ORDER BY Country
SQL
๋ณต์‚ฌ
โ€ข
๋ชจ๋“  ๊ฒฐ๊ณผ๊ฐ’์„ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉดย UNION ALL๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
SELECT Country FROM [Customers] UNION ALL SELECT Country FROM [Suppliers] ORDER BY Country
SQL
๋ณต์‚ฌ

b. ๋‚ด๋ถ€๊ฒฐํ•ฉ

โ€ข
๊ณฑ์ง‘ํ•ฉ์—์„œ ํ•„์š”ํ•œ ์กฐํ•ฉ๋งŒ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹
SELECT * FROM [Products], [Employees] WHERE [Employees].EmployeeID = [Products].SupplierID
SQL
๋ณต์‚ฌ
โ€ข
INNER JOIN์„ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹
SELECT * FROM [Products] INNER JOIN [OrderDetails] ON Products.ProductID = OrderDetails.ProductID
SQL
๋ณต์‚ฌ

c. ์™ธ๋ถ€๊ฒฐํ•ฉ

# ์–ด๋А ํ•œ ์ชฝ์—๋งŒ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐํ–‰์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ NULL ๊ฐ’์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. # ์•„๋ž˜ ๋‘ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค. SELECT * FROM [Products] LEFT JOIN [Employees] ON [Employees].EmployeeID = [Products].SupplierID SELECT * FROM [Employees] RIGHT JOIN [Products] ON [Employees].EmployeeID = [Products].SupplierID
SQL
๋ณต์‚ฌ

์—ฐ์Šต

๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•„๋ž˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ด๋ณธ๋‹ค.
DROP TABLE IF EXISTS categories; CREATE TABLE categories ( category_id integer , name varchar(255) ); INSERT INTO categories VALUES (1, 'dvd' ) , (2, 'cd' ) , (3, 'book') ; DROP TABLE IF EXISTS category_sales; CREATE TABLE category_sales ( category_id integer , sales integer ); INSERT INTO category_sales VALUES (1, 850000) , (2, 500000) ; DROP TABLE IF EXISTS product_sale_ranking; CREATE TABLE product_sale_ranking ( category_id integer , rank integer , product_id varchar(255) , sales integer ); INSERT INTO product_sale_ranking VALUES (1, 1, 'D001', 50000) , (1, 2, 'D002', 20000) , (1, 3, 'D003', 10000) , (2, 1, 'C001', 30000) , (2, 2, 'C002', 20000) , (2, 3, 'C003', 10000) ;
SQL
๋ณต์‚ฌ
Search
Title
category_id
name
sales
sape_product
1
dvd
850000
2022/01/01 00:01
1
dvd
850000
2022/01/01 00:02
1
dvd
850000
2022/01/01 00:03
2
cd
500000
2
cd
500000
2
cd
500000
Search
category_id
name
sales
top_sale_product
1
850000
2022/01/01 00:01
2
500000
๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•„๋ž˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ด๋ณธ๋‹ค.
DROP TABLE IF EXISTS products_20161201; CREATE TABLE products_20161201( product_id varchar(255) , name varchar(255) , price integer , updated_at varchar(255) ); INSERT INTO products_20161201 VALUES ('A001', 'AAA', 3000, '2016-11-03 18:00:00') , ('A002', 'AAB', 4000, '2016-11-03 19:00:00') , ('B001', 'BBB', 5000, '2016-11-03 20:00:00') , ('B002', 'BBD', 3000, '2016-11-03 21:00:00') , ('C001', 'CCA', 4000, '2016-11-04 18:00:00') , ('D001', 'DAA', 5000, '2016-11-04 19:00:00') ; DROP TABLE IF EXISTS products_20170101; CREATE TABLE products_20170101( product_id varchar(255) , name varchar(255) , price integer , updated_at varchar(255) ); INSERT INTO products_20170101 VALUES ('A001', 'AAA', 3000, '2016-11-03 18:00:00') , ('A002', 'AAB', 4000, '2016-11-03 19:00:00') , ('B002', 'BBD', 3000, '2016-11-03 21:00:00') , ('C001', 'CCA', 5000, '2016-12-04 18:00:00') , ('D001', 'DAA', 5000, '2016-11-04 19:00:00') , ('D002', 'DAD', 5000, '2016-12-04 19:00:00') ;
SQL
๋ณต์‚ฌ
โ€ข
๋‘ ํ…Œ์ด๋ธ”์„ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ์„ ์ถœ๋ ฅํ•œ๋‹ค.
Search
product_id
name
price
updated_at
2022/01/01 00:02
5000
2016/12/04 19:00
Search
product_id
name
price
updated_at
BBB
5000
2016/11/03 20:00

์ถ”๊ฐ€ ์—ฐ์Šต

โ€ข
์ง€๊ธˆ๊ป ํ•™์Šตํ•œ ๋‚ด์šฉ๋“ค๋กœ ์ถ”๊ฐ€๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€์˜ ๋ฏธ์…˜๋“ค๋กœ ๋ถˆ์ถฉ๋ถ„ํ–ˆ๋‹ค๋ฉด ๋„์ „ํ•ด๋ณด์ž
โ€ข
Dataset Download
โ€ข
๋ฉ”๋‰ด์–ผ์„ ํ™•์ธํ•˜์—ฌ ๋‹ค์šด๋ฐ›์€ CSVํŒŒ์ผ์„ importํ•œ๋‹ค.
โ€ข
CSV LOAD๊ฐ€ ๋А๋ฆด๊ฒฝ์šฐ์—ย ๋งํฌ์˜ sql์„ importํ•ด๋ณธ๋‹ค. ์™œ ์†๋„ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

a. ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์…‹์„ ํ™œ์šฉํ•˜์—ฌย stackoverflow 2018 - Coding as a Hobby์™€ ๊ฐ™์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

b. ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์…‹์„ ํ™œ์šฉํ•˜์—ฌย stackoverflow 2018 - Years of Professional Coding Experience by Developer Type์™€ ๊ฐ™์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.