์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Absolute
- AGI
- ai
- AI agents
- AI engineer
- AI researcher
- ajax
- algorithm
- Algorithms
- aliases
- Array ๊ฐ์ฒด
- ASI
- bayes' theorem
- Bit
- Blur
- BOM
- bootstrap
- canva
- challenges
- ChatGPT
- Today
- In Total
A Joyful AI Research Journey๐ณ๐
[53] 230315 SQL Ch 5. ์ง๊ณ์ ์๋ธ์ฟผ๋ฆฌ: 20๊ฐ ํ ๊ฐ์ ๊ตฌํ๊ธฐ - COUNT, 21๊ฐ COUNT ์ด์ธ์ ์ง๊ณํจ์, 22๊ฐ ๊ทธ๋ฃนํ - GROUP BY [K-๋์งํธ ํธ๋ ์ด๋ 53์ผ] ๋ณธ๋ฌธ
[53] 230315 SQL Ch 5. ์ง๊ณ์ ์๋ธ์ฟผ๋ฆฌ: 20๊ฐ ํ ๊ฐ์ ๊ตฌํ๊ธฐ - COUNT, 21๊ฐ COUNT ์ด์ธ์ ์ง๊ณํจ์, 22๊ฐ ๊ทธ๋ฃนํ - GROUP BY [K-๋์งํธ ํธ๋ ์ด๋ 53์ผ]
yjyuwisely 2023. 3. 15. 11:50230315 Wed 53rd class
Ch 5. ๋ฐ์ดํฐ์ ์ถ๊ฐ, ์ญ์ , ๊ฐฑ์
์ง๋: p. 182 ~ (๊ต์ฌ: SQL ์ฒซ๊ฑธ์, ์ ์: ์์ฌ์ด ์์ธ ์)
MySQL Workbench Manual: https://dev.mysql.com/doc/workbench/en/
MySQL ํํ ๋ฆฌ์ผ: https://www.tutorialspoint.com/mysql/
SQLD ์์ฝ pdf: https://yurimac.tistory.com/40
์ฑ
์์ฝ (9p) pdf: https://brunch.co.kr/@ydy702/10
์ค๋ ๋ฐฐ์ด ๊ฒ ์ค ๊ธฐ์ตํ ๊ฒ์ ์ ๋ฆฌํ๋ค.
๋ชฐ๋๋ ๊ฒ ์ ๋ฆฌ
์ง๊ณํจ์(COUNT, SUM, AVG, MIN, MAX)๋ ์งํฉ ์์ NULL ๊ฐ์ด ์์ ๊ฒฝ์ฐ ๋ฌด์ํ๋ค. p. 186
๋ฌธ๋ฒ ์์ฑ ์์
1. SELECT ๊ตฌ → 2. WHERE ๊ตฌ → 3. GROUP BY ๊ตฌ → 4. HAVING ๊ตฌ → 5. ORDER BY ๊ตฌ
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
์์ 1)
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
์์ 2)
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5
ORDER BY COUNT(CustomerID) DESC;
์ฐธ๊ณ : https://www.w3schools.com/sql/sql_having.asp
๋ด๋ถ์ฒ๋ฆฌ ์์ p. 200
1. WHERE ๊ตฌ → 2. GROUP BY ๊ตฌ → 3. HAVING ๊ตฌ → 4. SELECT ๊ตฌ → 5. ORDER BY ๊ตฌ
MySQL์์ ์ค๋ฅ๋๋ ๊ฒฝ์ฐ (p. 206, p. 211)
์๋ ์ฝ๋์ฒ๋ผ ์จ์ผํ๋ค.
5์ฅ ์ง๊ณ์ ์๋ธ์ฟผ๋ฆฌ
์ฑ ์ ๋ชฉ์ฐจ
__20๊ฐ__ํ ๊ฐ์ ๊ตฌํ๊ธฐ - COUNT
1. COUNT๋ก ํ ๊ฐ์ ๊ตฌํ๊ธฐ
2. ์ง๊ณํจ์์ NULL๊ฐ
3. DISCOUNT๋ก ์ค๋ณต ์ ๊ฑฐ
4. ์ง๊ณํจ์์์ DISTINCT
__21๊ฐ__COUNT ์ด์ธ์ ์ง๊ณํจ์
1. SUM์ผ๋ก ํฉ๊ณ ๊ตฌํ๊ธฐ
2. AVG๋ก ํ๊ท ๋ด๊ธฐ
3. MIN, MAX๋ก ์ต์๊ฐ, ์ต๋๊ฐ ๊ตฌํ๊ธฐ
__22๊ฐ__๊ทธ๋ฃนํ - GROUP BY
1. GROUP BY๋ก ๊ทธ๋ฃนํ
2. HAVING ๊ตฌ๋ก ์กฐ๊ฑด ์ง์
3. ๋ณต์์ด์ ๊ทธ๋ฃนํ
4. ๊ฒฐ๊ด๊ฐ ์ ๋ ฌ
__23๊ฐ__์๋ธ์ฟผ๋ฆฌ
1. DELETE์ WHERE ๊ตฌ์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ
2. ์ค์นผ๋ผ ๊ฐ
3. SELECT ๊ตฌ์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ
4. SET ๊ตฌ์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ
5. FROM ๊ตฌ์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ
6. INSERT ๋ช ๋ น๊ณผ ์๋ธ์ฟผ๋ฆฌ
__24๊ฐ__์๊ด ์๋ธ์ฟผ๋ฆฌ
1. EXISTS
2. NOT EXISTS
3. ์๊ด ์๋ธ์ฟผ๋ฆฌ
4. IN
20๊ฐ ํ ๊ฐ์ ๊ตฌํ๊ธฐ - COUNT
์ง๊ณํจ์
COUNT(์งํฉ)
SUM(์งํฉ)
AVG(์งํฉ)
MIN(์งํฉ)
MAX(์งํฉ)
์ง๊ณํจ์๋ ์งํฉ ์์ NULL ๊ฐ์ด ์์ ๊ฒฝ์ฐ ๋ฌด์ํ๋ค. p. 186
20.1 COUNT๋ก ํ ๊ฐ์ ๊ตฌํ๊ธฐ
COUNT
COUNT(์งํฉ)
์์ 5-1) sample51์ ํ ๊ฐ์ ๊ตฌํ๊ธฐ
SELECT * FROM sample51;
-- COUNT๋ก ํ ๊ฐ์ ๊ณ์ฐ
SELECT COUNT(*) FROM sample51;
COUNT๋ ์ธ์๋ก ์ง์ ๋ ์งํฉ(์ด ๊ฒฝ์ฐ๋ ํ ์ด๋ธ ์ ์ฒด)์ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ค. sample51์๋ ์ ๋ถ 5๊ฐ์ ํ์ด ์์ผ๋ฏ๋ก 5๊ฐ ๋ฐํ๋์๋ค.
Point: COUNT ์ง๊ณํจ์๋ก ํ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์๋ค.
- WHERE ๊ตฌ ์ง์ ํ๊ธฐ
์์ 5-2) sample51์ ํ ๊ฐ์๋ฅผ WHERE ๊ตฌ๋ฅผ ์ง์ ํ์ฌ ๊ตฌํ๊ธฐ
SELECT * FROM sample51 WHERE name = 'A';
SELECT COUNT(*) FROM smaple51 WHERE name = 'A';
20.2 ์ง๊ณํจ์์ NULL๊ฐ
์์ 5-3) ํ ๊ฐ์๋ฅผ ๊ตฌํ ๋ NULL ๊ฐ ๋ค๋ฃจ๊ธฐ
SELECT * FROM sample51;
SELECT COUNT(no), COUNT(name) FROM sample51; -- null์ ๋ฌด์๋๋ค.
COUNT(*): ๋ชจ๋ ์ด์ ํ์๋ฅผ ์นด์ดํธํ๋ฏ๋ก NULL ๊ฐ์ด ์์ด๋ ํด๋น ์ ๋ณด๊ฐ ๋ฌด์๋์ง ์๋๋ค.
Point: ์ง๊ณํจ์๋ ์งํฉ ์์ NULL ๊ฐ์ด ์์ ๊ฒฝ์ฐ ๋ฌด์ํ๋ค.
20.3 DISCOUNT๋ก ์ค๋ณต ์ ๊ฑฐ
์์ 5-4) sample51 ํ ์ด๋ธ
SELECT * FROM sample51;
DISTINCT: ์ค๋ณต๋ ๊ฐ์ ์ ๊ฑฐํ๋ ํจ์
์์ 5-5) DISTINCT๋ก ์ค๋ณต ์ ๊ฑฐํ๊ธฐ
SELECT ALL name FROM sample51;
-- DISTINCT๋ฅผ ์ง์ , ์ฝค๋ง๋ฅผ ๋ถ์ด์ง ์๋๋ค.
SELECT DISTINCT name FROM sample51;
Point: DISTINCT๋ก ์ค๋ณต๊ฐ์ ์ ๊ฑฐํ ์ ์๋ค.
20.4 ์ง๊ณํจ์์์ DISTINCT
์์ 5-6) ์ค๋ณต์ ์ ๊ฑฐํ ๋ค ๊ฐ์ ๊ตฌํ๊ธฐ
SELECT COUNT(ALL name), COUNT(DISTINCT name) FROM sample51;
์์ ์์ 5-5๋ฅผ ๋ณด๋ฉด COUNT(ALL name)์ ๊ตฌ์ฑ์ A A B C๋ก ์ด 4๊ฐ
COUNT(DISTINCT name)์ ๊ตฌ์ฑ์ A B C๋ก ์ด 3๊ฐ์ธ ๊ฒ์ ์ ์ ์๋ค.
21๊ฐ COUNT ์ด์ธ์ ์ง๊ณํจ์ (SUM, AVG, MIN, MAX) p. 190
COUNT([ALL|DISTINCT] ์งํฉ)
SUM([ALL|DISTINCT] ์งํฉ)
AVG([ALL|DISTINCT] ์งํฉ)
MIN([ALL|DISTINCT] ์งํฉ)
MAX([ALL|DISTINCT] ์งํฉ)
21.1 SUM์ผ๋ก ํฉ๊ณ ๊ตฌํ๊ธฐ
์์ 5-7) SUM์ผ๋ก ํฉ๊ณ ๊ตฌํ๊ธฐ
SELECT * FROM sample51;
-- SUM์ผ๋ก quantity์ด์ ํฉ๊ณ ๊ตฌํ๊ธฐ
SELECT SUM(quantity) FROM sample51;
Point: ์ง๊ณํจ์๋ก ์งํฉ์ ํฉ๊ณ๋ฅผ ๊ตฌํ ์ ์๋ค.
21.2 AVG๋ก ํ๊ท ๋ด๊ธฐ
์์ 5-8) AVG๋ก ํ๊ท ๊ฐ ๊ตฌํ๊ธฐ
SELECT * FROM sample51;
SELECT AVG(quantity), SUM(quantity)/COUNT(quantity) FROM sample51;
Point: AVG ์ง๊ณํจ์๋ก ์งํฉ์ ํ๊ท ๊ฐ์ ๊ตฌํ ์ ์๋ค.
์์ 5-9) AVG๋ก ํ๊ท ๊ฐ ๊ณ์ฐ (NULL์ 0์ผ๋ก ๋ณํ)
SELECT AVG(CASE WHEN quantity IS NULL THEN 0 ELSE quantity END)
AS avgnull0 FROM sample51;
์์ ์ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ)
21.3 MIN, MAX๋ก ์ต์๊ฐ, ์ต๋๊ฐ ๊ตฌํ๊ธฐ
์์ 5-10) MIN, MAX๋ก ์ต์๊ฐ, ์ต๋๊ฐ ๊ตฌํ๊ธฐ
SELECT * FROM sample51;
SELECT MIN(quantity), MAX(qunatity), MIN(name), MAX(name) FROM sample51;
22๊ฐ ๊ทธ๋ฃนํ - GROUP BY
GROUP BY
SELECT * FROM ํ
์ด๋ธ๋ช
GROUP BY ์ด1, ์ด2, ...
22.1 GROUP BY๋ก ๊ทธ๋ฃนํ
์์ 5-11) sample51 ํ ์ด๋ธ
SELECT * FROM sample51;
-- GROUP BY ๊ตฌ์ name์ด์ ์ง์ ํด ๊ทธ๋ฃนํํ๊ธฐ
SELECT name FROM sample51 GROUP BY name;
์์ 5-12) name ์ด๋ก ๊ทธ๋ฃนํํ๊ธฐ
GROUP BY: ์ง์ ๋ ์ด์ ๊ฐ์ด ๊ฐ์ ํ์ด ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ธ๋ค.
Point: GROUP BY ๊ตฌ๋ก ๊ทธ๋ฃนํํ ์ ์๋ค.
์์ 5-13) name ์ด์ ๊ทธ๋ฃนํํด ๊ณ์ฐํ๊ธฐ
-- GROUP BY ๊ตฌ์ ์ง๊ณํจ์๋ฅผ ์กฐํฉ
SELECT name, COUNT(name), SUM(quantity)
FROM sample51 GROUP BY name;
22.2 HAVING ๊ตฌ๋ก ์กฐ๊ฑด ์ง์
The HAVING clause was added to SQL because the WHERE keyword cannot be used with aggregate functions.
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
์ฐธ๊ณ : https://www.w3schools.com/sql/sql_having.asp
Point: WHERE ๊ตฌ์์๋ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์์ 5-14) HAVING์ ์ฌ์ฉํด ๊ฒ์
SELECT name, COUNT(name) FROM sample51 GROUP BY name;
-- HAVING๊ตฌ๋ก ๊ฑธ๋ฌ๋ด๊ธฐ
SELECT name, COUNT(name) FROM sample51
GROUP BY name HAVING COUNT(name) = 1;
Point: ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ HAVNIG ๊ตฌ๋ก ๊ฒ์์กฐ๊ฑด์ ์ง์ ํ๋ค.
๋ฌธ๋ฒ ์์ฑ ์์
1. SELECT ๊ตฌ → 2. WHERE ๊ตฌ → 3. GROUP BY ๊ตฌ → 4. HAVING ๊ตฌ → 5. ORDER BY ๊ตฌ
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
๋ด๋ถ์ฒ๋ฆฌ ์์
1. WHERE ๊ตฌ → 2. GROUP BY ๊ตฌ → 3. HAVING ๊ตฌ → 4. SELECT ๊ตฌ → 5. ORDER BY ๊ตฌ
SELECT SQL ๋ฌธ๋ฒ ์์ฑ ์์ (์ฌ์ฉ์ ์์ฑ)
1. SELECT ์ด๋ช (5)
FROM ํ ์ด๋ธ๋ช (1)
2. WHERE ์กฐ๊ฑด์ (2)
3. GROUP BY ๊ทธ๋ฃนํํ ์ด๋ช (3)
4. HAVING ๊ทธ๋ฃนํ๊ณ ๋ ํ์ ์กฐ๊ฑด์ (4)
5. ORDER BY ์ ๋ ฌํ๊ณ ์ ํ๋ ์ด๋ช (6)
SELECT SQL ์ฟผ๋ฆฌ ์คํ ์์ (DBMS ๋ด๋ถ ์ฒ๋ฆฌ)
FROM: ์กฐํ ํ ์ด๋ธ ํ์ธ
1. WHERE: ๋ฐ์ดํฐ ์ถ์ถ ์กฐ๊ฑด ํ์ธ
2. GROUP BY: ๊ทธ๋ฃนํ
3. HAVING: ๊ทธ๋ฃนํ ํ ์กฐ๊ฑด
4. SELECT: ๋ฐ์ดํฐ ์ถ์ถ
5. ORDER BY: ๋ฐ์ดํฐ ์์ ์ ๋ ฌ
Point: ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ HAVING ๊ตฌ๋ก ๊ฒ์์กฐ๊ฑด์ ์ง์ ํ๋ค.
22.3 ๋ณต์์ด์ ๊ทธ๋ฃนํ
์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์งํฉ์ ํ๋์ ๊ฐ์ผ๋ก ๊ณ์ฐ๋๋ฏ๋ก, ๊ทธ๋ฃน๋ง๋ค ํ๋์ ํ์ ์ถ๋ ฅํ ์ ์๋ค.
SELECT MIN(no), name, SUM(quantity) FROM sample51 GROUP BY name;
Point: GROUP BY์์ ์ง์ ํ ์ด ์ด์ธ์ ์ด์ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ์ง ์์ ์ฑ SELECT ๊ตฌ์ ์ง์ ํ ์ ์๋ค.
no์ quantity๋ก ๊ทธ๋ฃนํํ๋ค๋ฉด ์๋์ฒ๋ผ ํ๋ค.
SELECT no, quantity FROM sample51 GROUP BY no, quantity;
22.4 ๊ฒฐ๊ด๊ฐ ์ ๋ ฌ
์์ 5-15) ์ง๊ณํ ๊ฒฐ๊ณผ ์ ๋ ฌํ๊ธฐ
-- name ์ด๋ก ๊ทธ๋ฃนํํด ํฉ๊ณ๋ฅผ ๊ตฌํ๊ณ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ
SELECT name, COUNT(name), SUM(quantity)
FROM sample51 GROUP BY name ORDER BY SUM(quantity) DESC;