Chapter 2. SQL ๋ฐ์ดํฐ ๊ด๋ฆฌ
SELECT * FROM copang_main.member; -- copang_main์ด๋ผ๋ db์ member table์ ๊ฐ์ ธ์จ๋ค.
- 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;
- %์ ์ฌ์ฉ: ์์ธ%, '์์ธ'๋ค์ ๋ฌธ์์ด์ ๊ธธ์ด๋ ๋ฌด๊ดํ๋ค.
- "_" ์ ์ฌ์ฉ: ์์ธ_, '์์ธ'๋ค์ ๋ฌธ์์ด์ ๊ธธ์ด๋ 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 ๋ณด๋ค ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ฏ๋ก ๊ดํธ๋ฅผ ์ ์ ํ ์ฌ์ฉํด์ฃผ์.
-- ์๋ ๋์ ๊ฐ์ ์๋ฏธ: OR๋ก ์ด ๊ฒ์ IN์ผ๋ก ํํํ ์ ์๋ค.
SELECT * FROM member WHERE age = 20 OR age = 30 OR age =40;
SELECT * FROM member WHERE age IN (20, 30, 40);
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)
SELECT MIN(height) FROM member;
SELECT AVG(height) FROM member;
-- AVG๋ 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 ํจ์
- SUBSTRING: ๋ฌธ์์ด ์ฌ๋ผ์ด์ฑ
- DISTINCT ๋ ๊ณ ์ ํ ๊ฐ๋ง ์ถ์ถ : pandas์ unique๊ฐ์ ๊ฒ
SELECT DISTINCT(gender) FROM member; -- ์ด๋ค ๊ณ ์ ๊ฐ๋ค์ด ์กด์ฌํ๋์ง ํ๋ฒ์ ํ์ธ ๊ฐ๋ฅ -> gender ์ปฌ๋ผ์ด ๊ฐ์ง ๊ณ ์ ๊ฐ๋ค์ ์ถ๋ ฅํ๋ค.
SELECT DISTINCT(SUBSTRING(address, 1, 2)) FROM member; -- SUBSTRING ํจ์: 1์์น์์ 2๊ฐ์ ๋ฌธ์์ด ์ฝ์ด๋ค์ธ๋ค.(์ผ์ข
์ ์ฌ๋ผ์ด์ฑ)
SELECT address, LPAD(age, 5, '!!!') FROM copang_main.member; -- LPAD, RPAD 5์๋ฆฌ๋ก ๋ง๋ค์ด์ค๋ค('!!!'๋ฅผ ์ฑ์์ผ๋ก์จ) ์ด๋ฏธ 5์๋ฆฌ๋ฉด ๋์ฒด ๋ฌธ์๊ฐ ์๋ค์ด๊ฐ๋ค.
-- LTRIM, RTRIM, TRIM
> ์ถ๊ฐํด์ค ๊ฒ
- 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์ ๊ทธ๋ฃจํ์์ ํํฐ๋ง์ ํ ๋๋ง ์ฌ์ฉํ๋ค.
- 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;
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;
- 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;
- 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;
(1) ์ฐธ์กฐ๋ฅผ ํ๋ ํ ์ด๋ธ์ธ stock ํ ์ด๋ธ์ โ์์ ํ ์ด๋ธโ (2) ์ฐธ์กฐ๋ฅผ ๋นํ๋ ํ ์ด๋ธ์ธ item ํ ์ด๋ธ์ โ๋ถ๋ชจ ํ ์ด๋ธโ
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;
(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
- 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;
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
- ANY๋ ์๋ธ์ฟผ๋ฆฌ ๋ด์ฉ์ ํ๋๋ผ๋ ๋ง์กฑํ๋ฉด ๋๋ ๊ฒ์ด๊ณ
- ALL์ ์๋ธ์ฟผ๋ฆฌ ๋ด์ฉ์ ๋ชจ๋๋ฅผ ๋ง์กฑํด์ผํ๋ ๊ฒ.
- 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;
- ์๋ธ์ฟผ๋ฆฌ ์ค์ฒฉ => ๋๋ฌด๊ธธ๊ณ ์ค๋ณต๋๋ ๋ฌธ์ ๋ฐ์(๊ฐ๋ ์ฑ ๋จ์ด์ ธ)
- ๋ทฐ๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐ. ๋ทฐ: ๊ฒฐ๊ณผํ ์ด๋ธ์ด ๊ฐ์์ผ๋ก ์ ์ฅ๋ ์ํ = ๊ฐ์ํ ์ด๋ธ
- ์์ฃผ์ฐ๋ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์๋ค๋ฉด ๋ทฐ๋ก ๋ฏธ๋ฆฌ ์ ์ฅ์ ํด๋์ด ์ฌ์ฌ์ฉํ๋๋ก ํ์
ํ ์ด๋ธ๊ณผ ๋ทฐ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋, ๋ทฐ๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ปดํจํฐ์ ์ ์ฅ๋์ด ์๋ ๊ฒ์ด ์๋๋ค. ๋ฌธ์ ๊ทธ๋๋ก '๊ฐ์' ํ ์ด๋ธ์ด๋ค. ๋ทฐ์ ์ฅ์
- ์ฌ์ฉ์์๊ฒ ๋์ ํธ์์ฑ ์ ๊ณต -> ํ์ํ ํ ์ด๋ธ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
- ๊ธฐ์กด ํ ์ด๋ธ ๊ตฌ์กฐ๋ฅผ ๋ณํ์ํค์ง ์์ผ๋ฉด์, ๋ค์ํ ๋ฐ์ดํฐ ๋ถ์ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ ๋ณด์ ์ ๊ณต -> ํ ์ด๋ธ์ ๋ฏผ๊ฐ์ ๋ณด๊ฐ ํฌํ๋ ์ปฌ๋ผ์ ์ ์ธํ์ฌ ๋ทฐ๋ฅผ ๋ง๋ค์ด ๋ณด์ ์งํฌ ์ ์๋ค.
CREATE VIEW v_emp AS SELECT
id, name, age, department, phone_num, hire_date FROM employee;
SELECT * FROM v_emp;
- ์กด์ฌํ๋ DB ํ์
SHOW DATABASES; use <DB์ด๋ฆ>;
- ์กด์ฌํ๋ Table ํ์
SHOW FULL TABLES IN copang_main;
- ํ ํ ์ด๋ธ์ ์ปฌ๋ผ ๊ตฌ์กฐ ํ์
DESCRIBE item; -- item์ table์ด๋ฆ
- Foreign Key ํ์
where์ ๋์ having ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐ
where์ , having์ ์ฐจ์ด ๋ฐ ํน์ง
- having์ ์ ํญ์ group by ๋ค์ ์์น, where์ ์ group by ์์ ์์น.
- ์ด์ ๋, having ์ ์ group by๋ ์ดํ ํน์ ํ ํ๋๋ก ๊ทธ๋ฃนํ ๋ ํ ์ด๋ธ์ ์กฐ๊ฑด์ ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
- 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;