์ค๋ผํด(Oracle) - (DQL) : ์๋ธ์ฟผ๋ฆฌ
- SQL๋ฌธ ์์ ์์ฑํ๋ ์์ SELECT ๋ฌธ, ์ฃผ๋ก WHERE ์ ์์ ์ฌ์ฉ
- ์๋ธ ์ฟผ๋ฆฌ๋ ๋ฐ๋์ ๊ดํธ() ์์ ๋ฃ์ด ํํ
์๋ธ ์ฟผ๋ฆฌ ํน์ง
- ์กฐํ ๋์์ ์ค๋ฅธ์ชฝ์ ๋์ด๋ฉฐ () ๋ฌถ์ด์ ์ฌ์ฉ
- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ORDER BY ์ ์ ์ฌ์ฉํ ์ ์์
- ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๋์๊ณผ ์๋ธ ์ฟผ๋ฆฌ์ ๋์์ ๊ฐ์ ์๋ฃํ์ด๊ฑฐ๋ ๊ฐ์ ๊ฐ์๋ก ์ง์ ํด์ผ ํจ
- ์๋ธ ์ฟผ๋ฆฌ์ ๋ฉ์ธ ์ฟผ๋ฆฌ๋ ์ฐ์ฐ์์ ํจ๊ป ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋จ์ผํ ์๋ธ ์ฟผ๋ฆฌ์ ๋ค์คํ ์๋ธ ์ฟผ๋ฆฌ๋ก ๋๋ ์ง
์์
๐ธ ์ฌ์์ ์ด๋ฆ์ผ๋ก ์ฌ์์ด ์ํ ๋ถ์ ๋ฒํธ๋ฅผ ์ฐพ์(์๋ธ์ฟผ๋ฆฌ)
- ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ๋ถ์ ์ด๋ฆ๊ณผ ๋ถ์ ๋ฒํธ๋ฅผ ๋น๊ตํด์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์
SELECT DNAME
FROM DEPT
WHERE DEPTNO = (SELECT DEPTNO
FROM EMP
WHERE ENAME = 'KING');
๐ธ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด 'JONES'์ ๊ธ์ฌ ๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE SAL > (SELECT SAL
FROM EMP
WHERE ENAME = 'JONES');
๐ธ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ EMP ํ ์ด๋ธ์ ์ฌ์ ์ ๋ณด ์ค์์ ์ฌ์ ์ด๋ฆ์ด ALLEN์ธ ์ฌ์์ ์ถ๊ฐ ์๋น๋ณด๋ค ๋ง์ ์ถ๊ฐ ์๋น์ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE COMM > (SELECT COMM
FROM EMP
WHERE ENAME = 'ALLEN');
๐ธ 20๋ฒ ๋ถ์์ ์ํ ์ฌ์ ์ค ์ ์ฒด ์ฌ์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด์ ์์ ๋ถ์ ์ ๋ณด ์กฐํ
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL > (SELECT TRUNC(AVG(SAL))
FROM EMP)
AND DEPTNO = 20;
๋ค์คํ ์๋ธ ์ฟผ๋ฆฌ
IN ์ฐ์ฐ์
X IN (์๋ธ์ฟผ๋ฆฌ Y) : ์๋ธ์ฟผ๋ฆฌ Y์ ๊ฐ์ด X์ ๊ฐ์
- ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ค ํ๋๋ผ๋ ์ผ์นํ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด TRUE
๐ธ ๊ฐ ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ์ ๋์ผํ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE SAL IN (SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO)
ORDER BY DEPTNO;
ANY ์ฐ์ฐ์
X > ANY (์๋ธ์ฟผ๋ฆฌ Y) : X๋ Y์ ์ต์๊ฐ๋ณด๋ค ํผ
X < ANY (์๋ธ์ฟผ๋ฆฌ Y) : X๋ Y์ ์ต๋๊ฐ๋ณด๋ค ์์
- ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์์ ๋ง์กฑํ๋ ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ํ๋ ์ด์์ด๋ฉด TRUE
๋ฉ์ธ ์ฟผ๋ฆฌ์ ๋น๊ต ์กฐ๊ฑด์ด ์๋ธ ์ฟผ๋ฆฌ์ ์ฌ๋ฌ ๊ฒ์ ๊ฒฐ๊ณผ ์ค ํ๋ ์ด์ ๋ง์กฑ๋๋ฉด ๋ฐํ๋ฉ๋๋ค.
SALESMAN๋ค์ ๊ธ์ฌ๋ฅผ ์กฐํํ์ฌ ANY ์ฐ์ฐ์๋ก ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๋น๊ตํ์ฌ ์ถ๋ ฅ๋๋๋ก ํด๋ณด์.
SALESMAN๋ค์ ๊ธ์ฌ ์ค ์ต์๊ฐ๋ณด๋ค ๋ง์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์๋ค์ด ์ถ๋ ฅ๋ฉ๋๋ค.
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL > ANY (SELECT SAL
FROM EMP
WHERE JOB = 'SALESMAN');
๐ธ SALESMAN๋ค์ ๊ธ์ฌ์ ๊ฐ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE SAL = ANY (SELECT SAL
FROM EMP
WHERE JOB = 'SALESMAN');
๐ธ 30๋ฒ ๋ถ์ ์ฌ์๋ค์ ์ต๋ ๊ธ์ฌ๋ณด๋ค ์ ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE SAL < ANY (SELECT SAL
FROM EMP
WHERE DEPTNO = 30)
ORDER BY SAL, DEPTNO;
ALL ์ฐ์ฐ์
X > ALL (์๋ธ์ฟผ๋ฆฌ Y) : X๋ Y์ ์ต๋๊ฐ ๋ณด๋ค ํผ
X < ALL (์๋ธ์ฟผ๋ฆฌ Y) : X๋ Y์ ์ต์๊ฐ๋ณด๋ค ์์
- ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๋น๊ต ์กฐ๊ฑด์ด ์๋ธ ์ฟผ๋ฆฌ์ ์ฌ๋ฌ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ชจ๋ ๊ฐ์ด ์ผ์นํ๋ฉด ๋ฐํ
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL > ALL (SELECT SAL
FROM EMP
WHERE JOB = 'MANAGER');
๐ธ ๋ถ์ ๋ฒํธ๊ฐ 30๋ฒ์ธ ์ฌ์๋ค์ ์ต์ ๊ธ์ฌ๋ณด๋ค ๋ ์ ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE SAL < ALL (SELECT SAL
FROM EMP
WHERE DEPTNO = 30);
EXISTS ์ฐ์ฐ์
- ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋ฉด(์ฆ, ํ์ด 1๊ฐ ์ด์์ผ ๊ฒฝ์ฐ) TRUE
์๋ธ ์ฟผ๋ฆฌ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
SELECT *
FROM EMP
WHERE EXISTS (SELECT DNAME
FROM DEPT
WHERE DEPTNO = 10);
์๋ธ ์ฟผ๋ฆฌ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
SELECT *
FROM EMP
WHERE EXISTS (SELECT DNAME
FROM DEPT
WHERE DEPTNO = 50);
๋ค์ค ์ด ์๋ธ ์ฟผ๋ฆฌ
- ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ ๊ฐ ์ด์์ ์ปฌ๋ผ์ผ๋ก ๋ฐํ๋์ด ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ ๋ฌํ๋ ์ฟผ๋ฆฌ
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, SAL
FROM EMP
WHERE DEPTNO = 30);
- GROUP BY ์ ์ด ํฌํจ๋ ๋ค์ค ์ด ์๋ธ ์ฟผ๋ฆฌ
SELECT *
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
FROM ์ ์ ์ฌ์ฉํ๋ ์๋ธ ์ฟผ๋ฆฌ
๋ฉ์ธ ์ฟผ๋ฆฌ์ FROM ์ ์ ์๋ธ ์ฟผ๋ฆฌ๋ก ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ํฉ๋๋ค.
์ด ๋ฐฉ์์ FROM์ ์ ์ง์ ํ
์ด๋ธ์ ๋ช
์ํ์ฌ ์ฌ์ฉํ๊ธฐ์๋ ํ
์ด๋ธ ๋ด ๋ฐ์ดํฐ ๊ท๋ชจ๋ค ๋๋ฌด ํฌ๊ฑฐ๋ ํ์ฌ ์์
์ ๋ถํ์ํ ์ด์ด ๋๋ฌด ๋ง์ ์ผ๋ถ ํ๊ณผ ์ด๋ง ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ ์ฉ ํฉ๋๋ค.
ํ์ง๋ง FROM์ ์ ๋๋ฌด ๋ง์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ๋ฉด ๊ฐ๋
์ฑ์ด๋ ์ฑ๋ฅ์ด ๋จ์ด ์ง ์ ์์ต๋๋ค.
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM (SELECT *
FROM EMP
WHERE DEPTNO = 10) E10,
(SELECT *
FROM DEPT) D
WHERE E10.DEPTNO = D.DEPTNO;
- ๋จผ์ ์ ๋ ฌํ๊ณ ํด๋น ๊ฐ์๋ง ๊ฐ์ ธ์ค๊ธฐ
SELECT ROWNUM, ENAME, SAL
FROM (SELECT * FROM EMP ORDER BY SAL DESC)
WHERE ROWNUM <= 3;
SELECT ์ ์ ์ฌ์ฉํ๋ ์๋ธ ์ฟผ๋ฆฌ
- SELECT ์ ์์ ์ฐ์ด๋ ๋จ์ผ ํ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ค์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ๋ผ๊ณ ํฉ๋๋ค.
- SELECT ์ ์ ๋ช ์ํ๋ ์๋ธ ์ฟผ๋ฆฌ๋ ๋ฐ๋์ ํ๋์ ๊ฒฐ๊ณผ๋ง ๋ฐํํ๋๋ก ์์ฑํด์ผ ํฉ๋๋ค.
SELECT EMPNO, ENAME, JOB, SAL,
(SELECT GRADE
FROM SALGRADE
WHERE E.SAL BETWEEN LOSAL AND HISAL) AS SALGRADE,
DEPTNO,
(SELECT DNAME
FROM DEPT
WHERE E.DEPTNO = DEPT.DEPTNO) AS DNAME
FROM EMP E;
๐ธ ๋งค ํ๋ง๋ค ๋ถ์๋ฒํธ๊ฐ ๊ฐ ํ์ ๋ถ์๋ฒํธ์ ๋์ผํ ์ฌ์๋ค์ SAL ํ๊ท ์ ๊ตฌํด์ ๋ฐํ
SELECT ENAME, DEPTNO, SAL,
(SELECT TRUNC(AVG(SAL)) -- ์์ ๋ถ์์ ๊ธ์ฌ ํ๊ท ๊ฐ 1๊ฐ
FROM EMP
WHERE DEPTNO = E.DEPTNO) AS AVGDEPTSAL -- ํด๋น ๋ถ์๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ ํ์ฌ ์
๋ ฅ๋๋ ํ์ ๋ถ์
FROM EMP E;
๐ธ ๋ถ์ ์์น๊ฐ NEW YORK์ธ ๊ฒฝ์ฐ์ ๋ณธ์ฌ๋ก, ๊ทธ ์ธ ๋ถ์๋ ๋ถ์ ์ผ๋ก ๋ฐํ
SELECT EMPNO, ENAME,
CASE WHEN DEPTNO = (SELECT DEPTNO
FROM DEPT
WHERE LOC = 'NEW YORK')
THEN '๋ณธ์ฌ'
ELSE '๋ถ์ '
END AS ์์
FROM EMP
ORDER BY ์์ DESC;