Giter Site home page Giter Site logo

mysql-practice's Introduction

mySQL-practice

Chapter 1. SQL ๋ฐ์ดํ„ฐ ๋ถ„์„

Chapter 2. SQL ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

201007

SELECT * FROM copang_main.member; -- copang_main์ด๋ผ๋Š” db์˜ member table์„ ๊ฐ€์ ธ์˜จ๋‹ค.

DATETIME์— ํ•ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜

  • YEAR
  • MONTH
  • DAYOFMONTH
  • DATEDIFF
  • CURDATE
  • DATE_ADD
  • DATE_SUB
  • UNIX_TIMESTAMP
  • FROM_UNIXTIME
SELECT * FROM member WHERE YEAR(birthday)='1992'; 
SELECT * FROM member WHERE MONTH(sign_up_day) IN (1,2,3); 
SELECT * FROM member WHERE DAYOFMONTH(sign_up_day) BETWEEN 16 AND 31;

-- = ๋“ฑํ˜ธ๋Š” ๊ทธ๋Œ€๋กœ ๋น„๊ต, 
-- IN์€ ์—ฌ๋Ÿฌ ์„ ํƒ์ง€ ์ค‘์— ์„ ํƒ, 
-- BETWEEN์€ ๋ฒ”์œ„๋‚ด์—์„œ ์„ ํƒ, a AND b (a, b ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„)

SELECT email, sign_up_day, DATEDIFF(sign_up_day, '2020-10-07') FROM member;
SELECT email, sign_up_day, CURDATE(), DATEDIFF(sign_up_day, CURDATE()) FROM member; 
SELECT email, sign_up_day, CURDATE(), DATEDIFF(sign_up_day, birthday)/365 FROM member; 
SELECT email, sign_up_day, DATE_SUB(sign_up_day, INTERVAL -30 DAY), DATEDIFF(sign_up_day,'2010-01-01') FROM member;  -- DATEDIFF()์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ๋…„-์›”-์ผ ํ˜•์‹์œผ๋กœ ์จ์•ผํ•œ๋‹ค.
SELECT email, sign_up_day, UNIX_TIMESTAMP(sign_up_day) FROM member; 
SELECT email, sign_up_day, FROM_UNIXTIME(UNIX_TIMESTAMP(sign_up_day)) FROM member;

WHERE (์กฐ๊ฑด๋ฌธ, if๊ฐ™์€ ์กด์žฌ)

  • %์˜ ์‚ฌ์šฉ: ์„œ์šธ%, '์„œ์šธ'๋’ค์— ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” ๋ฌด๊ด€ํ•˜๋‹ค.
  • "_" ์˜ ์‚ฌ์šฉ: ์„œ์šธ_, '์„œ์šธ'๋’ค์— ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 1์ด๋‹ค.
-- ์กฐ๊ฑด: gender๋Š” m์ด๋ฉด์„œ ์ฃผ์†Œ์—” ์„œ์šธ์ด ๋“ค์–ด๊ฐ€์•ผํ•˜๊ณ , ๋‚˜์ด๋Š” 20๋Œ€
SELECT * FROM member
WHERE gender = 'm' AND address LIKE '์„œ์šธ%'
AND age BETWEEN 25 and 29;

-- ๋ด„ ๋˜๋Š” ๊ฐ€์„์— ํ•ด๋‹นํ•˜๋Š” ์กฐ๊ฑด
SELECT * FROM member
WHERE MONTH(sign_up_day) BETWEEN 3 and 5
OR MONTH(sign_up_day) BETWEEN 9 and 11;

-- ๋‚จ์ž ํšŒ์›์ค‘ ํ‚ค๊ฐ€ 180 ์ด์ƒ, ์—ฌ์ž ํšŒ์› ์ค‘ ํ‚ค๊ฐ€ 170 ์ด์ƒ
SELECT * FROM member
WHERE (gender = 'm' and height >= 180)
OR (gender = 'f' and height >= 170);
  • AND ๋Š” OR ๋ณด๋‹ค ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ๊ด„ํ˜ธ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์ฃผ์ž.

IN๊ณผ OR์€ ๋งฅ๋ฝ์ด ๊ฐ™๋‹ค

-- ์•„๋ž˜ ๋‘˜์€ ๊ฐ™์€ ์˜๋ฏธ: OR๋กœ ์“ด ๊ฒƒ์„ IN์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
SELECT * FROM member WHERE age = 20 OR age = 30 OR age =40;
SELECT * FROM member WHERE age IN (20, 30, 40);

๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ => BINARY ์‚ฌ์šฉ: ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ฌธ์ž๋ฅผ ์ด์ง„์ฝ”๋“œ๋กœ ๊ตฌ๋ถ„ํ•ด๋ฒ„๋ฆฐ๋‹ค.

SELECT email FROM member WHERE email LIKE BINARY '%M%'
-- ๋Œ€๋ฌธ์ž M์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” query
SELECT * FROM member ORDER BY height desc;

SELECT sign_up_day, email FROM member
ORDER BY YEAR(sign_up_day) DESC, email ASC -- ๊ฐ€์ž…๋…„๋„๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ด๋ฉ”์ผ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
LIMIT 10;
LIMIT 10, 2; -- 10๋ฒˆ ์งธ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ 2 ์ดํ›„๊นŒ์ง€ ์ถœ๋ ฅ. ์ฆ‰, 11,12 ๋ฒˆ์งธ๋ฅผ ์ถœ๋ ฅ

-- CAST (data AS signed)

201008

MIN, AVG, MAX ๋“ฑ ๋‚ด์žฅํ•จ์ˆ˜

SELECT MIN(height) FROM member;
SELECT AVG(height) FROM member;
-- AVG๋Š” NULL๊ฐ’์„ ์ œ์™ธํ•˜๊ณ  ํ‰๊ท ์„ ๊ณ„์‚ฐํ•œ๋‹ค.

COALESCE, NULL๊ฐ’ ์ฒ˜๋ฆฌ

SELECT COALESCE(address, '****') FROM member WHERE address IS NULL;
SELECT COALESCE(address, '****') FROM member;
SELECT * FROM member;

์ด์ƒ๊ฐ’ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ

-- 100์‚ด ์ดˆ๊ณผ(AND 5์‚ด ๋ฏธ๋งŒ) ์ด์ƒ๊ฐ’์€ ์ œ์™ธํ•˜๊ณ  ํ‰๊ท ์„ ๊ตฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ
SELECT AVG(age) FROM member WHERE age BETWEEN 5 AND 100;
SELECT * FROM member WHERE address NOT LIKE '%ํ˜ธ';
  • IS NULL๊ณผ NULL์€ ๋‹ค๋ฅด๋‹ค
  • sql์—์„œ๋Š” ์ปฌ๋Ÿผ์— null๊ฐ’์ด ์žˆ์œผ๋ฉด ์‚ฐ์ˆ ๊ณ„์‚ฐ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
SELECT
email,
CONCAT(height, 'cm',',',weight,'kg') AS 'ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ',
weight / ((height/100) * (height/100)) BMI, -- AS ๋Œ€์‹  space๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ
(CASE
WHEN weight IS NULL OR height IS NULL THEN '๋น„๋งŒ์—ฌ๋ถ€ ์•Œ์ˆ˜์—†์Œ'
WHEN weight / ((height/100) * (height/100)) >= 25 THEN '๊ณผ์ฒด์ค‘'
WHEN weight / ((height/100) * (height/100)) >= 18.5 
AND weight / ((height/100) * (height/100)) <25 THEN '์ •์ƒ'
ELSE '์ €์ฒด์ค‘'
END) AS obesity_check
FROM copang_main.member;
-- NULL ์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋“ค
-- 1. COALESCE (IFNULL์— ๋น„ํ•ด ์ธ์ž ์—ฌ๋Ÿฌ๊ฐœ ๋Œ€์ž… ๊ฐ€๋Šฅ, sQL ํ‘œ์ค€ ํ•จ์ˆ˜)
-- 2. IFNULL ํ•จ์ˆ˜ (only mySQl ํ•จ์ˆ˜)
-- 3. IF ํ•จ์ˆ˜
-- 4. CASE ํ•จ์ˆ˜

DISTINCT, SUBSTRING

  • SUBSTRING: ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์‹ฑ
  • DISTINCT ๋Š” ๊ณ ์œ ํ•œ ๊ฐ’๋งŒ ์ถ”์ถœ : pandas์˜ unique๊ฐ™์€ ๊ฒƒ
SELECT DISTINCT(gender) FROM member; -- ์–ด๋–ค ๊ณ ์œ ๊ฐ’๋“ค์ด ์กด์žฌํ•˜๋Š”์ง€ ํ•œ๋ฒˆ์— ํ™•์ธ ๊ฐ€๋Šฅ -> gender ์ปฌ๋Ÿผ์ด ๊ฐ€์ง„ ๊ณ ์œ ๊ฐ’๋“ค์„ ์ถœ๋ ฅํ•œ๋‹ค.
SELECT DISTINCT(SUBSTRING(address, 1, 2)) FROM member; -- SUBSTRING ํ•จ์ˆ˜: 1์œ„์น˜์—์„œ 2๊ฐœ์˜ ๋ฌธ์ž์—ด ์ฝ์–ด๋“ค์ธ๋‹ค.(์ผ์ข…์˜ ์Šฌ๋ผ์ด์‹ฑ)

LENGTH, UPPER, LOWER, LPAD, RPAD, LTRIM, RTRIM

SELECT address, LPAD(age, 5, '!!!') FROM copang_main.member; -- LPAD, RPAD 5์ž๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค('!!!'๋ฅผ ์ฑ„์›€์œผ๋กœ์จ) ์ด๋ฏธ 5์ž๋ฆฌ๋ฉด ๋Œ€์ฒด ๋ฌธ์ž๊ฐ€ ์•ˆ๋“ค์–ด๊ฐ„๋‹ค.

-- LTRIM, RTRIM, TRIM
> ์ถ”๊ฐ€ํ•ด์ค„ ๊ฒƒ

GROUPING : ๊ทธ๋ฃนํ™” ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์กฐํšŒ / ์ปฌ๋Ÿผ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”

GROUP BY : WHERE ์ ˆ๊ณผ ์–‘๋ฆฝํ•  ์ˆ˜ ์—†๋‹ค ๐Ÿ’ฅ

  • GROUP BY๋ฅผ '์‚ฌ์šฉํ•œ ์ปฌ๋Ÿผ'๊ณผ '์ง‘๊ณ„ ํ•จ์ˆ˜' ์ด์™ธ์—๋Š” SELECT ๋ฌธ์— ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค.
  • GROUP BY๋ฅผ count, avg, min, max ๋“ฑ์˜ ์ง‘๊ณ„ ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์“ฐ๋ฉด ๋” ๋‹ค์–‘ํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
-- GROUPING
SELECT gender, COUNT(*), AVG(height) FROM member GROUP BY gender; -- GROUP BY์— ์†ํ•œ ์ปฌ๋Ÿผ์€ gender๋ฟ์ด๋‹ˆ, SELECT๋ฌธ์—๋„ gender๋งŒ ๊ฐ€๋Šฅ + ์ง‘๊ณ„ํ•จ์ˆ˜(COUNT(), AVG())
SELECT gender, COUNT(*), MIN(weight) FROM copang_main.member GROUP BY gender;
-- ๊ฐ ์ง€์—ญ๋ณ„ ์ธ์›์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด COUNT(*)๋กœ ํ•ฉ๊ณ„ ์ธ์›์„ counting
SELECT SUBSTRING(address, 1, 2) as region,
COUNT(*)
FROM copang_main.member 
GROUP BY SUBSTRING(address, 1, 2);
>>> ๊ฐ ์ฃผ์†Œ๋ฅผ ์•ž 2๊ธ€์ž๋งŒ ๋”ด region์œผ๋กœ ์žฌํŽธ์„ฑ -> ๊ฐ™์€ ์ด๋ฆ„(2๊ธ€์ž) ๋ผ๋ฆฌ countํ•˜์—ฌ counting ํ•œ๋‹ค.

HAVING

  • HAVING์€ ๊ทธ๋ฃจํ•‘์—์„œ ํ•„ํ„ฐ๋ง์„ ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
  • WHERE๋ฅผ ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค => ์˜๋ฏธ๋Š” ๋น„์Šทํ•ด๋ณด์ด์ง€๋งŒ, ๋ชฉ์ ์ด ๋‹ค๋ฅด๋‹ค.
SELECT SUBSTRING(address, 1, 2) as region,
COUNT(*)
FROM member 
GROUP BY SUBSTRING(address, 1, 2),
gender HAVING region = '์„œ์šธ'
AND gender = 'm';
-- region ์ค‘ ์„œ์šธ์ธ ๊ฒƒ๊ณผ gender๊ฐ€ m์ธ ๊ฒƒ๋งŒ ํ•„ํ„ฐ๋ง. HAVING์€ ๊ทธ๋ฃจํ•‘์—์„œ ์ถ”๋ ค๋‚ด๋Š” ๊ธฐ๋Šฅ


SELECT 
SUBSTRING(address, 1, 2) as region,
gender,
COUNT(*)
FROM member 
GROUP BY SUBSTRING(address, 1, 2), gender
HAVING region IS NOT NULL -- SUBSTRING(address, 1, 2) ๋Œ€์‹  region์„ ์จ์ค€๋‹ค.
ORDER BY
region ASC,
gender DESC;

๋ฒกํ‹ฑ๊ณผ ๋”ฐ์˜ดํ‘œ

ROLLUP (๋ง์•„ ์˜ฌ๋ฆฌ๋‹ค) : ๋ถ€๋ถ„ ์ด๊ณ„ ํ•จ์ˆ˜

SELECT
SUBSTRING(address, 1, 2) as region,
gender,
COUNT(*)
FROM copang_main.member
GROUP BY 
SUBSTRING(address, 1, 2),
gender
WITH ROLLUP -- ์–˜๊ฐ€ ๋“ค์–ด๊ฐ์œผ๋กœ์จ, null๊ฐ’์ด ๋“ค์–ด๊ฐ„(= ๋ถ€๋ถ„์ด๊ณ„) ๊ฐ’์ด ์ƒ๊ธด๋‹ค.
HAVING region IS NOT NULL 
ORDER BY
region ASC,
gender DESC;

ROLLUP ํŠน์„ฑ

  1. GROUP BY ๋’ค ๊ธฐ์ค€๋“ค์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ WITH ROLLUP ์˜ ๊ฒฐ๊ณผ๋„ ๋‹ฌ๋ผ์ง„๋‹ค.
SELECT
SUBSTRING(address, 1, 2) as region,
gender,
COUNT(*)
FROM member
GROUP BY 
SUBSTRING(address, 1, 2),
gender
WITH ROLLUP -- ์–˜๊ฐ€ ๋“ค์–ด๊ฐ์œผ๋กœ์จ, null๊ฐ’์ด ๋“ค์–ด๊ฐ„(= ๋ถ€๋ถ„์ด๊ณ„) ๊ฐ’์ด ์ƒ๊ธด๋‹ค / ROLLUP์ด ์—†์—ˆ์œผ๋ฉด, gender๊ฐ„์˜ ์ดํ•ฉ๋งŒ ๋‚˜ํƒ€๋‚  ๋ฟ, gender๋ฅผ ํ•ฉ์นœ ์ดํ•ฉ์€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค.
HAVING region IS NOT NULL 
ORDER BY 
region ASC,
gender DESC;
  1. NULL์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์“ฐ์ธ NULL vs. ๋ถ€๋ถ„ ์ด๊ณ„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์“ฐ์ธ NULL => GROUPINGํ•จ์ˆ˜๋ฅผ ์จ์„œ ํ•ด๊ฒฐ
SELECT 
YEAR(sign_up_day) AS s_year,
gender,
SUBSTRING(address, 1,2),
GROUPING(YEAR(sign_up_day)),
GROUPING(gender),
GROUPING(SUBSTRING(address,1,2)),
COUNT(*)
FROM copang_main.member
GROUP BY YEAR(sign_up_day), gender, SUBSTRING(address,1,2) WITH ROLLUP
ORDER BY s_year DESC;

Foreign Key

(1) ์ฐธ์กฐ๋ฅผ ํ•˜๋Š” ํ…Œ์ด๋ธ”์ธ stock ํ…Œ์ด๋ธ”์„ โ€˜์ž์‹ ํ…Œ์ด๋ธ”โ€™ (2) ์ฐธ์กฐ๋ฅผ ๋‹นํ•˜๋Š” ํ…Œ์ด๋ธ”์ธ item ํ…Œ์ด๋ธ”์„ โ€˜๋ถ€๋ชจ ํ…Œ์ด๋ธ”โ€™

JOIN : LEFT OUTER JOIN, RIGHT OUTER JOIN, INNER JOIN

JOIN์€ FK๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ๋งž์ง€๋งŒ, FK๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ์–ผ๋งˆ๋“ ์ง€ JOIN ํ•  ์ˆ˜ ์žˆ๋‹ค.

-- table์— AS ๋ฅผ ํ™œ์šฉํ•  ๋•, SELECT ๋ฌธ์—์„œ๋„ alias๋ฅผ ์จ์ค„ ์ˆ˜ ์žˆ๋‹ค.
-- FROM ์ ˆ์—์„œ alias๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋‹ค๋ฅธ ์ ˆ์—์„œ๋„ alias๋กœ๋งŒ ๋‚˜ํƒ€๋‚ด์•ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
SELECT
i.id,
i.name, 
s.item_id,
s.inventory_count
FROM item AS i RIGHT OUTER JOIN stock s -- alias๋ฅผ ์“ธ ๋•, ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด AS๋ฅผ ๊ผญ ์จ์ฃผ์ž
ON i.id = s.item_id;

QUIZ

(1) ์กฐ์ธ์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ ์ค‘์—์„œ pizza_price_cost ํ…Œ์ด๋ธ”์˜ name ์ปฌ๋Ÿผ๊ณผ, sales ํ…Œ์ด๋ธ”์˜ sales_volume ์ปฌ๋Ÿผ๋งŒ ์กฐํšŒํ•˜์„ธ์š”.
(2) ์ด๋•Œ sales_volume ์ปฌ๋Ÿผ์—๋Š” 'ํŒ๋งค๋Ÿ‰'์ด๋ผ๋Š” alias๋ฅผ ๋ถ™์ด๊ณ , sales_volume์ด NULL์ธ row์˜ ๊ฒฝ์šฐ์—๋Š” โ€˜ํŒ๋งค๋Ÿ‰ ์ •๋ณด ์—†์Œโ€™์œผ๋กœ ํ‘œ์‹œํ•˜์„ธ์š”.

SELECT pcc.name, COALESCE(s.sales_volume, 'ํŒ๋งค๋Ÿ‰ ์ •๋ณด ์—†์Œ') as 'ํŒ๋งค๋Ÿ‰'
FROM pizza_price_cost as pcc LEFT OUTER JOIN sales as s
ON pcc.id = s.menu_id

UNION : ํ•ฉ์น˜๋ ค๋Š” ํ…Œ์ด๋ธ”๊ฐ„์˜ ์ปฌ๋Ÿผ ์ˆ˜๊ฐ€ ๊ฐ™์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • item ํ…Œ์ด๋ธ”๊ณผ, new_item ํ…Œ์ด๋ธ”์ด ์žˆ์„ ๋•Œ, item table์— ์žˆ๋Š” ์ƒํ’ˆ์ด ๋น ์ง์—†์ด new_item ์— ์žˆ์„์ง€ ํ™•์‹ ์ด ์•ˆ๋“ ๋‹ค๋ฉด
  • JOIN์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • UNION๊ณผ UNION ALL์€ ๋‘ ํ…Œ์ด๋ธ”์„ ํ•ฉ์นœ๋‹ค๋Š” ๊ณตํ†ต์ ์€ ์žˆ์ง€๋งŒ, ๋‘ ํ…Œ์ด๋ธ”์˜ ์ค‘๋ณต row๋ฅผ ์ œ๊ฑฐํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
SELECT
old.id AS old_id,
old.name AS old_name,
new.id AS new_id,
new.name AS new_name
FROM item AS old LEFT OUTER JOIN item_new AS new
-- FROM ์ ˆ์—์„œ alias๋ฅผ ํ•ด์ฃผ์—ˆ๊ธฐ์—, ์ด๊ฑธ select ๋ฌธ์—์„œ ๊ฐ€์ ธ๋‹ค ์“ด๋‹ค(JOINํ•  ๋•Œ์˜ ๋ฌธ๋ฒ•)
ON old.id = new.id;
-- LEFT OUTER JOIN ์œผ๋กœ ๋ˆ„๋ฝ๋œ ์ •๋ณด๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

-- new table์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ํ•ญ๋ชฉ ์ฒดํฌํ•ด๋ณด๊ธฐ

SELECT
old.id AS old_id,
old.name AS old_name,
new.id AS new_id,
new.name AS new_name
FROM item AS old RIGHT OUTER JOIN item_new AS new 
ON old.id = new.id; -- ON ๋Œ€์‹  USING(id) ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค, ์กฐ์ธ ์กฐ๊ฑด์œผ๋กœ ์“ฐ์ธ ๋‘ ์ปฌ๋Ÿผ์˜ ์ด๋ฆ„์ด ๊ฐ™์œผ๋ฉด ON ๋Œ€์‹  USING์„ ์“ฐ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
-- WHERE old.id IS NULL; -- ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ๊ฒƒ๋งŒ ๋ณด๊ธฐ์œ„ํ•จ
-- INNER JOIN์„ ์“ฐ๋ฉด ๋‘ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ์•„์ดํ…œ๋งŒ ๊ฐ„์ถ”๋ฆฐ๋‹ค.
-- ์•„์˜ˆ ๋‘ ํ…Œ์ด๋ธ”์„ ํ•ฉ์ณ, ์ „์ฒด ์ƒํ’ˆ์„ ์กฐํšŒ
SELECT * FROM item
UNION
SELECT * FROM item_new; -- itemitem๊ฒน์น˜๋Š” row๋Š” ํ•œ๋ฒˆ๋งŒ ๋ณด์—ฌ์คŒ

-- ์„ธ๊ฐœ์˜ ํ…Œ์ด๋ธ” -- ๊ฐ ์ƒํ’ˆ๋ณ„ ํ‰๊ท  ํ‰์ ์„ ํ™•์ธ => ๋ช‡๋ช…์ด ์ƒํ’ˆ์„ ์ƒ€๋Š”์ง€๋„ ํ™•์ธํ•˜์—ฌ

SELECT i.id, i.name, AVG(star), COUNT(*)
FROM
item AS i LEFT OUTER JOIN review AS r
ON r.item_id = i.id
LEFT OUTER JOIN member AS m
ON r.mem_id = m.id
WHERE m.gender = 'f'
GROUP BY i.id, i.name
HAVING COUNT(*) > 1
ORDER BY 
AVG(star) DESC,
COUNT(*) DESC;

QUIZ

SELECT 
YEAR(i.registration_date) AS '๋“ฑ๋ก ์—ฐ๋„',
COUNT(*) AS '๋ฆฌ๋ทฐ ๊ฐœ์ˆ˜',
AVG(r.star) AS '๋ณ„์  ํ‰๊ท ๊ฐ’'
-- AVG(r.star)

FROM item as i INNER JOIN review as r 
ON r.item_id = i.id
INNER JOIN member as m
ON r.mem_id = m.id
WHERE i.gender = 'u'
GROUP BY YEAR(i.registration_date)
HAVING COUNT(i.registration_date) > 10;

์„œ๋ธŒ์ฟผ๋ฆฌ

  • ์ „์ฒด sql๋ฌธ์—์„œ ๋‹ค๋ฅธ sql ์ž์ฒด๋ฅผ ์„œ๋ธŒ๋กœ ์‚ฌ์šฉ
  • ๊ด„ํ˜ธ๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๊ผญ ๊ฐ์‹ธ์ค„ ๊ฒƒ, inner query๋ผ๊ณ ๋„ ํ•œ๋‹ค.
SELECT 
id,
name,
price,
-- ๊ทธ๋ƒฅ AVG(price)๋ฅผ ๋„ฃ์œผ๋ฉด, item ํ…Œ์ด๋ธ”์˜ ์ฒซ๋ฒˆ์งธ row๋งŒ ๋ฆฌํ„ด๋œ๋‹ค
(SELECT AVG(price) FROM item) AS AVG_price --AVG_price๋ผ๋Š” ์ปฌ๋Ÿผ์„ ๋งŒ๋“ค์–ด, AVG(price)๊ฐ’์„ ๋ชจ๋‘ ๋„ฃ์–ด์ค€๋‹ค
FROM item;
  • ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ, ๊ฐ€๊ฒฉ์ด ํ‰๊ท ๊ฐ€๋ณด๋‹ค ๋†’์€ row๋ฅผ ํƒ์ƒ‰
SELECT 
id,
name,
price,
(SELECT AVG(price) FROM item) AS avg_price
FROM item
WHERE price > (SELECT AVG(price) FROM item);
IN์„ ํ™œ์šฉํ•œ ์„œ๋ธŒ์ฟผ๋ฆฌ ์ƒ์„ฑ
SELECT * FROM item
WHERE id IN -- item์ปฌ๋Ÿผ์˜ id๊ฐ’์ด, IN ์ดํ›„์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๋…€์„๋“ค๋งŒ ๋‚˜ํƒ€๋‚ด๊ฒŒ ํ•œ๋‹ค 
(
SELECT item_id
FROM review
GROUP BY item_id HAVING COUNT(*) >=3
);
  • IN, ANY(= SOME), ALL
  1. ANY๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ ๋‚ด์šฉ์˜ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๊ณ 
  2. ALL์€ ์„œ๋ธŒ์ฟผ๋ฆฌ ๋‚ด์šฉ์˜ ๋ชจ๋‘๋ฅผ ๋งŒ์กฑํ•ด์•ผํ•˜๋Š” ๊ฒƒ.

Quiz

  • review ํ…Œ์ด๋ธ”์—์„œ
  • (1) '2018๋…„ 12์›” 31์ผ' ์ด์ „์— ์ฝ”ํŒก ์‚ฌ์ดํŠธ์— ๋“ฑ๋ก๋œ ์ƒํ’ˆ๋“ค์— ๊ด€ํ•œ ๋ฆฌ๋ทฐ๋“ค๋งŒ ์ถ”๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • (2) ๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ review ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ๋“ค์„ ์กฐํšŒํ•˜์„ธ์š”.
  • *์กฐ์ธ ๋ง๊ณ  ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์„ธ์š”.
SELECT * FROM review
WHERE item_id IN 
(
SELECT id FROM item
WHERE YEAR(registration_date) < 2019
-- WHERE registration_date < '2018-12-31'
);
  • FROM ์ ˆ์— ์žˆ๋Š” ์ฟผ๋ฆฌ ํ…Œ์ด๋ธ”(=์„œ๋ธŒ ์ฟผ๋ฆฌ ์ž์ฒด)์„ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ค์–ด ๋ฒ„๋ฆฌ๊ธฐ
  • ์ด ํ…Œ์ด๋ธ”์„ derivedํ…Œ์ด๋ธ”์ด๋ผ ํ•˜๋Š”๋ฐ ๊ผญ alias๋ฅผ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค. *๋‹จ์ผ๊ฐ’(1row,1col)์„ ๋ฆฌํ„ดํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ผ๊ณ ํ•œ๋‹ค.
SELECT
    AVG(review_count),
    MAX(review_count),
    MIN(review_count)
FROM
(SELECT
SUBSTRING(address, 1, 2) AS region,
COUNT(*) AS review_count
FROM review AS r LEFT OUTER JOIN member as m
ON r.mem_id = m.id
GROUP BY SUBSTRING(address, 1, 2)
HAVING region IS NOT NULL
AND region != '์•ˆ๋“œ') AS review_count_summary;
  • ์ƒ๊ด€์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ๋น„์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ
-- ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๋” ๊ฐ„๊ฒฐํ•ด์ง„ CASE๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ. ์•„๋ž˜ sql๋ฌธ์„ ๋ณด๋ฉด, SELECT์ ˆ์—์„œ "BMI"๋กœ alias ์ •ํ•œ ๊ฒƒ์€ CASE๋ฌธ์—์„œ๋Š” ์žฌ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค.
SELECT
email,
CONCAT(height, 'cm', ',', weight, 'kg') AS 'ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ',
weight / ((height / 100) * (height / 100)) AS 'BMI',
CASE
WHEN weight IS NULL OR height IS NULL THEN '๋น„๋งŒ ์—ฌ๋ถ€ ์•Œ ์ˆ˜ ์—†์Œ'
WHEN weight / ((height / 100) * (height / 100)) >= 25 THEN '๊ณผ์ฒด์ค‘ ๋˜๋Š” ๋น„๋งŒ'
WHEN weight / ((height / 100) * (height / 100)) >= 18
AND weight / ((height / 100) * (height / 100)) < 25 THEN '์ •์ƒ'
ELSE '์ €์ฒด์ค‘'
END
FROM copang_main.member;

-- ๋Œ€์‹ , FROM์ ˆ์—์„œ (SELECT weight / ((height / 100) * (height / 100)) AS 'BMI' FROM copang_main.member) AS subsequery_BMI
-- ์ด๋ ‡๊ฒŒ BMI๋กœ ๋ช…๋ช…ํ•˜๋ฉด, CASE๋ฌธ์—์„œ๋„ BMI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
SELECT
BMI, -- ์—ฌ๊ธฐ์— weight / ((height/100) * (height/100)) AS BMI ์ด๋ ‡๊ฒŒ ํ•ด๋†”์„œ ์—๋Ÿฌ๊ฐ€ ์ƒ๊ฒผ์Œ, AS ๊ตฌ๋ฌธ์„ ์“ธ ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ BMI๋งŒ ๋‚จ๊ฒจ์ค€๋‹ค.
(CASE
	WHEN BMI > 20 AND BMI < 25 THEN '์ •์ƒ'
    ELSE '๋น„์ •์ƒ'
END)
FROM (
SELECT weight / ((height/100) * (height/100)) AS BMI FROM member
) AS subquery;

๋ทฐ

  • ์„œ๋ธŒ์ฟผ๋ฆฌ ์ค‘์ฒฉ => ๋„ˆ๋ฌด๊ธธ๊ณ  ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ(๊ฐ€๋…์„ฑ ๋–จ์–ด์ ธ)
  • ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ. ๋ทฐ: ๊ฒฐ๊ณผํ…Œ์ด๋ธ”์ด ๊ฐ€์ƒ์œผ๋กœ ์ €์žฅ๋œ ์ƒํƒœ = ๊ฐ€์ƒํ…Œ์ด๋ธ”
  • ์ž์ฃผ์“ฐ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ทฐ๋กœ ๋ฏธ๋ฆฌ ์ €์žฅ์„ ํ•ด๋‘์–ด ์žฌ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž

ํ…Œ์ด๋ธ”๊ณผ ๋ทฐ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š”, ๋ทฐ๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ปดํ“จํ„ฐ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋ฌธ์ž ๊ทธ๋Œ€๋กœ '๊ฐ€์ƒ' ํ…Œ์ด๋ธ”์ด๋‹ค. ๋ทฐ์˜ ์žฅ์ 

  1. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋†’์€ ํŽธ์˜์„ฑ ์ œ๊ณต -> ํ•„์š”ํ•œ ํ…Œ์ด๋ธ” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  2. ๊ธฐ์กด ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๋ณ€ํ˜•์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ, ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ฐ€๋Šฅ
  3. ๋ฐ์ดํ„ฐ ๋ณด์•ˆ ์ œ๊ณต -> ํ…Œ์ด๋ธ”์— ๋ฏผ๊ฐ์ •๋ณด๊ฐ€ ํฌํ•œ๋œ ์ปฌ๋Ÿผ์€ ์ œ์™ธํ•˜์—ฌ ๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•ˆ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
CREATE VIEW v_emp AS SELECT
id, name, age, department, phone_num, hire_date FROM employee;
SELECT * FROM v_emp;

์‹ค๋ฌด์—์„œ ์ฒซ๋ฒˆ์งธ๋กœ ํ•ด์•ผ ํ• 

  1. ์กด์žฌํ•˜๋Š” DB ํŒŒ์•…

SHOW DATABASES; use <DB์ด๋ฆ„>;

  1. ์กด์žฌํ•˜๋Š” Table ํŒŒ์•…

SHOW FULL TABLES IN copang_main;

  1. ํ•œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ๊ตฌ์กฐ ํŒŒ์•…

DESCRIBE item; -- item์€ table์ด๋ฆ„

  1. Foreign Key ํŒŒ์•…

where์ ˆ ๋Œ€์‹  having ์ ˆ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ

where์ ˆ, having์ ˆ ์ฐจ์ด ๋ฐ ํŠน์ง•

  1. having์ ˆ์€ ํ•ญ์ƒ group by ๋’ค์— ์œ„์น˜, where์ ˆ์€ group by ์•ž์— ์œ„์น˜.
  • ์ด์œ ๋Š”, having ์ ˆ์€ group by๋œ ์ดํ›„ ํŠน์ •ํ•œ ํ•„๋“œ๋กœ ๊ทธ๋ฃนํ™” ๋œ ํ…Œ์ด๋ธ”์— ์กฐ๊ฑด์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  1. where์ ˆ์—๋„ ๋ฌผ๋ก  group by ์ ˆ์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋งŒ, where ์ ˆ์ด ๋จผ์ € ๋‚˜์˜ค๋Š” ๋งŒํผ, where ์กฐ๊ฑด์— ๋งž๋Š” ์ •๋ณด๋ฅผ ์šฐ์„  ํ•„ํ„ฐํ•œ ํ›„ group by๋กœ ๊ทธ๋ฃนํ™” ํ•œ๋‹ค.
  • ๋ฐ˜๋Œ€๋กœ having ์ ˆ์€ group by๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ๋งŒํผ, groupํ™” ๋œ ์ƒํƒœ์—์„œ having์ ˆ์— ๋งž๋Š” ์กฐ๊ฑด์„ ํ•„ํ„ฐ๋งํ•œ๋‹ค. ์ด ๋•Œ having ์กฐ๊ฑด์ ˆ์— ์ด์šฉํ•œ ์ปฌ๋Ÿผ์€ ๋ฐ˜๋“œ์‹œ select์— ๋ช…์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค.
select NAME, COUNT(NAME) as COUNT from ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) > 1 ORDER BY NAME;


select date_format(datetime, '%H') as HOUR, COUNT(datetime) as COUNT from animal_outs where date_format(datetime, '%H') >= 9 and date_format(datetime, '%H') <= 19 group by hour order by hour asc;

mysql-practice's People

Contributors

tbnsok40 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.