๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ORACLE/SQL

[Oracle] SQL SELECT ์ฟผ๋ฆฌ ์‹คํ–‰ ์ˆœ์„œ ์ฒ˜๋ฆฌ ๊ณผ์ • :: ๋งˆ์ด์ž๋ชฝ

by ๐ŸŒปโ™š 2020. 3. 17.

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 ์ ˆ

๋ฐ์ดํ„ฐ์–‘์ด ๋งŽ์ด ์ผ๋ถ€ row๋งŒ ์ด๋ฏธ์ง€๋กœ ์บก์ณ

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 ์ฐธ์กฐ ๋งํฌ

 

[Oracle] ์˜ค๋ผํด ํŽ˜์ด์ง• ์ฟผ๋ฆฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ Row Limiting Clause ์‚ฌ์šฉ :: ๋งˆ์ด์ž๋ชฝ

์˜ค๋ผํด ํŽ˜์ด์ง• ์˜ค๋ผํด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŽ˜์ด์ง• ์ฟผ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ• ๊นŒ์š”? ํฌํ„ธ ์‚ฌ์ดํŠธ์—์„œ ๊ฒ€์ƒ‰์„ ํ–ˆ์„ ๋•Œ, ๊ฒŒ์‹œํŒ ํ˜•ํƒœ์˜ ์›น์‚ฌ์ดํŠธ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ๋•Œ, ํ•œ๋ฒˆ์— ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด

myjamong.tistory.com

 

๋Œ“๊ธ€