๐ ์ ์ฉํ ์ ๋ณด
์ธ์ ์ ๋ณด ํ์ธ
SHOW USER; -- system ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ
SELECT * FROM V$SESSION;
SELECT * FROM V$SESSION WHERE USERNAME = 'SYSTEM';
๐ SubQuery
- SubQuery : Main Query (SELECT, INSERT, DELETE, UPDATE, CREATE) ์์ ํฌํจ๋๋ SELECT

์ง์ ์ด๋ฆ
, ์ง์
์ถ๋ ฅ ๋๋ค.
- Subquery์ ์ข ๋ฅ

- Query์ 2๊ฐ์ง ์๋ฏธ โ
SQL
โกSELECT
Scalar
: ๋จ์ผ๊ฐ
- ์คํ ์์

SUBQUERY ์คํ (๊ฒฐ๊ณผ ์งํฉ(๋ฐ์ดํฐ)์ด ๋ง๋ค์ด ์ง๋ค.) โ MAIN QUERY์คํ ์์ธ) Correlated Subquery (์๊ด์๋ธ์ฟผ๋ฆฌ)

Correlated Subquery ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์ปฌ๋ผ์ ์ฐธ์กฐ ํ๋ค. (์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐ) ๋ฉ์ธ ์ฟผ๋ฆฌ๊ฐ ๋จผ์ ์คํ๋๊ณ ์๋ธ์ฟผ๋ฆฌ์์ ํํฐ๋ง ํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ
์๋ธ ์ฟผ๋ฆฌ ์ฌ์ฉ์ ์ฑ๋ฅ ํฅ์

- ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ, ์ค๊ฐ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๊ฐ DBMS ๋ด์์ ์ฒ๋ฆฌํ๊ฒ ๋์ด ์ฑ๋ฅ ํฅ์์ด ๋๋ค.
- ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด, ์ฌ๋ฌ ๋ฒ์ ์์ฒญ์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ ์๋ต ๊ณผ์ ์ด ์ถ๊ฐ๋๋ค. ๋ํ ์ค๊ฐ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ ๊ณผ์ ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ด๋นํ๋ ๋จ์ ์ด ์๋ค.
SELECT ENAME,JOB FROM EMP
WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = 'SMITH' );

โ SMITH
์ ๋ถ์์ ์ผํ๋ ์ง์ ์ด๋ฆ, ์ง์
์ถ๋ ฅ
โก
SELECT ENAME,SAL FROM EMP WHERE SAL < ( SELECT AVG(SAL) FROM EMP);

โ ์ง์ ๊ธ์ฌ ํ๊ท
๋ณด๋ค ์ ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์ ์ด๋ฆ๊ณผ ๊ธ์ฌ ์ถ๋ ฅ
SINGLE COLUMN, MULTIPLE ROW RETURN SUBQUERY โ
SELECT ENAME,JOB FROM EMP WHERE DEPTNO = 10,30; --? ์๋ฌ
โ ์๋ฌ ๋ฐ์ : =
์ฐ์ฐ์ ์ค๋ฅธ์ชฝ R-VALUE๋ ํ๋๋ง ์์ผ ํ๋ค.
โก ๋ณต์๊ฐ ๊ฐ ์ฒ๋ฆฌ ์ํด์ IN, ANY, ALL ๋ฆฌ์คํธ ์ฐ์ฐ์ ์ฌ์ฉํด์ผ ๋๋ค.
-- Multiple Rows -- IN,ANY,ALL
SELECT ENAME,JOB FROM EMP WHERE DEPTNO IN (10,30);

โ 10๋ฒ, 20๋ฒ ๋ถ์์ ์ง์ ์ด๋ฆ๊ณผ ์ง์
โข
SELECT DNAME,LOC FROM DEPT -- 3์ธ ์ด์ ๊ทผ๋ฌด ๋ถ์ ์ ๋ณด์กฐํ ??
WHERE DEPTNO = (SELECT DEPTNO FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 );
(SELECT DEPTNO FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 )
โ ์๋ธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ณต์ ๊ฐ์ ํ์ด ์ถ๋ ฅ ๋์๋ค.
- WHERE ์ ๋ค
=
๋น๊ต ์ฐ์ฐ์์R-value
์๋ ๋จ์ผ ๊ฐ๋ง ์ฌ ์ ์๋ค. ๋ฐ๋ผ์ List ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ฐ์ฐ์ ํ ์ ์๋ค.
MULTIPLE COLUMN, MULTIPLE ROW RETURN โ
SELECT DEPTNO,JOB,ENAME,SAL FROM EMP
WHERE (DEPTNO,JOB) IN (SELECT DEPTNO,JOB FROM EMP
GROUP BY DEPTNO,JOB HAVING AVG(SAL) > 2000);
Scalar Subquery

SELECT DEPTNO,ENAME,JOB,SAL,(
SELECT ROUND(AVG(SAL),0)
FROM EMP S WHERE S.JOB=M.JOB) AS JOB_AVG_SAL
FROM EMP M
ORDER BY JOB; -- ์คํ๊ณํ(?) outer-join โ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด NULL ๋ฆฌํด
- SELECT LIST ๋ถ๋ถ์ ์๋ธ ์ฟผ๋ฆฌ ์กด์ฌ : Scalar Subquery

- ์๋ธ ์ฟผ๋ฆฌ ๋ด๋ถ์, ๋ฉ์ธ ์ฟผ๋ฆฌ์
JOB
์ ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค.
- ๋ฐ๋ผ์, ๋ฉ์ธ ์ฟผ๋ฆฌ๊ฐ ๋จผ์ ์คํ๋๊ณ ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค
โ
Correlated Subquey
- ๋ฉ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํด์ผ ๋๋ฏ๋ก, ๋งค๋ฒ ํ ํ์ ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ ๋๋ง๋ค ํด๋น ์๋ธ ์ฟผ๋ฆฌ๊ฐ ๊ณ์์ ์ผ๋ก ์คํ๋๋ค. ์ด๋ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค.
CORRELATED SUBQUERY (์๊ด์๋ธ์ฟผ๋ฆฌ) - ๋งค์ฐ ๋นํจ์จ์
- Subquery๋ Mainquery์ ์ปฌ๋ผ์ ์ฐธ์กฐํ ์ ์์ง๋ง Mainquery๋ Subquery์ ์ปฌ๋ผ์ ์ฐธ์กฐํ ์ ์๋ค.
[์ง๋ฌธ]
- Mainquery์์ Subquery์ ์ปฌ๋ผ์ ์ฐธ์กฐ ํ๋ ค๋ฉด โ โ Join ์ผ๋ก ๋ณํ โก Scalar Subquery
โ
SELECT DEPTNO,ENAME,JOB,SAL FROM EMP M
WHERE SAL > ( SELECT AVG(SAL) AS AVG_SAL FROM EMP WHERE JOB = M.JOB );

- ์๋ธ ์ฟผ๋ฆฌ์์, ๋ฉ์ธ ์ฟผ๋ฆฌ ๋ฌธ์
M.JOB
์ ์ฐธ์กฐํ๊ณ ์๋ค.๋ง์ฐฌ๊ฐ์ง๋ก, ๋งค ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ ๋๋ง๋ค ํด๋น ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋งค๋ฒ ์คํํด์ผ ํ๋ฏ๋ก, ๋นํจ์จ์ ์ด๋ค.
In-Line View (FROM ์ ์ ์ฌ์ฉ๋ SUBQUERY)
SQL์ด ์คํ๋๋ ์์ ์ ๋์ ์ผ๋ก ์์ฑ๋๋ View์ ์ญํ ์ ํ๋ค๊ณ ํด์ Dynamic View ๋ผ๊ณ ๋ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก Subquery์ ์ปฌ๋ผ์ Mainquery์์ ์ฌ์ฉํ ์ ์์ง๋ง Inline View์์ Subquery์ ์ปฌ๋ผ์ Mainquery ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
โ
SELECT DEPTNO, ENAME,EMP.JOB,SAL,IV.AVG_SAL
FROM EMP, (SELECT JOB,ROUND(AVG(SAL)) AS AVG_SAL FROM EMP GROUP BY JOB) IV
WHERE EMP.JOB = IV.JOB AND SAL > IV.AVG_SAL
ORDER BY DEPTNO ,SAL DESC;

- FROM ์ ์ ์ฌ์ฉ๋ ์๋ธ ์ฟผ๋ฆฌ ํ์ธ
TOP-N, BOTTOM-M (์๋ธ์ฟผ๋ฆฌ, ROWNUM์ ํ์ฉ)
SELECT *
FROM (SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL ASC) BM
WHERE ROWNUM <= 5;

In-Line View
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ํตํด ๋์ ์ผ๋ก ์ํ๋ ํ ์ด๋ธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
- ์๋ธ ์ฟผ๋ฆฌ ๋ด์์ ๋ฐ์ดํฐ ์ ๋ ฌ ํ
ROWNUM
์ ํตํด ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค!
โ SAL ๊ธฐ์ค ํ์ 5๊ฐ์ ๋ ์ฝ๋ ์ถ๋ ฅ
โก
SELECT TN.EMPNO,TN.ENAME,TN.SAL
FROM (SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC) TN
WHERE ROWNUM < 5;

โ SAL ๊ธฐ์ค ์์ 5๊ฐ์ ๋ ์ฝ๋ ์ถ๋ ฅ
๐ DML ์ฐ์ฐ๊ณผ Subquery
INSERT INTO BONUS(ENAME,JOB,SAL,COMM) SELECT ENAME,JOB,SAL,COMM FROM EMP;
SELECT * FROM BONUS; // ๊ฒฐ๊ณผ ํ์ธ
ROLLBACK; // ๋ค์๋ฒ ์ค์ต์ ์ํด์
SELECT * FROM BONUS; // ๊ฒฐ๊ณผ ํ์ธ

โก // ๋ถ์๋ณ ์ฑ๊ณผ๋ณ ๋ณด๋์ค ๊ณ์ฐํ(๋ฐ์ดํฐ ์ฐ์ฐ) N๊ฐ Rows INSERT + ๋ฐ์ดํฐ ์ฐ์ฐ(๊ฐ๊ณต)
INSERT INTO BONUS(ENAME,JOB,SAL,COMM)
SELECT ENAME,JOB,SAL,DECODE(DEPTNO,10,SAL*0.3,20,SAL*0.2)+NVL(COMM,0)
FROM EMP WHERE DEPTNO IN (10,20);
SELECT * FROM BONUS;
COMMIT;

โ ๋ฐ์ดํฐ ๊ฐ๊ณต(๋ณด๋์ค ๊ณ์ฐ), ๊ณ์ฐ Insert๊น์ง ํ๋ฒ์ ๊ฐ๋ฅ โ ํ๋ก๊ทธ๋๋ฐ ๋ก์ง ๊ฐ๋ฐ ์ฒ๋ฆฌ๋ฅผ ์ฟผ๋ฆฌ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
โข // ํ์์ COMM์ ๋ฐ์ง ๋ชปํ๋ ์ฌ์๋ค์๊ฒ ํ๊ท COMM ๊ธ์ก์ 50%๋ฅผ ๋ณด๋์ค๋ก ์ง๊ธ
UPDATE EMP SET COMM = (SELECT AVG(COMM)/2 FROM EMP) -- ์ ์ฒด ์ง์ ์ปค๋ฏธ์
์ 50%
WHERE COMM IS NULL OR COMM = 0;
COMMIT;


โฃ // ํ๊ท ์ด์์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์๋ค์ ๋ณด๋์ค ์ง๊ธ ๋์์์์ ์ ์ธ
DELETE FROM BONUS WHERE SAL > (SELECT AVG(SAL) FROM EMP) ;
COMMIT;


Uploaded by N2T