DB & SQL

[SQL] ์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€? ์„œ๋ธŒ์ฟผ๋ฆฌ ์ข…๋ฅ˜ - ์Šค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค‘์ฒฉ

devJK93 2024. 5. 19.

๐Ÿ“ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€?

์„œ๋ธŒ์ฟผ๋ฆฌ, ๋ฉ”์ธ์ฟผ๋ฆฌ
์„œ๋ธŒ์ฟผ๋ฆฌ, ๋ฉ”์ธ์ฟผ๋ฆฌ

 

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

์Šค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค‘์ฒฉ

์ข…๋ฅ˜ ์„ค๋ช…
์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ
(Scalar Suquery)
SELECT ์ ˆ์— ์œ„์น˜ํ•˜๋ฉฐ ํ•œ ๋ ˆ์ฝ”๋“œ๋‹น ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ (๋‹จ์ผํ–‰, ๋‹จ์ผ์นผ๋Ÿผ์„ ๋ฐ˜ํ™˜)
์ธ๋ผ์ธ ๋ทฐ
(Inline View)
FROM ์ ˆ์— ์œ„์น˜ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๋ฆฌํ„ด๋˜์–ด์•ผ ํ•œ๋‹ค.
์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ
(Nested Subquery)
WHERE ์ ˆ์— ์œ„์น˜ํ•˜๋ฉฐ ๊ฒฐ๊ณผ์ง‘ํ•ฉ์„ ํ•œ์ •ํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ, ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ”์ธ์ฟผ๋ฆฌ ์ปฌ๋Ÿผ์„ ์ฐธ์กฐํ• ๋•Œ ์ƒ๊ด€๊ด€๊ณ„ ์žˆ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค. (๋‹จ์ผํ–‰, ๋‹ค์ค‘ํ–‰์„ ๋ฐ˜ํ™˜)

1.  ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ (Scalar Subquery)

  • SELECT ์ ˆ์— ์œ„์น˜ํ•˜๋ฉฐ ์นผ๋Ÿผ์˜ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜๋“œ์‹œ ๋‹จ์ผ ํ–‰ or ๋‹จ์ผ ๊ฐ’์œผ๋กœ ๋ฆฌํ„ด๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๐Ÿ˜ฌ ๋‹ค์ค‘ ํ–‰ ๊ฐ’์ด ์กฐํšŒ๋˜๋ฉด "ORA-01427: single-row subquery returns more than one row" ๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ฃผ์˜
SELECT name, (
    SELECT score.math
    FROM score
    WHERE score.id = student.id
    ) AS score
FROM student 
WHERE name = 'KIM';

 

 

2.  ์ธ๋ผ์ธ ๋ทฐ (Inline View)

  • FROM ์ ˆ์— ์œ„์น˜ํ•˜๋ฉฐ ํ…Œ์ด๋ธ”์˜ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ์„ ๋ถˆ๋Ÿฌ์™€ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™” ํ• ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฟผ๋ฆฌ์˜ ๊ฐ€๋…์„ฑ์ด ๋†’๋‹ค.
  • ํ•ด๋‹น ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๋ฆฌํ„ด๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์ธ๋ผ์ธ ๋ทฐ๋Š” SQL๋ฌธ์ด ์‹คํ–‰๋ ๋•Œ ์ž„์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋™์ ์ธ ๋ทฐ ๋กœ ์ด์™€ ๊ฐ™์€ ๋ทฐ๋ฅผ Dynamic View ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.(↔ ์ •์  ๋ทฐ(Static VIew))
  • ์ฃผ์˜์  SQL์„ ์ข€๋” ๋น ๋ฅธ ์†๋„๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ๊ฒƒ์ด ์ธ๋ผ์ธ ๋ทฐ์ด์ง€๋งŒ, SQL์„ ๊ตฌ์„ฑํ• ๋•Œ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์•ก์„ธ์Šค ์†๋„๋ฅผ ์ €ํ•˜ ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์— ์ฃผ์˜
SELECT e.name, e.title, d.name
FROM (SELECT name, title, dept_id
      FROM s_emp
      WHERE title = '์‚ฌ์›') e, s_dept d
WHERE e.dept_id = d.id;

 

 

3.  ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ (Nested Subquery)

  • WHERE ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๋ฉ”์ธ์ฟผ๋ฆฌ ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์ปฌ๋Ÿผ ๊ฐ’๊ณผ ๋น„๊ตํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋‹จ์ผํ–‰ / ๋‹ค์ค‘ํ–‰ ๋‘˜ ๋‹ค ๋ฆฌํ„ด์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

3.1. Single Row SubQuery

  • Single Row SubQuery๋ž€ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ๋ฉ”์ธ์ฟผ๋ฆฌ๋กœ ์ „๋‹ฌ๋˜๋Š” ํ–‰์ด ๋‹จ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.
  • WHERE ์ ˆ์— ๋‹จ์ผ ํ–‰ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
SELECT name, title, dept_id
FROM s_emp
WHERE dept_id = (SELECT dept_id
                 FROM s_emp
                 WHERE name = 'jk');

 

3.2. Multi Row SubQuery

  • Single Row SubQuery๋ž€ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ๋ฉ”์ธ์ฟผ๋ฆฌ๋กœ ์ „๋‹ฌ๋˜๋Š” ํ–‰์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.
  • WHERE ์ ˆ์— ๋‹ค์ค‘ ํ–‰ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
SELECT name, dept_id
FROM s_emp
WHERE dept_id IN (SELECT id
                  FROM s_dept
                  WHERE region_id = 3);


3.3. Multi-Column SubQuery

  • Single Row SubQuery๋ž€ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•  ๋•Œ WHERE ์ ˆ์—์„œ ๋น„๊ตํ•˜๋Š” ์นผ๋Ÿผ์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์นผ๋Ÿผ์„ ๋™์‹œ์— ๋น„๊ตํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•˜๋ฉฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ pair-wise ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.
SELECT name, dept_id, salary
FROM s_emp
WHERE (dept_id, salary) IN (SELECT dept_id, MIN(salary)
                            FROM s_emp
                            GROUP BY dept_id);

 

 

4.  ๊ธฐํƒ€ ์„œ๋ธŒ์ฟผ๋ฆฌ

4.1. HAVING ์ ˆ์—์„œ์˜ SubQuery

SELECT dept_id, AVG(salary)
FROM s_emp
GROUP BY dept_id
HAVING AVG(salary) > (SELECT AVG(salary)
                      FROM s_emp
                      WHERE dept_id = 100);

 

4.2. CREATE ์ ˆ์—์„œ์˜ SubQuery

  • ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ๊ธฐ์กด์˜ ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•ด์„œ ํŠน์ • ์ปฌ๋Ÿผ ๋˜๋Š” ํ–‰๋งŒ์œผ๋กœ ์›ํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋Š” ์ œ์™ธํ•˜๊ณ  ํ…Œ์ด๋ธ”๋งŒ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์กฐ๊ฑด์ ˆ์ด ํ•ญ์ƒ ๊ฑฐ์ง“์ด๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค. → ex. WHERE 1 <> 1
  • (์ƒ์„ฑํ•  ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ๋ช…์„ ์ƒ๋žตํ•˜๋ฉด, SELECT ๋ฌธ์˜ ์ปฌ๋Ÿผ๋ช…๊ณผ ๋™์ผํ•˜๊ฒŒ ๋œ๋‹ค.)
CREATE TABLE emp_100 (id, name, mailid, start_date)
AS SELECT id, name, mailid, start_date
FROM s_emp
WHERE dept_id = 100;


Table created.

 

4.3. DML ๋ฌธ์—์„œ์˜ SubQuery

INSERT INTO emp_100
	(id, name, mailid, start_date)
SELECT id, name, mailid, start_date
FROM s_emp
WHERE start_date < '24/05/18';

 

UPDATE s_emp
SET dept_id = (
    SELECT dept_id
    FROM s_emp
    WHERE title = '๊ณผ์žฅ')
WHERE name = 'jk';

 

 

 

 

 

 


๐Ÿ“š ์ถœ์ฒ˜

 

[Oracle] ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์ข…๋ฅ˜ - ( ์Šค์นผ๋ผ, ์ธ๋ผ์ธ๋ทฐ, ์ค‘์ฒฉ )

์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€ ๋ฉ”์ธ์ฟผ๋ฆฌ์— ์†ํ•ด ์žˆ์œผ๋ฉฐ ๋ถ€๋ชจ์™€ ์ž์‹๊ฐ™์€ ๊ณ„์ธต์ ์ธ ๊ด€๊ณ„์ด๋‹ค. ์ž์‹์ด ๋ถ€๋ชจ์— ์†ํ•ด์žˆ๋Š”๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ”์ธ์ฟผ๋ฆฌ์— ์ข…์†๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ๋…์ ์œผ๋กœ

yunamom.tistory.com

 

์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery)๋ž€ ํ•˜๋‚˜์˜ SQL๋ฌธ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ SQL๋ฌธ์„ ๋งํ•œ๋‹ค. ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ธฐ์ค€์„ ์ด์šฉํ•œ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” [๊ทธ๋ฆผ โ…ก-2-12]์™€ ๊ฐ™์ด ๋ฉ”์ธ์ฟผ๋ฆฌ๊ฐ€ ์„œ๋ธŒ

dataonair.or.kr

 

[Oracle] ์˜ค๋ผํด ์„œ๋ธŒ์ฟผ๋ฆฌ ์ข…๋ฅ˜ ๋ฐ ์‚ฌ์šฉ๋ฒ• (SubQuery)

์˜ค๋ผํด์—์„œ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋ฉด ์„œ๋ธŒ ์ฟผ๋ฆฌ(subquery)๋ฅผ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค. ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด ์•„์ฃผ ๋ณต์žกํ•˜๊ฒŒ ๋Š๊ปด์ง€๋Š”๋ฐ, ๊ธฐ๋Šฅ์„ ์กฐ๊ธˆ๋งŒ ์ตํžˆ๋ฉด ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•  ๋•Œ ์•„์ฃผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ

gent.tistory.com

 

๋Œ“๊ธ€