header-img
Info :
๋ฐ€๋„
denseยน
์žฅ๋ž˜ํฌ๋ง : ๋‹จ์œ„ ๋ถ€ํ”ผ ๋‹น ์งˆ๋Ÿ‰์ด ๋ณด๋‹ค ๋นฝ๋นฝํ•œ ์‚ฌ๋žŒ ๋˜๊ธฐ

 

 

 

์„œ๋ธŒ ์ฟผ๋ฆฌSubquery๋ž€ ๋ฉ”์ธ ์ฟผ๋ฆฌMain query๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๊ฐ€์ ์ธ SELECT๋ฌธ์„ ๋งํ•œ๋‹ค. ์–ด๋–ค ๋ฉ”์ธ ์ฟผ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๋‚ด๋ถ€ ์ฟผ๋ฆฌInner query๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋•Œ, ๋ฉ”์ธ ์ฟผ๋ฆฌ๋Š” ์™ธ๋ถ€ ์ฟผ๋ฆฌOuter query๋กœ ์ง€์นญ๋  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ํ˜•ํƒœ / ์‹คํ–‰ ์กฐ๊ฑด

 

SELECT ์—ด
FROM ํ…Œ์ด๋ธ”
WHERE ์กฐ๊ฑด์‹ ( SELECT ์—ด
                             FROM ํ…Œ์ด๋ธ”
                             WHERE ์กฐ๊ฑด์‹ )

 

(1) ๋ฐ˜๋“œ์‹œ ๊ด„ํ˜ธ์— ๊ฐ์‹ธ์ง„ ํ˜•ํƒœ๋กœ ์“ฐ์ธ๋‹ค.

(2) SELECT๋ฌธ์˜ ํ˜•ํƒœ๋กœ๋งŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

(3) ์ฟผ๋ฆฌ์˜ ๋์—์„œ ;์„ธ๋ฏธ ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

(4) ORDER BY์ ˆ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†๋‹ค.

 

 

 

 

 

์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ํŠน์ง•

 

 

(1) ๋น„๊ต ํ˜น์€ ์กฐํšŒ์˜ ๋Œ€์ƒ์ด ๋  ๋•Œ ์กฐํšŒ ๋Œ€์ƒ์˜ ์˜ค๋ฅธ์ชฝ์— ๋†“์ธ๋‹ค.

(2) ๋ฉ”์ธ ์ฟผ๋ฆฌ์™€์˜ ๋น„๊ต๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ์ฟผ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ SELECT ์ ˆ์€ ๋ฉ”์ธ ์ฟผ๋ฆฌ์˜ ๋น„๊ต ๋Œ€์ƒ๊ณผ ๊ฐ™์€ ์ž๋ฃŒํ˜•๊ณผ ๊ฐ™์€ ๊ฐœ์ˆ˜๋กœ ์ง€์ •๋ผ์•ผ ํ•œ๋‹ค.

(3) ๊ฒฐ๊ณผ๊ฐ’ ์—ญ์‹œ ๋ฉ”์ธ ์ฟผ๋ฆฌ์˜ ์—ฐ์‚ฐ์ž ์ข…๋ฅ˜์™€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

(4) ๋ฉ”์ธ ์ฟผ๋ฆฌ์™€์˜ ๊ด€๊ณ„๋Š” ๋‹จ๋ฐฉํ–ฅ์ด๋‹ค. ์ด๋Š” Java ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ƒ์†๊ณผ๋„ ์œ ์‚ฌํ•œ ํ˜•ํƒœ์ธ๋ฐ, ์ƒ์†๋‹นํ•œ ์ž์‹ ๊ฐ์ฒด๋Š” ๋ถ€๋ชจ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ€๋ชจ๋Š” ์ž์‹ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

 

(5) ๊ตฌ์กฐํ™”๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ์˜ ๊ฐ ๋ถ€๋ถ„์„ ๊ฐ€๋…์„ฑ ์žˆ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.

(6) ์œ„์˜ ํŠน์ง• ๋•Œ๋ฌธ์—, ๋ณต์žกํ•œ JOIN๊ณผ UNION์„ ๋ช…๋ฃŒํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ฒด์žฌ๋กœ ๊ธฐ๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์‚ฌ์šฉ์ฒ˜

 

(1) SELECT ์ ˆ์—์„œ ์‚ฌ์šฉ / ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌScalar Subquery

(2) FROM ์ ˆ์—์„œ ์‚ฌ์šฉ / ์ธ๋ผ์ธ ๋ทฐInline View

(3) WHERE ์ ˆ์—์„œ ์‚ฌ์šฉ / ์ค‘์ฒฉ ์„œ๋ธŒ ์ฟผ๋ฆฌNested Subquery

(4) HAVING ์ ˆ์—์„œ ์‚ฌ์šฉ

(5) ORDER BY ์ ˆ์—์„œ ์‚ฌ์šฉ

(6) INSERT๋ฌธ์˜ VALUES ๊ฐ’ ๋Œ€์ฒด์žฌ๋กœ์จ ์‚ฌ์šฉ

(7) UPDATE๋ฌธ์˜ SET ๊ฐ’ ๋Œ€์ฒด์žฌ๋กœ์จ ์‚ฌ์šฉ

 

 

 

 

 

์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์‚ฌ์šฉ

 

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์‚ฌ์šฉ์ฒ˜ ์ค‘ SELECT, FROM, WHERE์ ˆ์—์„œ ์“ฐ์ด๋Š” ๊ฒฝ์šฐ, ์ฆ‰ ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌ, ์ธ๋ผ์ธ ๋ทฐ, ์ค‘์ฒฉ ์„œ๋ธŒ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

 

 

 

SELECT์ ˆ, ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌScalar Subquery

 

ใ…ก์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ(Scalar Subquery)
  ์ •๋Œ€๋ฆฌ ๊ธ‰์—ฌ์™€ ํ…Œ์ด๋ธ” ์ „์ฒด ํ‰๊ท  ๊ธ‰์—ฌ๋ฅผ ๊ตฌํ•˜์‹œ์˜ค.

SELECT name
	, salary
   	, (SELECT ROUND(AVG(salary), -1) FROM employee) AS ํ‰๊ท ๊ธ‰์—ฌ
FROM employee
WHERE name = '์ •๋Œ€๋ฆฌ';

 

์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” SELECT์ ˆ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ๋‹ค. ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ์–ด๋– ํ•œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์ฃผ๋กœ ์“ฐ์ด๋ฉฐ, '์Šค์นผ๋ผ'๋ผ๋Š” ์ด๋ฆ„์—์„œ ๋ณด์—ฌ์ง€๋“ฏ ๋‹จ์ผ ๊ฐ’๋งŒ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์—†๋‹ค๋ฉด NULL์„ ๋ฆฌํ„ดํ•œ๋‹ค(ํ•ด๋‹น ๋ถ€๋ถ„์€ ๊ทธ๋ฃน ํ•จ์ˆ˜์˜ ํŠน์ง•์ด๊ธฐ๋„ ํ•˜๋‹ค.).

 

 

 

FROM์ ˆ, ์ธ๋ผ์ธ ๋ทฐInline View

 

ใ…ก์ธ๋ผ์ธ ๋ทฐ(Inline View)
  ์ง๊ธ‰์ด ์‚ฌ์›์ธ ์‚ฌ๋žŒ๋“ค์˜ ์ด๋ฆ„๊ณผ ๊ธ‰์—ฌ๋ฅผ ๊ตฌํ•˜์‹œ์˜ค.

SELECT ex1.name
	, ex1.salary
FROM (SELECT * FROM employee li
WHERE li.office_worker= '์‚ฌ์›') ex1;

 

์ธ๋ผ์ธ ๋ทฐ๋Š” FROM ์ ˆ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ๋‹ค. ํŠน์ • ํ…Œ์ด๋ธ”์—์„œ ์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœํ•ด ์—ฐ๊ฒฐํ•˜๊ณ ์ž ํ•  ๋•Œ ์“ด๋‹ค. ํƒ€ ์„œ๋ธŒ ์ฟผ๋ฆฌ์™€ ๋‹ฌ๋ฆฌ ๊ผญ ๋ณ„์นญalias์„ ์ง€์ •ํ•ด ์ค˜์•ผ์ง€๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฐธ๊ณ ๋กœ, WITH ๋ฌธ์„ ์‚ฌ์šฉํ•ด๋„ ๊ฒฐ๊ณผ๋ฌผ์€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†์— ๋งž๋Š” ๊ฒƒ์„ ์ทจ์‚ฌ์„ ํƒํ•ด ์“ฐ๋ฉด ๋œ๋‹ค.

 

WITH
[๋ณ„์นญ1] AS (SELECT๋ฌธ 1),
[๋ณ„์นญ2] AS (SELECT๋ฌธ 2),
...,
[๋ณ„์นญN] AS (SELECT๋ฌธ N)
SELECT 
FROM ๋ณ„์นญ1, ๋ณ„์นญ2, ..., ๋ณ„์นญN

 

 

 

WHERE์ ˆ, ์ค‘์ฒฉ ์„œ๋ธŒ ์ฟผ๋ฆฌNested Subquery

 

ใ…กNested Subquery - ๋‹จ์ผ ํ–‰ 
  ์ •๋Œ€๋ฆฌ๋ผ๋Š” ์‚ฌ๋žŒ์˜ ์ง๊ธ‰์„ ๊ตฌํ•˜์‹œ์˜ค.

SELECT office_worker
FROM employee
WHERE office_worker = (SELECT office_worker FROM employee WHERE name = '์ •๋Œ€๋ฆฌ')

 

ใ…กNested Subquery - ๋ณต์ˆ˜(๋‹ค์ค‘) ํ–‰ 
  ์ •๋Œ€๋ฆฌ๋ณด๋‹ค ๊ธ‰์—ฌ๊ฐ€ ๋†’์€ ์‚ฌ๋žŒ๋“ค์„ ๊ตฌํ•˜์‹œ์˜ค.

SELECT *
FROM employee
WHERE salary > (SELECT salary FROM employee WHERE name = '์ •๋Œ€๋ฆฌ')

  ์ง๊ธ‰์ด ์‚ฌ์›์ธ ์‚ฌ๋žŒ๋“ค์„ ๊ตฌํ•˜์‹œ์˜ค.

SELECT *
FROM employee
WHERE office_worker IN (SELECT office_worker FROM employee WHERE office_worker = '์‚ฌ์›')

 

WHERE์ ˆ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” ์ค‘์ฒฉ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ผ ๋ถ€๋ฅธ๋‹ค. ์‹คํ–‰ ๊ฒฐ๊ณผ์˜ ํ–‰ ์ˆ˜, ์—ด ์ˆ˜์— ๋”ฐ๋ผ ๋‹จ์ผ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ, ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ, ๋‹ค์ค‘ ์—ด ์„œ๋ธŒ ์ฟผ๋ฆฌ๋กœ ๋‚˜๋ˆ„๋ฉฐ ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์‹ค๋ฌด์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์ผ ํ–‰/ ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋งŒ ๋‹ค๋ฃฌ๋‹ค. 

 

๋‹จ์ผ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” >, >=, =, <=, <, <>, ^=, != ๋“ฑ์˜ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์“ฐ์ด๋ฉฐ, ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” IN, ANY, SOME, ALL, EXISTS ๋“ฑ์˜ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์“ฐ์ธ๋‹ค. ์ถœ๋ ฅํ•˜๋Š” ํ–‰ ์ˆ˜์™€ ์—ฐ๊ฒฐ์ง€์–ด์„œ, ์ „์ž๋ฅผ ๋‹จ์ผ ํ–‰ ์—ฐ์‚ฐ์ž, ํ›„์ž๋ฅผ ๋‹ค์ค‘ ํ–‰ ์—ฐ์‚ฐ์ž๋ผ ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. 

 

IN : ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด TRUE
ANY, SOME : ๋งŒ์กฑํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์ด๋ฉด TRUE
ALL : ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋ฉด TRUE
EXISTS : ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋ฉด TRUE (ํ–‰์ด 1๊ฐœ ์ด์ƒ์ด๋ฉด TRUE)

 <IN> ๋ถ€์„œ๋ณ„ ์ตœ๊ณ  ๊ธ‰์—ฌ์™€ ๋™์ผํ•œ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์‚ฌ์› ์ •๋ณด

SELECT *
FROM emp
WHERE sal IN (SELECT MAX(sal) FROM emp GROUP BY deptno);

 

 <SOME> ๋“ฑ๊ฐ€ ๋น„๊ต ์—ฐ์‚ฐ์ž(=)์™€ ANY, SOME์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด IN ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰

SELECT *
FROM emp
WHERE sal = SOME (SELECT MAX(sal) FROM emp GROUP BY deptno);

 

 <ANY> ๋“ฑ๊ฐ€ ๋น„๊ต ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹Œ ๋Œ€์†Œ ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ANY๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด?
 < ANY : ๋ถ€์„œ 30 ์ค‘ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ์ ์€ ๊ธ‰์—ฌ๋ฅผ ๊ฐ€์ง„ ์‚ฌ์›์„ ์ฐพ๊ฒŒ ๋จ
 > ANY : ๋ถ€์„œ 30 ์ค‘ ์ตœ์†Œ๊ฐ’๋ณด๋‹ค ๋†’์€ ๊ธ‰์—ฌ๋ฅผ ๊ฐ€์ง„ ์‚ฌ์›์„ ์ฐพ๊ฒŒ ๋จ

SELECT *
FROM emp
WHERE sal < ANY (SELECT sal FROM emp WHERE deptno = 30);

 

 <ALL> ๋ถ€์„œ 30 ์ค‘ ์ตœ๋Œ€ ๊ธ‰์—ฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์‚ฌ์› ์ถœ๋ ฅ

SELECT *
FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30);

 

 <EXISTS> ๋ถ€์„œ50์ด ์žˆ์œผ๋ฉด EMP ์ „์ฒด ์ถœ๋ ฅ

SELECT *
FROM emp
WHERE EXISTS (SELECT dname FROM dept WHERE deptno = 50);

 

 

 

 

 

 

์ถœ์ฒ˜

์–‘๋””๋กœ๊ทธ ๋ธ”๋กœ๊ทธ

Inpa Dev ๋ธ”๋กœ๊ทธ

java์˜ ๊ฐœ๋ฐœ์ผ๊ธฐ ๋ธ”๋กœ๊ทธ

 
๋”๋ณด๊ธฐ
TOOLS/SQL