ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ํ ์ด๋ธ์ ์กด์ฌํ๋ ํ๋ค์ ๊ทธ๋ฃน๋ณ๋ก ๊ตฌ๋ถ
-- mem_id๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์
-- ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์์ mem_id์ amount ํฉ๊ณ๋ฅผ ๊ตฌํจ
SELECT mem_id, SUM(amount) AS 'ํฉ๊ณ'
FROM buy
GROUP BY mem_id;
-- genre๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํ → genre์ price ํ๊ท ์ ๊ตฌํจ
SELECT genre, AVG(price) AS 'ํ๊ท '
FROM library
GROUP BY genre;
-- ์ง๊ณ ํจ์ ์์์ ์ฐ์ฐ ๊ฐ๋ฅ
SELECT mem_id, SUM(amount * price) AS '์ด ๊ธ์ก'
FROM buy
GROUP BY mem_id;
-- member ํ
์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ ๊ฐ์ (NULL ํฌํจ๋์ด์์ด๋ ์นด์ดํธ)
SELECT COUNT(*)
FROM member;
-- member ํ
์ด๋ธ์ phone1 ์ปฌ๋ผ์ด NULL์ธ ๊ฒ์ ์ ์ธํ ๋ชจ๋ ๋ฐ์ดํฐ ๊ฐ์
SELECT COUNT(phone1)
FROM member;
-- ์ฟผ๋ฆฌ๊ฐ ์ ํจํ๋ ค๋ฉด name์ด์ SELECT์ ์์ ์๋ตํ๊ฑฐ๋ GROUP BY์ ์ ๋ช
์ํด์ผ ํ๋ค
SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid
SQL:1999(SQL 3) ์ดํ ๋ฒ์ ์์๋ ์ ํ์ ๊ธฐ๋ฅ T301์ ํตํด ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด GROUP BY์ ์ ํฌํจ๋์ง ์์ ๋น์ง๊ณ ์ด์ ํ์ฉ
์ด ๊ฒฝ์ฐ, ํด๋น ์ด์ด GROUP BY์ ์ ํฌํจ๋ ์ด์ ํจ์์ ์ผ๋ก ์ข ์๋์ด์ผ ํ๋ค
์๋ฅผ ๋ค์ด, name๊ณผ custid ์ฌ์ด์ ํจ์์ ์ข ์ ๊ด๊ณ๊ฐ ์กด์ฌํ๋ค๋ฉด(customers์ ๊ธฐ๋ณธํค๊ฐ custid์ธ ๊ฒฝ์ฐ), ๋น์ง๊ณ ์ด์ธ name์ ์ฌ์ฉํ ์ฟผ๋ฆฌ๋ ์ ํจํ๋ค!
MySQL์ ํจ์์ ์ข ์์ฑ(functional dependence) ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ตฌํ
๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์๋ ONLY_FULL_GROUP_BY SQL ๋ชจ๋๊ฐ ์ค์ ๋๋ฉด ์๋ ์ฟผ๋ฆฌ๋ฅผ ๊ฑฐ๋ถ
- SELECT ๋ชฉ๋ก, HAVING ์กฐ๊ฑด ๋๋ ORDER BY ๋ชฉ๋ก์์ ์ง๊ณ๋์ง ์์ ์ด์ ์ฐธ์กฐํ ๋
- ํด๋น ์ด์ด GROUP BY์ ์ ๋ช ์์ ์ผ๋ก ํฌํจ๋์ง ์์๊ฑฐ๋,
- GROUP BY์ ์ ํฌํจ๋ ์ด์ ๋ํด ํจ์์ ์ผ๋ก ์ข ์๋์ง ์์ ๊ฒฝ์ฐ
์ฆ, ONLY_FULL_GROUP_BY ๋ชจ๋๊ฐ ํ์ฑํ๋๋ฉด
GROUP BY์ ์ ๋ช ์๋์ง ์์ ๋น์ง๊ณ ์ด์ SELECT, HAVING, ORDER BY์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ,
๋ง์ฝ ์ฌ์ฉํ๋ ค๋ฉด ํด๋น ์ด์ด GROUP BY์ ์ ํฌํจ๋ ์ด์ ์ํด ๊ฒฐ์ ๋ ์ ์์ด์ผ ํ๋ค
๊ทธ๋ฌ๋ GROUP BY์ ์ ํฌํจ๋์ง ์์ ์ด์ด๋ผ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์์ ํญ์ ํ๋์ ๊ฐ๋ง ๊ฐ์ง ์ ์๋ค๋ฉด ํ์ฉ๋๋ค
ONLY_FULL_GROUP_BY ๋ชจ๋๊ฐ ๋นํ์ฑํ๋ ๊ฒฝ์ฐ,
GROUP BY์ ์ ๋ช ์๋์ง ์์ ๋น์ง๊ณ ์ด์ SELECT, HAVING, ORDER BY์์ ์ฌ์ฉํ ์ ์๋ค
์ด ๊ฒฝ์ฐ, ์๋ฒ๋ ๊ฐ ๊ทธ๋ฃน์์ ์์์ ๊ฐ์ ์ ํ → ๊ทธ๋ฃน ๋ด์์ ์๋ก ๋ค๋ฅธ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด ์ ํ๋๋ ๊ฐ์ด ์์ธกํ ์ ์๊ฒ ๋๋ค
GROUP BY์ ์ ํฌํจ๋์ง ์์ ๋น์ง๊ณ ์ด์ด ๊ฐ ๊ทธ๋ฃน์์ ํญ์ ๋์ผํ ๊ฐ์ ๊ฐ์ง๋ค๋ ํ์ ์ด ์์ ๋๋ง ์ ์ฉํ๋ค
ONLY_FULL_GROUP_BY ๋ชจ๋๋ฅผ ๋นํ์ฑํํ์ง ์์ผ๋ฉด์๋ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป๊ณ ์ถ๋ค๋ฉด, ANY_VALUE() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น์ง๊ณ ์ด์ ์ฐธ์กฐํ์!
SELECT name, ANY_VALUE(dress), MAX(age)
FROM T
GROUP BY name'๐ SQL > ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| MAX()์ LIMIT 1 (0) | 2025.02.22 |
|---|---|
| LIKE / REGEXP (0) | 2025.02.20 |
| JOIN (0) | 2025.02.19 |
| ์ซ์ ํจ์ (0) | 2025.02.18 |
| ๋ ์ง, ์๊ฐ ํจ์ (0) | 2025.02.17 |