SELECT ์ฟผ๋ฆฌ ์คํ ์์
SQL ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ ๋ ์ฌ์ฉ๋๋ WHERE, GROUP BY, ORDER BY ์ ๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ์ ์คํํ๋๋ฐ ์์๊ฐ ์กด์ฌํฉ๋๋ค. ์ด ์์์ ์ํด์ ์ฟผ๋ฆฌ๊ฐ ์ฒ๋ฆฌ๋๊ณ ์ด๋ป๊ฒ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๋๋์ ๋ฐ๋ผ ํผํฌ๋จผ์ค์ ์ฐจ์ด๊ฐ ๋ฐ์ํฉ๋๋ค.
ORACLE HR ๊ณ์ ์ EMPLOYEES ํ ์ด๋ธ๋ก ์ด๋ค ์ฒ๋ฆฌ ๊ณผ์ ์ ์ํด์ SELECT ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋์ง ์์ ๋ณด๊ฒ ์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
|
SELECT
JOB_ID
,AVG(SALARY) SAL_AVG
FROM
EMPLOYEES
WHERE
SALARY > 13000
GROUP BY
JOB_ID
HAVING
COUNT(*) > 1
ORDER BY SAL_AVG DESC;
|
์์ ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ์ ๋์ ์ต์ข ๊ฒฐ๊ณผ์ ๋๋ค. ํ๋ฉด์ ์ถ๋ ฅ๋๋ ์์ ๋งค์ฐ ์ ์ง๋ง, ์ค์ ๋ด๋ถ์ ์ผ๋ก ์ด ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ๊น์ง SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY ์ด 6๋จ๊ณ์ ๊ฑธ์ณ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฟ๋ ค์คฌ์ต๋๋ค.
์คํ ์์
SELECT ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ์๋ FROM - WHERE GROUP BY - HAVING - SELECT - ORDER BY ์์๋๋ก ์คํ์ด ๋ฉ๋๋ค.
FROM ์
1
|
FROM EMPLOYEES
|
SELECT ๋ถํฐ ์์ํ ๊ฒ๊ฐ์ง๋ง, ์ฟผ๋ฆฌ์ ๊ฐ์ ์ฒซ๋ฒ์งธ ์คํ ์์๋ FROM์ ์ ๋๋ค. FROM ์ ์์๋ ์ ์ฒด ํ ์ด๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ณ ์ต๋๋ค. INDEX๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ค๋ ๊ฐ์ ์์ WHERE์ ์ด๋ SELECT์ ์์ ์ผ๋ถ ํ์ด๋ ์ด์ ์ ๊ฑฐํ์ฌ ์ถ๋ ฅํ๋ค๊ณ ํด๋ ๊ฐ์ฅ ์ฒ์์ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์กฑ ์ต๋๋ค.
WHERE ์
1
|
WHERE SALARY > 13000
|
WHERE ์ ์์๋ FROM์ ์์ ์ฝ์ด์จ ํ ์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง๋ ๊ฒฐ๊ณผ๋ง ๊ฐ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ถ๋ฆฝ๋๋ค.
GROUP BY
1
|
GROUP BY JOB_ID
|
GROUP BY ์ ์์๋ WHERE ์กฐ๊ฑด์ผ๋ก ๊ฐ์ถ๋ฆฐ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ์นผ๋ผ์ผ๋ก GROUPING ์์ ์ ํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค. GROUP BY ์ ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํด๋น ์นผ๋ผ์ผ๋ก ๊ทธ๋ฃนํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
HAVING ์
1
|
HAVING COUNT(*) > 1
|
HAVING ์ ์ GROUP BY๋ ์ด ํ ์ฌ์ฉ๋๋ ์กฐ๊ฑด ์ ์ ๋๋ค. ๋๊ฐ์ด ์กฐ๊ฑด์ ๊ฑธ ์ ์๋ WHERE์ ๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์จ์ผํฉ๋๋ค. WHERE ์ ์ ์๋ ๋ด์ฉ์ HAVING์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง... HAVING์ ์์ ์ผ๋ฐ ์กฐ๊ฑด๋ค์ ๋ค๋ฃจ๊ฒ ์ฟผ๋ฆฌ ์คํ ์์์ ์ํด ํผํฌ๋จผ์ค๊ฐ ๋ง์ด ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค.
์์ ์์ ์์ "SALARY > 13000" ์กฐ๊ฑด์ WHERE์ ์์ ์ฒ๋ฆฌํ์ ๋์ HAVING์ ์์ ์ฒ๋ฆฌํ์ ๋๋ฅผ ๋น๊ตํด๋ณด๊ฒ ์ต๋๋ค.
HAVING ์ ์ฒ๋ฆฌ
FROM์ ์์ ํ ์ด๋ธ์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ WHERE์ ์ด ์๋ ๋ฐ๋ก GROUP BY ์ ๋ก ๋์ด๊ฐ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ์ฐ์ ์ ์ฒด ํ ์ด๋ธ์ ๋ํ GROUPING ์์ ์ ํฉ๋๋ค. ๊ทธ ์ดํ ๊ฐ๊ฐ ๊ทธ๋ฃน์ "SALARY > 13000" ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฑธ๋ฌ์ค๋๋ค.
WHERE ์ ์ฒ๋ฆฌ
FROM์ ์์ ํ ์ด๋ธ์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ WHERE์ ์์ "SALARY > 13000" ์กฐ๊ฑด์ ์ฒ๋ฆฌํ์ฌ ๋ฐ์ดํฐ์ ์์ ์ค์ ๋๋ค. ๊ทธ๋ค์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ง ๋จ์ ์ํ์์ GROUPING ์์ ์ ์งํํฉ๋๋ค.
์์ ๋๊ฐ์ง ์ฒ๋ฆฌ๋ฐฉ๋ฒ์ ๋ดค์๋ WHERE ์ ์์ ์ผ๋ฐ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ํจ์จ์ ์ด๋ผ๋ ๊ฒ์ ํ์ธ ํ ์ ์์ต๋๋ค. ์ ์ ์์ ๋ฐ์ดํฐ์์๋ ํฐ ์ฐจ์ด๋ฅผ ๋ชป ๋๋ ์ ์์ง๋ง, ๋ฐ์ดํฐ ์์ด ๋์ด๋ ์๋ก ํผํฌ๋จผ์ค์ ๋ํ ์ฐจ์ด๊ฐ ์ปค์ง๊ฒ์ ๋๋ค.
SELECT ์
1
|
SELECT JOB_ID, AVG(SALARY) SAL_AVG
|
์ฌ๋ฌ ์กฐ๊ฑด๋ค์ ์ฒ๋ฆฌํ ํ ๋จ์ ๋ฐ์ดํฐ์์ ์ด๋ค ์ด์ ์ถ๋ ฅํด์ค์ง ์ ํํ๋ ์ ์ด SELECT์ ๋๋ค.
ORDER BY ์
1
|
ORDER BY SAL_AVG DESC
|
๋ง์ง๋ง์ผ๋ก ์ด๋ค ์ด๊น์ง ์ถ๋ ฅํ ์ง ์ ํ๋ค๋ฉด ํ์ ์์๋ฅผ ์ด๋ป๊ฒ ๋ณด์ฌ์ค์ง ์ ๋ ฌํด์ฃผ๋ ์ ์ด ORDER BY ์ ๋๋ค.
์คํ์์๊ฐ ์ค์ํ ์ด์
์คํ์์์ ๋ํ ์์ง๋ ํ์์ ๋๋ค. ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ์ฐ๋ฆฌ๋ ์ต์ข ์ ์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒฐ๊ณผ๋ง ์ก์์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋์ ๊ฐ ๋จ๊ณ์์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฌ์ฉํ ์ ์๋์ง, ์คํ์์๋ฅผ ๋ชจ๋ฅด๋ฉด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋๋ฐ ๋ง์ด ๋ถํธํ ๊ฒ ์ ๋๋ค. ์คํ ์์์ ์์ด์ ๋ช๊ฐ์ง ์ฃผ์ํด์ผํ๋ ์์๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
1. ALIAS ์ฌ์ฉ
1๋ฒ์ฟผ๋ฆฌ : ORDER BY ์ ALIAS ์ฌ์ฉ
1
2
3
4
5
6
7
8
|
SELECT
EMPLOYEE_ID
,FIRST_NAME || ' ' || LAST_NAME AS NAME
,SALARY
,JOB_ID AS JOB
FROM EMPLOYEES
WHERE SALARY > 5000
ORDER BY NAME;
|
1๋ฒ ์ฟผ๋ฆฌ์์๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ORDER BY ์ ์ ๋งจ ๋ง์ง๋ง์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์นผ๋ผ์ ALIAS๋ฅผ ์ฌ์ฉํด๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
2๋ฒ์ฟผ๋ฆฌ : WHERE ์ ALIAS ์ฌ์ฉ
1
2
3
4
5
6
7
8
|
SELECT
EMPLOYEE_ID
,FIRST_NAME || ' ' || LAST_NAME AS NAME
,SALARY
,JOB_ID AS JOB
FROM EMPLOYEES
WHERE SAL > 5000
ORDER BY NAME;
|
๊ทธ๋ผ WHERE ์ ์์ ALIAS๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋จ๊น์? "Invalid Identifier"์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ๋๋ค. ์ด์ ๋ SELECT ์ ์ WHERE ์ ์ดํ์ ์คํ๋๊ธฐ ๋๋ฌธ์ WHERE ์ ์ด ์คํ ๋ ๋๋ SAL ์นผ๋ผ์ ์์ง ์กด์ฌํ์ง ์๋ ์นผ๋ผ์ ๋๋ค.
SAL ์ด๋ผ๋ ์นผ๋ผ์ WHERE ์ ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์๋ธ์ฟผ๋ฆฌ๋ก ์ฌ์ฉํ์ฌ ๋ฐ์ SELECT ๋ฌธ์ฅ์ WHERE ์ ์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
2. ROWNUM ์ฌ์ฉ
1
2
3
4
5
6
7
8
9
|
SELECT
ROWNUM
,EMPLOYEE_ID
,FIRST_NAME || ' ' || LAST_NAME AS NAME
,SALARY
,JOB_ID AS JOB
FROM EMPLOYEES
WHERE SALARY > 5000
ORDER BY NAME;
|
ROWNUM์ SELECT์ ํฌํจ์์ผ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด๋ดค์ต๋๋ค. 1 ๋ถํฐ ์ถ๋ ฅ ๋ ๊ฒ๋ง ๊ฐ์๋ ROWNUM์ด ๋ค์ฃฝ๋ฐ์ฃฝ ์์ฌ ์์ต๋๋ค. ํ์ฌ ๊ฒฐ๊ณผ๋ NAME ์นผ๋ผ์ผ๋ก ์ ๋ ฌ๋ ๊ฒฐ๊ณผ ์ ๋๋ค. 'A' ๋ถํฐ ์์๋๋ก NAME์นผ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ์ฌ ์ถ๋ ฅ๋ ์ฌ๋ฐ๋ฅธ ์ถ๋ ฅ๊ฒฐ๊ณผ ์ ๋๋ค. ํ์ง๋ง ROWNUM์ ์ด์ํ๊ฒ ์์ฌ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ ์์์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ์ ๋๋ค.
ORDER BY ์ ์ SELECT ์ ์ด ์คํ๋ ์ดํ ์ฒ๋ฆฌ๋๋ ์ ์ ๋๋ค . ๊ทธ๋์ ROWNUM์ NAME ์นผ๋ผ์ผ๋ก ์ ๋ ฌ๋๊ธฐ ์ด์ ์ ๊ฐ์ ํ์ ๋ฒํธ๋งค๊ธด ์์์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ณผ ์ ์๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ROWNUM์ ๋งค๊ธด ํ, NAME ์นผ๋ผ์ผ๋ก ์ ๋ ฌ๋ ๊ฒฐ๊ณผ ๋ฟ์ ๋๋ค.
ROWNUM์ ๋ํ ๋ฌธ์ ๋ TOP-N Query๋ Row Limiting Clause๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค.
TOP-N Query, Row Limiting Clause ์ฐธ์กฐ ๋งํฌ
๋๊ธ