๐Ÿ—„๏ธ Backend/Oracle

์˜ค๋ผํด(Oracle) - (DQL) : ์„œ๋ธŒ์ฟผ๋ฆฌ

kongmi 2023. 2. 20. 18:34
  • SQL๋ฌธ ์•ˆ์— ์ž‘์„ฑํ•˜๋Š” ์ž‘์€ SELECT ๋ฌธ, ์ฃผ๋กœ WHERE ์ ˆ์—์„œ ์‚ฌ์šฉ
  • ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” ๋ฐ˜๋“œ์‹œ ๊ด„ํ˜ธ() ์•ˆ์— ๋„ฃ์–ด ํ‘œํ˜„

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

  1. ์กฐํšŒ ๋Œ€์ƒ์˜ ์˜ค๋ฅธ์ชฝ์— ๋†“์ด๋ฉฐ () ๋ฌถ์–ด์„œ ์‚ฌ์šฉ
  2. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ORDER BY ์ ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  3. ๋ฉ”์ธ ์ฟผ๋ฆฌ์˜ ๋Œ€์ƒ๊ณผ ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ๋Œ€์ƒ์€ ๊ฐ™์€ ์ž๋ฃŒํ˜•์ด๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐœ์ˆ˜๋กœ ์ง€์ •ํ•ด์•ผ ํ•จ
  4. ์„œ๋ธŒ ์ฟผ๋ฆฌ์™€ ๋ฉ”์ธ ์ฟผ๋ฆฌ๋Š” ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹จ์ผํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ์™€ ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋กœ ๋‚˜๋ˆ ์ง

์˜ˆ์ œ

๐Ÿธ ์‚ฌ์›์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์›์ด ์†ํ•œ ๋ถ€์„œ ๋ฒˆํ˜ธ๋ฅผ ์ฐพ์Œ(์„œ๋ธŒ์ฟผ๋ฆฌ)
- ๋ฉ”์ธ ์ฟผ๋ฆฌ์—์„œ ๋ถ€์„œ ์ด๋ฆ„๊ณผ ๋ถ€์„œ ๋ฒˆํ˜ธ๋ฅผ ๋น„๊ตํ•ด์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์Œ

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;

๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ

์ถœ์ฒ˜ : https://m.blog.naver.com/regenesis90/222184391297

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;