๐ ๊ทธ๋ฃนํจ์์ ํ์์ฑ
๊ทธ๋ฃน ํจ์(GROUP FUNCTION)์ ํ์์ฑ
๊ฒฐ์ฐ ๊ฐ๋ ์ ์ ๋ฌด๋ฅผ ๊ฐ์ง๋ ์๊ฐ๋ ํ๋งค ์์คํ ์ ๊ฒฝ์ฐ๋ ์๊ณ, ์ค๊ณ, ํฉ๊ณ, ์ด ํฉ๊ณ ๋ฑ ์ฌ๋ฌ ๋ ๋ฒจ์ ๊ฒฐ์ฐ ๋ณด๊ณ ์๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ค์ ์ ๋ฌด ์ค์ ํ๋์ ๋๋ค. ๊ฐ๋ฐ์๋ค์ด ์ด๋ฐ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ๋ ๋ฒจ๋ณ ์ง๊ณ๋ฅผ ์ํ ์ฌ๋ฌ ๋จ๊ณ์ SQL์ UNION, UNION ALL๋ก ๋ฌถ์ ํ ํ๋์ ํ ์ด๋ธ์ ์ฌ๋ฌ ๋ฒ ์ฝ์ด ๋ค์ ์ฌ์ ๋ ฌํ๋ ๋ณต์กํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ๋ง ํฉ๋๋ค.
ํ์ง๋ง, ๊ทธ๋ฃน ํจ์(GROUP FUNCTION)์ ์ฌ์ฉํ๋ค๋ฉด, ํ๋์ SQL๋ก ํ ์ด๋ธ์ ํ ๋ฒ๋ง ์ฝ์ด์ ๋น ๋ฅด๊ฒ ์ํ๋ ๋ฆฌํฌํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ํ, GROUPING ํจ์์ CASE ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ์ํ๋ ํฌ๋งท์ ๋ณด๊ณ ์ ์์ฑ๋ ๊ฐ๋ฅํฉ๋๋ค.
๐ ์์ฝ
- ROLLUP ํจ์ : ์๊ทธ๋ฃน ๊ฐ์ ์๊ณ๋ฅผ ๊ณ์ฐํจ
- CUBE ํจ์ : GROUP BY ํญ๋ชฉ๋ค๊ฐ ๋ค์ฐจ์์ ์ธ ์๊ณ๋ฅผ ๊ณ์ฐํ ์ ์์ (๋ชจ๋ ๊ทธ๋ฃน์ผ์ด์ค๋ฅผ ๊ณ์ฐํจ)
- GROUPING SETS ํจ์ : ํน์ ํญ๋ชฉ์ ๋ํ ์๊ณ๋ฅผ ๊ณ์ฐํ ์ ์์ (GROUPING SETS ์ ํน์ ํญ๋ชฉ์ ๊ทธ๋ฃนํ ๋ค์์ SQL๋ค์ UNIONํ ๊ฒ๊ณผ ๊ฐ์)
๐GROUPING SETS์
Grouping sets์ ์ ํ์ํ๊ฐ?
๋ง์ฝ subject ๋ณ ํ๊ท ๊ณผ name ๋ณ ํ๊ท , All ํ๊ท ์ ๋ณด๋ฅผ ํ๋ฒ์ ๋ณด๊ณ ์ถ๋ค๋ฉด...
โ ํ๋์ฉ Group by ํ ๊ฒฐ๊ณผ๋ฅผ
Union All
ํด์ ์ถ๋ ฅ ๊ฐ๋ฅ- ๊ทผ๋ฐ ๋๋ฌด ์ฟผ๋ฆฌ๋ฌธ์ด ๊ธธ์ด์ง๋ค.
Union all ๋์ ์ ์ธ ์ ์๋๊ฒ ์๋ค๋ฉด !?
```sql
- ์ ์ฒด ํ๊ท ๊ณ์ฐ
SELECT NULL,
NULL,
Avg(score)
FROM scorelist
- ์ ์ฒด ํ๊ท ๊ณ์ฐ
- ๊ณผ๋ชฉ, ์ด๋ฆ๋ณ ํ๊ท ๊ณ์ฐ
UNION ALL
SELECT subject,
name,
Avg(score)
FROM scorelist
GROUP BY subject,name
- ๊ณผ๋ชฉ, ์ด๋ฆ๋ณ ํ๊ท ๊ณ์ฐ
- ๊ณผ๋ชฉ๋ณ ํ๊ท ๊ณ์ฐ
UNION ALL
SELECT subject,
NULL,
Avg(score)
FROM scorelist
GROUP BY subject
- ๊ณผ๋ชฉ๋ณ ํ๊ท ๊ณ์ฐ
- ์ด๋ฆ๋ณ ํ๊ท ๊ณ์ฐ
UNION ALL
SELECT NULL,
name,
Avg(score)
FROM scorelist
GROUP BY name;
- ์ด๋ฆ๋ณ ํ๊ท ๊ณ์ฐ
์ด๋ ๊ฒ ๊ธด ๊ตฌ๋ฌธ์
์๋์ ๊ฐ์ด ๋ณํ์ํจ๋ค.
SELECT subject, NAME, Avg(score) FROM scorelist GROUP BY grouping sets( ( subject, NAME ), -- 2. ๊ณผ๋ชฉ, ์ด๋ฆ๋ณ ํ๊ท ๊ณ์ฐ subject, -- 3. ๊ณผ๋ชฉ๋ณ ํ๊ท ๊ณ์ฐ NAME, -- 4. ์ด๋ฆ๋ณ ํ๊ท ๊ณ์ฐ ( ) ) -- 1. ์ ์ฒด ํ๊ท ๊ณ์ฐ
์ฅ์ ์ ์ํ ์๋๋ ๋ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ฒ ๋ณด์ด๋ ์
๐ Roll up
ROLL UP์ด ๋ญ๊ฐ?
- ์ง์ ๋ GROUPING ์ปฌ๋ผ์ ์๊ณ๋ฅผ ์์ฑํจ
- ์๊ทธ๋ฃน ๊ฐ์ ์๊ณ๋ฅผ ๊ณ์ฐ
์ธ์๋ก ๋ค์ด์จ ์ปฌ๋ผ์ ์ค๋ฅธ์ชฝ(โ)๋ถํฐ ํ๋์ฉ ๋นผ๋ฉด์ Group ์์ฑ
Rollup(์,๋ถ์) -- ๋ถ์ ๋นผ๊ณ ์๋ณ๋ก ๊ทธ๋ฃนํํ agg ํจ์๊ฐ๊ณผ -- ๋ง์ง๋ง์๋ ๋๋ค ๋นผ๊ณ ์ดํฉ์ผ๋ก ๊ทธ๋ฃนํํ ๊ฐ์ด ๋์จ๋ค.
๐ Cube
- ROLL UP๊ณผ์ ์ฐจ์ด
- ROLL UP์ ์ค๋ฅธ์ชฝ๋ถํฐ ์์๋๋ก ํ๋์ฉ ๋บ
- CUBE๋ ๋ฐฉํฅ ์๊ด์์ด ํ๋์ฉ ๋นผ๋ฉฐ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ Group ์์ฑ
| CUBE(C1, C2) | ROLLUP(C1,C2) |
| --- | --- |
| C1, C2 | C1, C2 |
| C1 | C1 |
| C2 | X |
| () | () |
GROUP BY CUBE((SUBJECT, NAME))
CUBE์ SUBJECT, NAME์ด ๊ดํธ์์ ํ๋์ ๊ทธ๋ฃน์ด๊ณ , ์ ์ธ ๋๋ฉด ์๋ฌด ๊ฒ๋ ์์ผ๋ฏ๋ก ์ ์ฒด ํ๊ท ์ถ๋ ฅ
๐ WINDOW FUNCTION ๊ฐ์ ๋ฐ ์ค๋ช
์๋์ฐ ํจ์ (WINDOW FUNCTION)
ํ๊ณผ ํ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ์ ์ํ๊ธฐ ์ํด ๋ง๋ ํจ์๊ฐ ์๋์ฐ ํจ์๋ค.
โ ๋ถ์ ํจ์๋ ์์ ํจ์๋ ๋์์ด
WINDOW FUNCTION ๋ฌธ๋ฒ
SELECT **WINDOW_FUNCTION** (**ARGUMENTS**) OVER
( [PARTITION BY **์ปฌ๋ผ**] [ORDER BY **์ปฌ๋ผ**] [WINDOWING ์ ] )
FROM ํ
์ด๋ธ๋ช
;
- OVER ๋ฌธ๊ตฌ๊ฐ ํค์๋๋ก ํ์ ํฌํจ
WINDOW_FUNCTION
: ์๋์ฐ ํจ์ARGUMENTS
(= ์ธ์) : ํจ์์ ๋ฐ๋ผ 0 ~ N๊ฐ ์ธ์๊ฐ ์ง์ ๋ ์ ์๋ค.PARTITION BY
์ : ์ ์ฒด ์งํฉ์ ๊ธฐ์ค์ ์ํด ์๊ทธ๋ฃน์ผ๋ก ๋๋ ์ ์๋ค.ORDER BY
์ : ์ด๋ค ํญ๋ชฉ์ ๋ํด ์์๋ฅผ ์ง์ ํ ์ง order by ์ ์ ๊ธฐ์ ํ๋ค.
๐ WINDOW FUNCTION ์ข ๋ฅ
WINDOW FUNCTION ๋ ํฌ๊ฒ 5๊ฐ์ง ๊ทธ๋ฃน์ผ๋ก ๋ถ๋ฅํ ์ ์๋ค. (๋ฒค๋๋ณ๋ก ์ง์ํ๋ ํจ์ ์ฐจ์ด๊ฐ ์์)
- ๐ ๊ทธ๋ฃน ๋ด ์์(
RANK
) ๊ด๋ จ ํจ์:RANK
,DENSE_RANK
,ROW_NUMBER
- ๐ ๊ทธ๋ฃน ๋ด ์ง๊ณ(
AGGREGATE
) ๊ด๋ จ ํจ์ :SUM
,MAX
,MIN
,AVG
,COUNT
- ๐ ๊ทธ๋ฃน ๋ด ํ ์์ ๊ด๋ จ ํจ์ :
FIRST_VALUE
,LAST_VALUE
,LAG
,LEAD
- ๐ ๊ทธ๋ฃน ๋ด ๋น์จ ๊ด๋ จ ํจ์ :
CUME_DIST
,PERCENT_RANK
,NTILE
,RATIO_TO_REPORT
- ์ ํ ๋ถ์์ ํฌํจํ ํต๊ณ ๋ถ์ ํจ์
๐ Rank ๊ด๋ จํจ์
ํน์ ํญ๋ชฉ๊ณผ ํํฐ์ ์ ๋ํด ์์๋ฅผ ๊ณ์ฐํ ์ ์๋ ํจ์
๐ RANK โ ์์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋์ผํ ์์๋ ๋์ผํ ๊ฐ์ด ๋ถ์ฌ๋ฉ๋๋ค.
๐ DENSE_RANK โ ๋์ผํ ์์๋ฅผ ํ๋์ ๊ฑด์๋ก ๊ณ์ฐํฉ๋๋ค
- DENSE = ๋ฐ์งํ
- RANK()๋ ๊ฐ์ ์์๊ฐ ์์ผ๋ฉด(2์) ๊ทธ ๋ค์ ์์(3์)๊ฐ ์์ด์ง๋๋ค.
- DENSE_RANK()๋ ๊ฐ์ ์์๊ฐ ์์ด๋ ๊ฑด์๋ก ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ 3์๊ฐ ์์ต๋๋ค.
- ๋นฝ๋นฝํ๊ฒ, ๋ฐ์ ํ๊ฒ ๋ค ์ฑ์ด๋ค๊ณ ์๊ฐ!
- DENSE = ๋ฐ์งํ
๐ ROW_NUMBER โ ๋์ผํ ์์์ ๋ํด ๊ณ ์ ์ ์์๋ฅผ ๋ถ์ฌํฉ๋๋ค.
ROW_NUMBER๋ ๋์ผํ ์์๊ฐ ์๋๋ผ๋ ๊ณ ์ ์ ์์๋ฅผ ๋ถ์ฌํฉ๋๋ค.
RANK, DENSE_RANK ๊ฐ ๋์ผํ ๊ฐ์ ๋ํด์๋ ๋์ผํ ์์๋ฅผ ๋ถ์ฌํ๋๋ฐ ๋ฐํด,
ROW_NUMBER ๋ ๋์ผํ ๊ฐ์ด๋ผ๋ ๊ณ ์ ํ ์์๋ฅผ ๋ถ์ฌ
๐ AGGREGATE ์ง๊ณ ๊ด๋ จํจ์
- ์ง๊ณ ํจ์(AGGREGATE Function)
SUM
,MAX
,MIN
,AVG
,COUNT
๋ฑ๋ฑ- Group by ๋ ์จ์ฃผ์๋ ๊ธฐ๋ณธ ์ง๊ณํจ์
๐ ๊ทธ๋ฃน ๋ด ํ ์์ ๊ด๋ จ ํจ์
ํ ์์ ๊ด๋ จ ํจ์๋ ์์ ํ์ ๊ฐ์ ํ์์ ์ถ๋ ฅํ๊ฑฐ๋ ํ์ ํ์ ๊ฐ์ ์์ ํ์ ์ถ๋ ฅํ๊ฒ ํ ์ ์์ต๋๋ค.
๋๋ ํน์ ์์น์ ํ์ ๊ฐ๊ณ ์ ์ถ๋ ฅ ํ ์ ์์ต๋๋ค.
FIRST_VALUE ํจ์
- ํํฐ์ ์์ ๊ฐ์ฅ ์ฒ์์ ๋์ค๋ ๊ฐ
- MIN ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ
LAST_VALUE ํจ์
- ํํฐ์ ์์ ๊ฐ์ฅ ๋ง์ง๋ง์ ๋์ค๋ ๊ฐ
- MIN ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ
LAG ํจ์
- ์ด์ ํ(๊ฐ)์ ๊ฐ์ ธ์ต๋๋ค.
- Lag(Sum(amount))
OVER (ORDER BY **Extract(month FROM Date(p.payment_date))**) as pre_amt,
LEAD ํจ์
- ์ง์ ๋ ํ(๊ฐ)์ ๊ฐ์ ธ์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 1์ ๋๋ค.
- LEAD(sal, 1, 0) 1์ ์ฃผ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ค์ ํ๊ฐ ๊ฐ์ ธ์ด
- 2๋ฅผ ์ฃผ๋ฉด Lead ์ด์ ์ฒซ๋ฒ์งธ ๊ฐ์ sal์ ์ธ๋ฒ์งธ ๊ฐ์ ๊ฐ์ ธ์ด
- ์ธ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ธ 0์ null๊ฐ์ ์ฒ๋ฆฌํ๋ ํ๋ผ๋ฏธํฐ
๐ ๊ทธ๋ฃน ๋ด ํ ๋น์จ ๊ด๋ จ ํจ์
๋น์จ ๊ด๋ จ ํจ์๋ ๋์ ๋ฐฑ๋ถ์จ, ์์๋ณ ๋ฐฑ๋ถ์จ, ํํฐ์ ์ N๋ฑ๋ถ์ผ๋ก ๋ถํ ํ ๊ฒฐ๊ณผ ๋ฑ์ ์กฐํ
CUME_DIST
- CUME_DIST -- ํํฐ์ ์ ์ฒด์์ ํ์ฌ ํ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฑด์์ ๋ํ ๋์ ๋ฐฑ๋ถ์จ์ ์กฐํํฉ๋๋ค.
- ๋์ ๋ถํฌ์ ์์น๋ 0~1 ์ฌ์ด์ ์์น
- ์ฆ ๊ทธ๋ฅ ๋์ ๋ฐฑ๋ถ์จ์ด ์ผ๋ง์ธ์ง ์กฐํํ๋๊ฒ
PERCENT_RANK
- ํํฐ์ ์์ ์ ์ผ ๋จผ์ ๋์จ ๊ฒ์ 0, ์ ์ผ ๋ฆ๊ฒ ๋์จ ๊ฒ์ 1๋ก ํ์ฌ ๊ฐ์ด ์๋ ํ์ ์์๋ณ ๋ฐฑ๋ถ์จ์ ์กฐํ
- ํํฐ์ ์ ๋๋์ด Partition by ๊ฐ์ฅ ๋จผ์ ๋์จ ๊ฒ์ 0 ๋ง์ง๋ง์ 1๋กํ์ฌ ๋ฑ์์ ํผ์ผํธ๋ฅผ ๊ตฌํฉ๋๋ค.
NTILE
- -- ํํฐ์ ๋ณ๋ก ์ ์ฒด ๊ฑด์๋ฅผ ARGUMENT ๊ฐ์ผ๋ก N๋ฑ๋ถํ ๊ฒฐ๊ณผ
- Ntile(4) over (partition by ~~) โ 4๋ฑ๋ถํ ๊ฒ
SELECT ENAME, SAL, NTILE(4) OVER (ORDER BY SAL DESC ) AS QUAR_TILE FROM EMP ;
RATIO_TO_REPORT
- -- ํํฐ์
๋ด ์ ์ฒด SUM(์ปฌ๋ผ)์ ๋ํ ํ ๋ณ ์ปฌ๋ผ ๊ฐ์ ๋ฐฑ๋ถ์จ์ ์์์ ๊น์ง ์กฐํํฉ๋๋ค.
โ (์ ์ ์จ ์กฐํ) - ํํฐ์ ์ ๋๋์ด ๊ฐ sal์ด ๊ฐ deptno์์ ์ด๋์ ๋ ์ ์ ์จ์ ๊ฐ๊ณ ์๋์ง ์กฐํ
- -- ํํฐ์
๋ด ์ ์ฒด SUM(์ปฌ๋ผ)์ ๋ํ ํ ๋ณ ์ปฌ๋ผ ๊ฐ์ ๋ฐฑ๋ถ์จ์ ์์์ ๊น์ง ์กฐํํฉ๋๋ค.
๐ ์ ํ ๋ถ์์ ํฌํจํ ํต๊ณ ๋ถ์ ํจ์
- ์ ํ๋ถ์์ ํฌํจํ ํต๊ณ๋ถ์ ํจ์
- CORR, COVAR_POP, COVAR_SAMP, STDDEV, STDDEV_POP, STDDEV_SAMP, VARIANCE, VAR_POP, VAR_SAMP, REGR_(LINEAR REGRESSION), REGR_SLOPE, REGR_INTERCEPT, REGR_COUNT, REGR_R2, REGR_AVGX, REGR_AVGY, REGR_SXX, REGR_SYY, REGR_SXY
CTE (Common Table Expressions)
- ๋จ์ผ ๋ฌธ์ ๋ฒ์ ๋ด์ ์กด์ฌ
- ์๋ธ์ฟผ๋ฆฌ๋ก ์ฐ์ด๋ ํ์ํ ์ด๋ธ(derived table)๊ณผ ๋น์ทํ ๊ฐ๋
- ๋ณต์กํ ์ฟผ๋ฆฌ๋ฌธ์์ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ์ํด ํ์ํ ์ด๋ธ ๋์ ์ฌ์ฉํ๊ธฐ์ ์ ์ฉ
- ์ฆ, ์๋ธ์ฟผ๋ฆฌ๋ณด๋ค ๊น๋ํ ์๋ ?
- ํด๋น ๋ฌธ ๋ด์์ ์ฌ๋ฌ ๋ฒ ์ฐธ์กฐํ ์ ์๋ ๋ช ๋ช ๋ ์์ ๊ฒฐ๊ณผ ์งํฉ = ํ ์ด๋ธ
- ๐ ์ฆ, ๊ณ์ํด์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์์ ํ ์ด๋ธ
CTE ๋ง๋ค๊ธฐ
- ์์
- `WITH`๋ก ์์ํ์ฌ *`CTE Body`*๊น์ง๊ฐ CTE์
๋๋ค.
- `AS()` ์์ ์ฟผ๋ฆฌ์ ๋ฐ๋ผ `engineers`๋ผ๋ ์ด๋ฆ์ ๊ฒฐ๊ณผ ์งํฉ์ด ์ผ์์ ์ผ๋ก ์์ฑ๋ฉ๋๋ค.
- CTE๋ก ๋ง๋ค์ด์ง ๊ฒฐ๊ณผ `engineers`๋ *CTE Usage* ๋ถ๋ถ์ `FROM` ์ ๋ฑ์์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- CTE์ ๊ฒฐ๊ณผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ง ์๊ณ , **์ฟผ๋ฆฌ๊ฐ ์ํ๋๋ ๋์์๋ง ์กด์ฌ**ํฉ๋๋ค.
- ๋จ์ผ ํ ์ด๋ธ
WITH ๊ฐ์ํ
์ด๋ธ๋ช
AS ( SELECT ์ฟผ๋ฆฌ
UNION ALL
SELECT ์ฟผ๋ฆฌ )
-- ์์
WITH cte_film
AS (SELECT film_id,
title,
( CASE
WHEN length < 30 THEN 'Short'
WHEN length < 90 THEN 'Medium'
ELSE 'Long'
END ) length
FROM film)
SELECT film_id,
title,
length
FROM cte_film
WHERE length = 'Long'
ORDER BY title;
- 2๊ฐ ์ด์์ ๊ฐ์ ํ ์ด๋ธ
- , ๋ก ์ถ๊ฐ
WITH
๊ฐ์1 AS ( ์๋ธ์ฟผ๋ฆฌ๋ฌธ ),
๊ฐ์2 AS ( ์๋ธ์ฟผ๋ฆฌ๋ฌธ )
-- ์ค์ ์ฌ์ฉ
SELECT ์ปฌ๋ผ, [์ปฌ๋ผ, ...] FROM ๊ฐ์1, ๊ฐ์2
์๋ธ์ฟผ๋ฆฌ ์ฐ๋ฉด ์๋๋ ? ๊ตณ์ด with ์จ์ผํ๋ ?
- ๊ตณ์ด ๊ฐ์ ํ ์ด๋ธ์ With๋ฌธ์ผ๋ก ๋ง๋ค ํ์๋ ์์
- ํ์ง๋ง With๋ฌธ์ ํ์ฉํ์์ ๋ ํด๋น SQL ํ๊ฒฝ์์ ์์๋ก ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์
- ์ฆ CREATE TABLE์ ํ๋๊ฒ ์๋๋ผ
- ์์๋ก ํ ์ด๋ธ์ ์ฌ์ฉํ ๋ ์ ์ฉํจ
VIEW vs CTE
- VIEW๋ ๋ง๋ค๊ธฐ ์ํด ๊ถํ์ด ํ์ํ๊ณ ์ฌ์ ์ ์ ์๋ฅผ ํด์ผํ๋ค.
- ๋ฐ๋ฉด, CTE๋ ๊ถํ์ด ํ์ ์๊ณ ํ๋์ ์ฟผ๋ฆฌ๋ฌธ์ด ๋๋ ๋๊น์ง๋ง ์ง์๋๋ ์ผํ์ฑ ํ ์ด๋ธ
์ฃผ์ํ ์
- MySQL 8๊ณผ PostgreSQL์์๋ CTE๋ฅผ Materializingํ๋ค
- CTE๋ฅผ ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ ๊ฒฝ์ฐ, Query performance๊ฐ ์คํ๋ ค ๋ ๋จ์ด์ง ์ ์๋ค
- Query Optimizer๊ฐ ์คํ๋ ฅ์ ๊ณ์ฐํ ๋ CTE์ ์ต์ ํ๋ฅผ ๊ณ ๋ คํ์ง ์๋๋ค
- ์๋ก, ์ค์ ํ index๊ฐ CTE์์๋ ์ ์ฉ๋์ง ์๊ฒ ๋๋ค
window func์ PARTITION BY ๋ณต์ต
๋ถ์ํจ์([์นผ๋ผ]) OVER(PARTITION BY ์นผ๋ผ1, ์นผ๋ผ2... [ORDER BY ์ ] [WINDOWING ์ ])
- OVER ์ ๋ด๋ถ์ PATITION BY ์ ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ ์ฒด๋ฅผ ์ง๊ณ
- PARTITION BY ์ ์ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์์ ํด๋น ์นผ๋ผ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ ๊ฒฐ๊ณผ๋ฅผ ํ์
- ์ฆ, ๊ตฌ๋ฌธ ๋ง๋ค GROUP BY ํด์ ์ปฌ๋ผ์ ๊ฐ์ ๋ด๋๋ค.
๐ JOIN ์ ์ข ๋ฅ
๋ฌต์์ ์กฐ์ธ
SELECT ์์ฑ๋ช
FROM ํ ์ด๋ธ1, ํ ์ด๋ธ2
WHERE ํ ์ด๋ธ1.์์ฑ1 = ํ ์ด๋ธ2.์์ฑ1
๋ช ์์ ์กฐ์ธ
SELECT ์์ฑ๋ช
FROM ํ ์ด๋ธ1 JOIN ํ ์ด๋ธ2
ON ํ ์ด๋ธ1.์์ฑ1 = ํ ์ด๋ธ2.์์ฑ1
๐ SUBQUERY ์ JOIN ์ ์ฐจ์ด
์๋ธ ์ฟผ๋ฆฌ๋ ๋ณต์กํ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ๋ฉด์, ์กฐ์ธ์ ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ํ์๋ก ํ์ง ์์ต๋๋ค.
์กฐ์ธ์ ์ฟผ๋ฆฌ๋ฌธ์ด ๋ณต์กํด์ง๋๋ผ๋ ์๋ธ ์ฟผ๋ฆฌ์ ๋นํด ์ฝ์ด๋ด๊ธฐ ์์ํฉ๋๋ค.
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์ผ๋ก ๋์ฒดํ ์ ์๋ ๊ฒฝ์ฐ
- ๋ด๋ถ ์ฟผ๋ฆฌ๊ฐ ๋จ์ผํ ๊ฐ์ ๋ฐํํ๋ค๋ฉด ์ด๋ ์กฐ์ธ์ผ๋ก๋ ์ถฉ๋ถํ ๊ตฌํํ ์ ์๋ค
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
- IN ์ฐ์ฐ์ ์์ ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์๋ค๋ฉด ํด๋น ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์ผ๋ก ๋ฐ๊ฟ ์ธ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ๋ ๋ด๋ถ ์ฟผ๋ฆฌ, ์ฆ, ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.
- NOT IN ์ฐ์ฐ์ ์์ ์๋ ์๋ธ ์ฟผ๋ฆฌํฌํจ
- EXISTS์ NOT EXISTS ์ฐ์ฐ์ ์์ ์๋ ์๋ธ ์ฟผ๋ฆฌ๋ ์กฐ์ธ์ผ๋ก ๋์ฒด
- ๋ด๋ถ ์ฟผ๋ฆฌ๊ฐ ๋จ์ผํ ๊ฐ์ ๋ฐํํ๋ค๋ฉด ์ด๋ ์กฐ์ธ์ผ๋ก๋ ์ถฉ๋ถํ ๊ตฌํํ ์ ์๋ค
ํ์ ์ฟผ๋ฆฌ๋ฅผ JOIN์ผ๋ก ๋์ฒดํ ์ ์๋ ๊ฒฝ์ฐ
GROUP BY๊ฐ ์๋ FROM์ ํ์ ์ฟผ๋ฆฌ
SELECT city, sum_price FROM (SELECT city, Sum(price) AS sum_price FROM sale GROUP BY city) AS s WHERE sum_price < 2100;
WHERE ์ ์์ ์ง๊ณ ๊ฐ์ ๋ฐํํ๋ ํ์ ์ฟผ๋ฆฌ
SELECT name FROM product WHERE cost<(SELECT AVG(price) from sale);
ALL ์ ์ ํ์ ์ฟผ๋ฆฌ
๐ ๊ฒฐ๋ก
์ฌ๋งํ๋ฉด
JOIN
์ฌ์ฉํ์
์ด๋ฏธ์ง ์ถ์ฒ : https://seohc.tistory.com/87
| ๊ตฌ๋ถ | ๋ถ์ํจ์ |
| --- | --- |
| ์ง๊ณ | COUNT, MAX, MIN, SUM, AVG |
| ์์ | ROW_NUMBER, RANK, DENSE_RANK |
| ์์ | FIRST_VALUE, LAST_VALUE, LAG, LEAD |
| ํต๊ณ | STDDEV, VARIANCE |
| ๋น์จ | RATIO_TO_REPORT, CUME_DIST, PERCENT_RANK, NTITLE |
๐ JOIN ์ ์ข ๋ฅ
๋ฌต์์ ์กฐ์ธ
SELECT ์์ฑ๋ช
FROM ํ ์ด๋ธ1, ํ ์ด๋ธ2
WHERE ํ ์ด๋ธ1.์์ฑ1 = ํ ์ด๋ธ2.์์ฑ1
๋ช ์์ ์กฐ์ธ
SELECT ์์ฑ๋ช
FROM ํ ์ด๋ธ1 JOIN ํ ์ด๋ธ2
ON ํ ์ด๋ธ1.์์ฑ1 = ํ ์ด๋ธ2.์์ฑ1
๐ SUBQUERY ์ JOIN ์ ์ฐจ์ด
์๋ธ ์ฟผ๋ฆฌ๋ ๋ณต์กํ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ๋ฉด์, ์กฐ์ธ์ ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ํ์๋ก ํ์ง ์์ต๋๋ค.
์กฐ์ธ์ ์ฟผ๋ฆฌ๋ฌธ์ด ๋ณต์กํด์ง๋๋ผ๋ ์๋ธ ์ฟผ๋ฆฌ์ ๋นํด ์ฝ์ด๋ด๊ธฐ ์์ํฉ๋๋ค.
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์ผ๋ก ๋์ฒดํ ์ ์๋ ๊ฒฝ์ฐ
- ๋ด๋ถ ์ฟผ๋ฆฌ๊ฐ ๋จ์ผํ ๊ฐ์ ๋ฐํํ๋ค๋ฉด ์ด๋ ์กฐ์ธ์ผ๋ก๋ ์ถฉ๋ถํ ๊ตฌํํ ์ ์๋ค
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
- IN ์ฐ์ฐ์ ์์ ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์๋ค๋ฉด ํด๋น ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์ผ๋ก ๋ฐ๊ฟ ์ธ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ๋ ๋ด๋ถ ์ฟผ๋ฆฌ, ์ฆ, ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.
- NOT IN ์ฐ์ฐ์ ์์ ์๋ ์๋ธ ์ฟผ๋ฆฌํฌํจ
- EXISTS์ NOT EXISTS ์ฐ์ฐ์ ์์ ์๋ ์๋ธ ์ฟผ๋ฆฌ๋ ์กฐ์ธ์ผ๋ก ๋์ฒด
- ๋ด๋ถ ์ฟผ๋ฆฌ๊ฐ ๋จ์ผํ ๊ฐ์ ๋ฐํํ๋ค๋ฉด ์ด๋ ์กฐ์ธ์ผ๋ก๋ ์ถฉ๋ถํ ๊ตฌํํ ์ ์๋ค
ํ์ ์ฟผ๋ฆฌ๋ฅผ JOIN์ผ๋ก ๋์ฒดํ ์ ์๋ ๊ฒฝ์ฐ
GROUP BY๊ฐ ์๋ FROM์ ํ์ ์ฟผ๋ฆฌ
SELECT city, sum_price FROM (SELECT city, Sum(price) AS sum_price FROM sale GROUP BY city) AS s WHERE sum_price < 2100;
WHERE ์ ์์ ์ง๊ณ ๊ฐ์ ๋ฐํํ๋ ํ์ ์ฟผ๋ฆฌ
SELECT name FROM product WHERE cost<(SELECT AVG(price) from sale);
ALL ์ ์ ํ์ ์ฟผ๋ฆฌ
๐ ๊ฒฐ๋ก
์ฌ๋งํ๋ฉด
JOIN
์ฌ์ฉํ์
์ด๋ฏธ์ง ์ถ์ฒ : https://seohc.tistory.com/87
๋๊ธ