cmod.ify

DB SET Operator & Sub Query & Join ๋ณธ๋ฌธ

BASIC/DATABASE

DB SET Operator & Sub Query & Join

modifyC 2025. 12. 29. 18:29
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ”— SQL ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž (SET OPERATOR) ์ •๋ฆฌ

1. ๊ฐœ์š”

  • 2๊ฐœ ์ด์ƒ์˜ SELECT ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ์—ฐ์‚ฐ์ž„.
  • ์กฐ์ธ(JOIN)์ด ์˜†์œผ๋กœ(์—ด) ํ•ฉ์น˜๋Š” ๊ฑฐ๋ผ๋ฉด, ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž๋Š” ์œ„์•„๋ž˜๋กœ(ํ–‰) ํ•ฉ์น˜๋Š” ๊ฒƒ์ž„.

2. ์‚ฌ์šฉ ๊ฐ€์ด๋“œ๋ผ์ธ

  • ์—ด์˜ ๊ฐœ์ˆ˜์™€ ์ž๋ฃŒํ˜• ์ผ์น˜: ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ SELECT ๋ฌธ์˜ ์ปฌ๋Ÿผ ๊ฐœ์ˆ˜์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ˆœ์„œ๋Œ€๋กœ ๋งž์•„์•ผ ํ•จ.
  • ์ปฌ๋Ÿผ ์ด๋ฆ„: ๊ฒฐ๊ณผ์ฐฝ์— ๋œจ๋Š” ์ปฌ๋Ÿผ ๋ช…์€ ์ฒซ ๋ฒˆ์งธ SELECT ๋ฌธ์˜ ๊ฒƒ์„ ๋”ฐ๋ฆ„.
  • ์ •๋ ฌ: ORDER BY๋Š” ๋งจ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์— ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์“ธ ์ˆ˜ ์žˆ์Œ.
  • ์ œํ•œ: LOB ๊ณ„์—ด(BLOB, CLOB)์ด๋‚˜ LONG ํ˜• ์ปฌ๋Ÿผ์—๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•จ.

3. ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž์˜ ์ข…๋ฅ˜

โ‘  UNION (ํ•ฉ์ง‘ํ•ฉ - ์ค‘๋ณต ์ œ๊ฑฐ)

  • ๋‘ ๊ฒฐ๊ณผ๋ฌผ์„ ํ•ฉ์นœ ํ›„ ์ค‘๋ณต๋œ ํ–‰์€ ํ•˜๋‚˜๋งŒ ๋‚จ๊น€.
  • ๋‚ด๋ถ€์ ์œผ๋กœ ์ •๋ ฌ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์œผ๋ฉด ์„ฑ๋Šฅ์ด ์กฐ๊ธˆ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Œ.
SELECT DEPTNO FROM EMP -- 10, 20, 30
UNION
SELECT DEPTNO FROM DEPT; -- 10, 20, 30, 40
-- ๊ฒฐ๊ณผ: 10, 20, 30, 40 (์ค‘๋ณต ์ œ๊ฑฐ๋จ)

โ‘ก UNION ALL (ํ•ฉ์ง‘ํ•ฉ - ์ค‘๋ณต ํฌํ•จ)

  • ๋‘ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‹จ์ˆœํžˆ ๊ทธ๋Œ€๋กœ ๋‹ค ํ•ฉ์นจ.
  • ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์•ˆ ํ•˜๋ฏ€๋กœ ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฆ„. (์‹ค๋ฌด์—์„œ ์ž์ฃผ ์”€)
SELECT DEPTNO FROM EMP
UNION ALL
SELECT DEPTNO FROM DEPT;
-- ๊ฒฐ๊ณผ: 10, 20, 30, 10, 20, 30, 40 (๋ชจ๋‘ ์ถœ๋ ฅ)

โ‘ข INTERSECT (๊ต์ง‘ํ•ฉ)

  • ์–‘์ชฝ ํ…Œ์ด๋ธ”์— ๊ณตํ†ต์œผ๋กœ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœํ•จ.
SELECT DEPTNO FROM EMP
INTERSECT
SELECT DEPTNO FROM DEPT;
-- ๊ฒฐ๊ณผ: 10, 20, 30

โ‘ฃ EXCEPT (์ฐจ์ง‘ํ•ฉ)

  • ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ์—์„œ ๋‘ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋บ€ ๋‚˜๋จธ์ง€๋งŒ ์กฐํšŒํ•จ. (Oracle ๋“ฑ ์ผ๋ถ€ DB์—์„œ๋Š” MINUS๋ผ๊ณ  ์”€)
SELECT DEPTNO FROM DEPT -- 10, 20, 30, 40
EXCEPT 
SELECT DEPTNO FROM EMP; -- 10, 20, 30
-- ๊ฒฐ๊ณผ: 40 (DEPT์—๋งŒ ์žˆ๋Š” ๊ฒƒ)

๐Ÿ” SQL ์„œ๋ธŒ์ฟผ๋ฆฌ(Sub Query) ์ •๋ฆฌ

1. ๊ฐœ์š” ๋ฐ ๊ทœ์น™

  • ์ •์˜: ํ•˜๋‚˜์˜ SQL ๋ฌธ ์•ˆ์— ํฌํ•จ๋œ ๋˜ ๋‹ค๋ฅธ SELECT ๋ฌธ์ž„.
  • ๊ตฌ์กฐ: ๊ฒ‰์„ ๊ฐ์‹ธ๋Š” ๋ฉ”์ธ ์ฟผ๋ฆฌ(Main Query)์™€ ์•ˆ์— ๋ฐ•ํžŒ ์„œ๋ธŒ ์ฟผ๋ฆฌ(Sub Query)๋กœ ๋‚˜๋‰จ.
  • ์‚ฌ์šฉ์ฒ˜: SELECT, INSERT, UPDATE, DELETE ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ (WHERE, HAVING, FROM ์ ˆ ๋“ฑ).
  • ๊ทœ์น™:
    • ๋ฐ˜๋“œ์‹œ ๊ด„ํ˜ธ()๋กœ ๊ฐ์‹ธ์•ผ ํ•จ.
    • ์—ฐ์‚ฐ์ž์˜ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•ด์•ผ ํ•จ.
    • ๋ฉ”์ธ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ๋”ฑ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜์–ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”์ธ ์ฟผ๋ฆฌ์— ์ „๋‹ฌํ•จ.

2. ์œ„์น˜์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜

  • FROM ์ ˆ์— ์‚ฌ์šฉ: ์ธ๋ผ์ธ ๋ทฐ(Inline View)๋ผ๊ณ  ๋ถ€๋ฆ„ (๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์ทจ๊ธ‰).
  • WHERE/HAVING ์ ˆ์— ์‚ฌ์šฉ: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์„œ๋ธŒ์ฟผ๋ฆฌ ํ˜•ํƒœ์ž„.

3. ๊ฒฐ๊ณผ ํ–‰/์—ด ์ˆ˜์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜

โ‘  ๋‹จ์ผ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ (Single-Row)

  • ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์˜ค์ง 1๊ฐœ์˜ ํ–‰์ผ ๋•Œ์ž„.
  • ์—ฐ์‚ฐ์ž: =, >, >=, <, <=, <> ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ.
  • ์˜ˆ์‹œ: ํ‰๊ท  ๊ธ‰์—ฌ ์ด์ƒ์ธ ์‚ฌ์› ์กฐํšŒ
SELECT ename, sal FROM emp
WHERE sal >= (SELECT AVG(sal) FROM emp);

โ‘ก ๋‹ค์ค‘ ์—ด ์„œ๋ธŒ์ฟผ๋ฆฌ (Multi-Column)

  • ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปฌ๋Ÿผ์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ์ž„.
  • ๋ฉ”์ธ ์ฟผ๋ฆฌ์™€ ์ปฌ๋Ÿผ ๊ฐœ์ˆ˜/์ˆœ์„œ๋ฅผ ๋งž์ถฐ์„œ ํ•œ๊บผ๋ฒˆ์— ๋น„๊ต ๊ฐ€๋Šฅํ•จ.
-- ๋ถ€์„œ์™€ ์„ฑ๋ณ„์ด ๋™์‹œ์— ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์กฐํšŒ
SELECT * FROM tStaff
WHERE (depart, gender) = (SELECT depart, gender FROM tStaff WHERE name = '์•ˆ์ค‘๊ทผ');

โ‘ข ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ (Multi-Row)

  • ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ 2๊ฑด ์ด์ƒ์ผ ๋•Œ์ž„. ๋‹จ๋… ์—ฐ์‚ฐ์ž(=, >) ์‚ฌ์šฉ ์‹œ ์—๋Ÿฌ ๋‚˜๋ฏ€๋กœ ๋‹ค์ค‘ ํ–‰ ์—ฐ์‚ฐ์ž๋ฅผ ์จ์•ผ ํ•จ.

4. ๋‹ค์ค‘ ํ–‰ ์—ฐ์‚ฐ์ž

์—ฐ์‚ฐ์ž ์˜๋ฏธ ๋น„๊ณ 
IN ๋ชฉ๋ก ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜๋ฉด ์ฐธ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•จ
ANY / SOME ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ์ฐธ > ANY (์ตœ์†Ÿ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ์ฐธ)
ALL ๊ฒฐ๊ณผ ๋ชจ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ์ฐธ > ALL (์ตœ๋Œ“๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ์ฐธ)
EXISTS ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ฐธ ๋ฐ์ดํ„ฐ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ์šฉ
  • ALL ์˜ˆ์‹œ: 30๋ฒˆ ๋ถ€์„œ์˜ ๋ชจ๋“  ์‚ฌ์›๋ณด๋‹ค ๊ธ‰์—ฌ๊ฐ€ ๋†’์€ ์‚ฌ์›
SELECT ename, sal FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30);

"EMP ํ…Œ์ด๋ธ”์—์„œ MGR์˜ ENAME์ด KING ์ธ ์‚ฌ์›์˜ ENAME๊ณผ SAL ์กฐํšŒ"

์ด๊ฑด KING์˜ ์‚ฌ์›๋ฒˆํ˜ธ(EMPNO)๋ฅผ ์ฐพ์•„์„œ ๊ทธ๊ฒŒ MGR์ธ ์‚ฌ์›์„ ์กฐํšŒํ•˜๋ฉด ๋จ

SELECT ename, sal
FROM emp
WHERE mgr = (SELECT empno FROM emp WHERE ename = 'KING');

 

๐Ÿค SQL ์กฐ์ธ(JOIN) ์ •๋ฆฌ

1. ๊ฐœ์š”

  • 2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ์ž‘์—…์ž„.
  • ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ํฉ์–ด์ง„ ์ •๋ณด๋ฅผ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•จ.

2. ์กฐ์ธ์˜ ์ข…๋ฅ˜ (์ „ํ†ต์ ์ธ ๋ฐฉ์‹)

โ‘  CROSS JOIN (๊ต์ฐจ ์กฐ์ธ)

  • ์นดํ…Œ์‹œ์•ˆ ๊ณฑ(Cartesian Product)์ด๋ผ๊ณ ๋„ ํ•จ.
  • ์กฐ๊ฑด ์—†์ด ์–‘์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์„ ๋ฌด์ง€์„ฑ์œผ๋กœ ๋‹ค ์กฐํ•ฉํ•จ.
  • ๊ฒฐ๊ณผ ํ–‰ ์ˆ˜: ํ…Œ์ด๋ธ”A ํ–‰ ์ˆ˜ × ํ…Œ์ด๋ธ”B ํ–‰ ์ˆ˜
SELECT * FROM EMP, DEPT;

โ‘ก EQUI JOIN (๋“ฑ๊ฐ€ ์กฐ์ธ)

  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ž„. = ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต ์ปฌ๋Ÿผ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ํ•ฉ์นจ.
  • ํ…Œ์ด๋ธ” ์ด๋ฆ„์ด ๊ธธ๋ฉด ๋ณ„์นญ(Alias)์„ ์ฃผ๋ฉด ํŽธํ•จ.
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;

โ‘ข NON-EQUI JOIN (๋น„๋“ฑ๊ฐ€ ์กฐ์ธ)

  • =์ด ์•„๋‹Œ ์—ฐ์‚ฐ์ž(BETWEEN, >, < ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ธํ•จ.
  • ์˜ˆ: ๊ธ‰์—ฌ(sal)๊ฐ€ ๊ธ‰์—ฌ ๋“ฑ๊ธ‰ ํ‘œ์˜ ์ตœ์†Œ~์ตœ๋Œ€ ๋ฒ”์œ„ ์‚ฌ์ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๋“ฑ๊ธ‰ ์กฐํšŒ.
SELECT ename, sal, grade
FROM emp, salgrade
WHERE sal BETWEEN losal AND hisal;

โ‘ฃ SELF JOIN (์ž์ฒด ์กฐ์ธ)

  • ๋™์ผํ•œ ํ…Œ์ด๋ธ”์„ ๋‘ ๋ฒˆ ์ฐธ์กฐํ•˜์—ฌ ์กฐ์ธํ•จ. (๋ณ„์นญ ํ•„์ˆ˜)
  • ์˜ˆ: ์‚ฌ์›์˜ ๊ด€๋ฆฌ์ž ์‚ฌ๋ฒˆ(mgr)์„ ํ†ตํ•ด ๊ด€๋ฆฌ์ž์˜ ์ด๋ฆ„์„ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉํ•จ.
SELECT e1.ename AS '์‚ฌ์›', e2.ename AS '๊ด€๋ฆฌ์ž'
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno;

3. ANSI JOIN (ํ‘œ์ค€ ๋ฌธ๋ฒ•)

๋ฏธ๊ตญ ํ‘œ์ค€ ํ˜‘ํšŒ์—์„œ ์ •ํ•œ ํ˜„๋Œ€์ ์ธ ์กฐ์ธ ๋ฐฉ์‹์ž„. ๊ฐ€๋…์„ฑ์ด ์ข‹์•„ ์‹ค๋ฌด์—์„œ ๊ถŒ์žฅ๋จ.

  • INNER JOIN: ๊ธฐ์กด EQUI JOIN๊ณผ ๊ฐ™์Œ. ON ์ ˆ์— ์กฐ๊ฑด์„ ์ ์Œ.
  • USING: ์กฐ์ธํ•  ์ปฌ๋Ÿผ ์ด๋ฆ„์ด ๊ฐ™์„ ๋•Œ ON ๋Œ€์‹  ์‚ฌ์šฉ (USING(deptno)).
-- EMP ํ…Œ์ด๋ธ”๊ณผ DEPT ํ…Œ์ด๋ธ”์„ EDPTNO์ปฌ๋Ÿผ์„ ์ด์šฉํ•ด์„œ JOIN
SELECT *
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;

-- USING ์“ฐ๋ฉด ๊ฐ™์€ ์ปฌ๋Ÿผ ์ด๋ฆ„ ์ƒ๋žต ๊ฐ€๋Šฅ
SELECT *
FROM EMP INNER JOIN DEPT
USING (DEPTNO);
  • NATURAL JOIN: ์ปฌ๋Ÿผ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์กฐ์ธํ•จ (์กฐ๊ฑด ์ƒ๋žต ๊ฐ€๋Šฅ)
SELECT *
FROM EMP NATURAL JOIN DEPT;

4. OUTER JOIN (์™ธ๋ถ€ ์กฐ์ธ)

  • ํ•œ์ชฝ ํ…Œ์ด๋ธ”์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ชฝ์—” ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฒฐ๊ณผ์— ํฌํ•จํ•จ.
์ข…๋ฅ˜ ์„ค๋ช…
LEFT OUTER JOIN ์™ผ์ชฝ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์กฐ๊ฑด ๋‹ค ๋‚˜์˜ด (์˜ค๋ฅธ์ชฝ ๋งค์นญ ์—†์œผ๋ฉด NULL)
RIGHT OUTER JOIN ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์กฐ๊ฑด ๋‹ค ๋‚˜์˜ด
FULL OUTER JOIN ์–‘์ชฝ ๋ชจ๋‘ ํฌํ•จ (MariaDB๋Š” UNION์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„)
-- MariaDB์—์„œ์˜ FULL OUTER JOIN ๊ตฌํ˜„
SELECT * FROM emp LEFT JOIN dept ON emp.deptno = dept.deptno
UNION
SELECT * FROM emp RIGHT JOIN dept ON emp.deptno = dept.deptno;

5. ๋‹ค์ค‘ ์กฐ์ธ (Multi-Join)

  • 3๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ๋•Œ ์‚ฌ์šฉํ•จ. ์ˆœ์ฐจ์ ์œผ๋กœ ์กฐ์ธ ์กฐ๊ฑด์„ ๋ถ™์—ฌ๋‚˜๊ฐ€๋ฉด ๋จ.
SELECT *
FROM tCar C 
INNER JOIN tMaker M ON C.maker = M.maker
INNER JOIN tCity T ON M.factory = T.name;

 

728x90
๋ฐ˜์‘ํ˜•

'BASIC > DATABASE' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๊ฐ€์ƒ ํ…Œ์ด๋ธ”  (0) 2025.12.30
DML & TCL  (0) 2025.12.29
MariaDB DDL ์‹ค์Šต  (0) 2025.12.26
MariaDB DDL  (1) 2025.12.26
MariaDB ๊ธฐ์ดˆ ์‹ค์Šต ๋ฌธ์ œ  (0) 2025.12.24