๐Ÿ’ผ ์ž๊ฒฉ์ฆ/SQLD

[SQLD] SQL๊ธฐ๋ณธ&ํ™œ์šฉ : ์—ฐ์‚ฐ์ž, WHERE, GROUP BY, HAVING, ORDER BY, ๋ฌธ์žฅ์‹คํ–‰์ˆœ์„œ

์—ฐ_์šฐ๋ฆฌ 2021. 11. 6. 16:55
๋ฐ˜์‘ํ˜•

 

https://lotuus.tistory.com/42

 

[SQLD] 21.11.20 ์ œ43ํšŒ SQL๊ฐœ๋ฐœ์ž ํ›„๊ธฐ, ๊ณต๋ถ€๋ฐฉ๋ฒ•, ์ •๋ฆฌ๋ณธ, 43ํšŒ ์ถœ์ œ๋ฌธ์ œ

2021๋…„ 11์›” 20์ผ ํ† ์š”์ผ ์ œ43ํšŒ SQL๊ฐœ๋ฐœ์ž ์ž๊ฒฉ์ฆ ์‹œํ—˜ ํ›„๊ธฐ ์˜ค๋Š˜ ๋ณด๊ณ ์™”๋‹ค! ๋‚ด ๊ณต๋ถ€๋ฐฉ๋ฒ•๊ณผ ์ •๋ฆฌ๋ณธ, ์ด๋ฒˆ์— ์‹œํ—˜์— ์ถœ์ œ๋œ ๋ฌธ์ œ๋“ค์„ ๊ธฐ์–ต๋‚˜๋Š”๋Œ€๋กœ ์ ์–ด๋ณด๊ฒ ๋‹ค ๊ฐœ์ธ์ ์œผ๋กœ ๊ธฐ์ถœ์ด๋‚˜ ๋ณต์›๋œ ๋ฌธ์ œ๊ฐ€

lotuus.tistory.com

 

[๋ชฉ์ฐจ]

๐Ÿ’šWHERE์ ˆ, ์—ฐ์‚ฐ์ž, ROWNUM, DUALํ…Œ์ด๋ธ”

   WHERE์ ˆ

   ์—ฐ์‚ฐ์ž

   ๊ฐ€์งœ์นผ๋Ÿผ ROWNUM, TOP(N)

   DUALํ…Œ์ด๋ธ”(Oracle)

๐Ÿ’šGROUP BY, HAVING์ ˆ

   GROUP BY์™€ SELECT ์นผ๋Ÿผ

   GROUP BY์™€ ์ง‘๊ณ„ํ•จ์ˆ˜

๐Ÿ’šORDER BY ASC/DESC

   Oracle๊ณผ SQL Server์˜ NULL์ทจ๊ธ‰

๐Ÿ’šSELECT ๋ฌธ์žฅ ์‹คํ–‰ ์ˆœ์„œ

 

 

๐Ÿ’š WHERE์ ˆ, ์—ฐ์‚ฐ์ž, ROWNUM, DUAL ํ…Œ์ด๋ธ”

WHERE์ ˆ

์กฐํšŒํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ์— ํŠน์ • ์กฐ๊ฑด์„ ๋ถ€์—ฌํ•œ๋‹ค.

SELECT ~ FROM ~ WHERE ์กฐ๊ฑด์‹;

 

์—ฐ์‚ฐ์ž

 

๊ฐ€์งœ์นผ๋Ÿผ ROWNUM, TOP(N)

Oracle SQL Server
SELECT ~ FROM ~
WHERE ROWNUM <= N;
SELECT TOP(N) [WITH TIES] 
FROM ~;
SELECT SAL FROM
(SELECT SAL FROM EMP ORDER BY SAL)
WHERE ROWNUM<4;
SELECT TOP(2) WITH TIES SAL
FROM EMP ORDER BY SAL;
//500, 300, 300
Oracle์—์„œ๋Š” ORDER BY์ ˆ์ด ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋ฉด ์ •๋ ฌ ์ „์—
ROWNUM์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ๋˜์–ด ๋ฌด์ž‘์œ„ ๊ฒฐ๊ณผ๊ฐ€ ์ถ”์ถœ๋œ๋‹ค.
SQL Server์—์„œ๋Š” ORDER BY์™€ WITH TIES๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๊ณต๋™์ˆœ์œ„๋„ ๊ฐ™์ด ์ถœ๋ ฅํ•ด์ค€๋‹ค.

 

DUAL ํ…Œ์ด๋ธ”(Oracle)

์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”์ด ํ•„์š”์—†๋Š” SQL๋ฌธ์žฅ์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

SELECT ~ FROM ~ ํ˜•์‹์„ ๊ฐ–์ถ”๊ธฐ์œ„ํ•œ ์ผ์ข…์˜ DUMMY ํ…Œ์ด๋ธ”์ด๋‹ค.

SELECT LENGTH('SQL Expert') FROM DUAL;

//๊ฒฐ๊ณผ
//LENGTH('SQL Expert')
//-------------------
//                10

โ€ป SQL Server์˜ ๊ฒฝ์šฐ์—” SELECT๋กœ๋„ SQL๋ฌธ์žฅ์ด ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•˜๊ธฐ๋•Œ๋ฌธ์— DUALํ…Œ์ด๋ธ”์ด ์—†๋‹ค.

select len('SQL Expert');

//๊ฒฐ๊ณผ
//(์—ด ์ด๋ฆ„ ์—†์Œ)
//------------
//          10

 

๋ฐ˜์‘ํ˜•

 

๐Ÿ’š GROUP BY, HAVING์ ˆ

GROUP BY ์ ˆ์€ ํ–‰๋“ค์„ ์†Œ๊ทธ๋ฃนํ™” ํ•œ๋‹ค.

SELECT ~ FROM ~ WHERE ~ GROUP BY ์นผ๋Ÿผ HAVING ์กฐ๊ฑด

 

HAVING์ ˆ์€ GROUP BY๋กœ ๋ฌถ์ธ ๊ทธ๋ฃน๋“ค์˜ ์กฐ๊ฑด์„ ์ ์šฉํ•œ๋‹ค.

(WHERE์ ˆ์—๋Š” ๊ฐœ์ฒด ์ˆ˜์ค€์˜ ์กฐ๊ฑด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.)

 

NULL์ด ์žˆ์„ ๊ฒฝ์šฐ์—” ์—ฐ์‚ฐ์—์„œ ์ œ์™ธ๋œ๋‹ค. => ๊ตณ์ด NVLํ•จ์ˆ˜๋กœ NULL์„ 0์œผ๋กœ ๋งŒ๋“ค์–ด์ค„ ํ•„์š” X

GROUP BY์ ˆ์—๋Š” ALIAS ๋ณ„๋ช…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. 

 

SELECT AGE ๋‚˜์ด FROM PLAYER GROUP BY ๋‚˜์ด; --์˜ค๋ฅ˜

 

GROUP BY์™€ SELECT ์นผ๋Ÿผ

GROUP BY์ ˆ์—์„œ ๊ทธ๋ฃนํ•‘ ๊ธฐ์ค€์„ ์ •์˜ํ•˜๊ฒŒ ๋˜๋ฉด 

๊ธฐ์ค€์— ์‚ฌ์šฉ๋œ ์นผ๋Ÿผ๊ณผ ์ง‘๊ณ„ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์„ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค.

์ด๋•Œ, ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ๋Š” ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

GROUP BY ์ดํ›„ ์ˆ˜ํ–‰๋˜๋Š” SELECT, ORDER BY์—์„œ ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

= ๊ฒฐ๊ณผ์ ์œผ๋กœ SELECT์—์„œ๋Š” group by์— ์‚ฌ์šฉ๋œ ์นผ๋Ÿผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

SELECT JOB, SAL FROM EMP GROUP BY JOB;
-- ์‹คํŒจ
-- JOB๊ณผ SAL๋‘˜๋‹ค ์ถœ๋ ฅํ•˜๊ณ ์‹ถ๋‹ค๋ฉด SAL๋„ ๊ทธ๋ฃนํ™”ํ•ด์•ผํ•œ๋‹ค.

SELECT JOB, SAL FROM EMP GROUP BY JOB, SAL;
-- ์„ฑ๊ณต
-- ์ถœ๋ ฅํ•˜๋Š” JOB, SAL์ด GROUP BY์ ˆ์—์„œ ๋ชจ๋‘ ๊ทธ๋ฃนํ™”๋˜์–ด์žˆ๋‹ค.

 

GROUP BY์™€ ์ง‘๊ณ„ํ•จ์ˆ˜

์ง‘๊ณ„ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌํ–‰๋“ค์˜ ๊ทธ๋ฃน์ด ๋ชจ์—ฌ์„œ ๊ทธ๋ฃน๋‹น ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

(COUNT(์‹), SUM(์‹), AVG(์‹), MAX(์‹), MIN(์‹) ... ๋“ฑ)

ํ–‰์˜ ๊ทธ๋ฃน์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” GROUP BY์™€ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

์ง‘๊ณ„ํ•จ์ˆ˜๋Š” GROUP BY ์ดํ›„์— ์‹คํ–‰๋˜๋Š” HAVING, SELECT, ORDER BY์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. (WHERE์ ˆ์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€!!)

GROUP BY์ ˆ์— ์ •์˜ํ•˜์ง€ ์•Š์€ ์นผ๋Ÿผ๋„ ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HAVING, SELECT, ORDER BY์ ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

SELECT JOB FROM EMP GROUP BY JOB ORDER BY MAX(EMPNO), SUM(SAL);
-- ์„ฑ๊ณต
-- ์ด๋ฏธ JOB์œผ๋กœ ๊ทธ๋ฃนํ™”๋˜์—ˆ๊ธฐ๋•Œ๋ฌธ์— GROUP BY๋ณด๋‹ค ์ˆ˜ํ–‰์ด ๋Šฆ์€
-- HAVING, SELECT, ORDER BY์—์„œ ์ง‘๊ณ„ํ•จ์ˆ˜๋กœ ๋‹ค๋ฅธ ์นผ๋Ÿผ์„ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

SELECT JOB, MAX(EMPNO) FROM EMP GROUP BY JOB ORDER BY MAX(EMPNO), SUM(SAL);
-- ์„ฑ๊ณต
-- JOB๋„ ๊ทธ๋ฃนํ™”๋˜์—ˆ๊ณ , EMPNO๋„ ์ง‘๊ณ„ํ•จ์ˆ˜๋กœ ๊ทธ๋ฃนํ™”๋˜์–ด์žˆ๋‹ค.

SELECT JOB, EMPNO FROM EMP GROUP BY JOB ORDER BY MAX(EMPNO), SUM(SAL);
-- ์‹คํŒจ
-- EMPNO๊ฐ€ ๊ทธ๋ฃนํ™”๋˜์ง€ ์•Š์€ ์นผ๋Ÿผ์ด๊ธฐ๋•Œ๋ฌธ์— ์‹คํŒจํ•œ๋‹ค.

 

์ง‘๊ณ„ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ, ์ „์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์ด ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” GROUP BY์ ˆ ์—†์ด ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

SELECT COUNT(*) "์ „์ฒด ํ–‰์ˆ˜", COUNT(HEIGHT) "ํ‚ค ๊ฑด์ˆ˜"

 

 

๐Ÿ’š ORDER BY ASC/DESC

๋ฐ์ดํ„ฐ๋“ค์„ ํŠน์ •์นผ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ฒŒํ•ด์ค€๋‹ค.

SELECT ~ FROM ~ WHERE ~ GROUP BY ~ HAVING ~ ORDER BY ์นผ๋Ÿผ๋ช… ASC/DESC;

์˜ค๋ฆ„์ฐจ์ˆœ ASC(๊ธฐ๋ณธ๊ฐ’), ๋‚ด๋ฆผ์ฐจ์ˆœ DESC

 

ORDER BY์ ˆ์— ๋ณ„๋ช… ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

SELECT AGE ๋‚˜์ด FROM PLAYER ORDER BY ๋‚˜์ด; --๊ฐ€๋Šฅ

 

์กฐํšŒํ•˜๋Š” ์นผ๋Ÿผ์˜ ์ˆœ์„œ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

SELECT AGE ๋‚˜์ด, NAME ์ด๋ฆ„ FROM PLAYER ORDER BY 2; --์ด๋ฆ„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์ •๋ ฌ

 

์กฐํšŒํ•˜์ง€ ์•Š๋Š” ์นผ๋Ÿผ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

SELECT AGE, NAME FROM PLAYER ORDER BY ID;

 

๐Ÿ“Œ๋ฌธ์ œ

PLAYER ํ…Œ์ด๋ธ”์—์„œ ์„ ์ˆ˜๋ช…๊ณผ ํŒ€๋ช…์€ ์˜ค๋ฆ„์ฐจ์ˆœ, ์—ฐ๋ด‰์€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์กฐํšŒํ•˜๋Š” SQL ๋กœ ๋ฐ”๋ฅธ๊ฒƒ์€?

1) SELECT ์„ ์ˆ˜๋ช…, ํŒ€๋ช…, ์—ฐ๋ด‰ FROM ORDER BY ์„ ์ˆ˜๋ช… DESC, ํŒ€๋ช… DESC, ์—ฐ๋ด‰ ASC
2) SELECT ์„ ์ˆ˜๋ช…, ํŒ€๋ช…, ์—ฐ๋ด‰ FROM ORDER BY ์„ ์ˆ˜๋ช… ASC, ํŒ€๋ช… ASC , ์—ฐ๋ด‰
3) SELECT ์„ ์ˆ˜๋ช…, ํŒ€๋ช…, ์—ฐ๋ด‰ FROM ORDER BY ์„ ์ˆ˜๋ช… ASC, ํŒ€๋ช…, 3 DESC     //๋ณ„๋ช…, ์ˆœ์„œ๋ฒˆํ˜ธ ํ˜ผํ•ฉํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
4) SELECT ์„ ์ˆ˜๋ช…, ํŒ€๋ช…, ์—ฐ๋ด‰ FROM ORDER BY ์„ ์ˆ˜๋ช…, ํŒ€๋ช…, DESC ์—ฐ๋ด‰

 

 

Oracle๊ณผ SQL Server์˜ NULL ์ทจ๊ธ‰

Oracle SQL Server
NULL์„ ๊ฐ€์žฅ ํฐ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. NULL์„ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.

 

 

๐Ÿ’š SELECT ๋ฌธ์žฅ ์‹คํ–‰์ˆœ์„œ

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•
  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
  • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ