Skip to content

Latest commit

ย 

History

History
342 lines (232 loc) ยท 7.51 KB

Oracle_SQL_#1.md

File metadata and controls

342 lines (232 loc) ยท 7.51 KB

Oracle - SQL #1


ALIAS

  • ์ปฌ๋Ÿผ ๋ณ„์นญ: AS ํ‚ค์›Œ๋“œ๋Š” ์„ ํƒ์ ์ด๋‹ค.

  • ํ…Œ์ด๋ธ” ๋ณ„์นญ: ํ…Œ์ด๋ธ”๋ช… ALIAS๋ช…

SELECT TB1.NAME AS N,  -- ์ปฌ๋Ÿผ์— ALIAS๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
       TB1.AGE A,      -- AS๋ฅผ ๋ถ™์ด์ง€ ์•Š์•„๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅ
       TB1.'123' AS NUM
FROM TB1


SELECT A.NAME
FROM TB1 A, TB2 B      -- ํ…Œ์ด๋ธ”์— ALIAS๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
WHERE A.NAME = B.NAME




ROWNUM

  • ์˜ค๋ผํด์—์„œ ์กฐํšŒ๋œ ํ–‰์ด ๋ช‡๋ฒˆ์งธ ํ–‰์ธ์ง€ ๋ถ€์—ฌ
-- ROWNUM์€ ์ •๋ ฌ ์ „์— ํ• ๋‹น
SELECT ROWNUM, ENAME, JOB, SAL
FROM SCOTT.EMP


-- ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ์— ์ˆœ์„œ ๋ถ€์—ฌ
SELECT ROWNUM, ENAME, JOB, SAL
FROM (SELECT ENAME, JOB, SAL
      FROM SCOTT.EMP
      ORDER BY JOB)


-- ROWNUM์„ ์—ญ์ˆœ์œผ๋กœ ์‚ฌ์šฉ
SELECT ROWNUM, ENAME, JOB, SAL
FROM (SELECT ENAME, JOB, SAL
      FROM SCOTT.EMP
      ORDER BY JOB)
ORDER BY ROWNUM DESC


-- ROWNUM์ด 1~3์ธ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ
SELECT ROWNUM, ENAME, JOB, SAL
FROM SCOTT.EMP
WHERE ROWNUM BETWEEN 1 AND 3




Sub Query

  • SELECT ์ชฝ์— ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์˜ฌ ๊ฒฝ์šฐ ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ (Scalar Subqueries)

  • FROM ์ ˆ์— ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์˜ฌ ๊ฒฝ์šฐ์—๋Š” ์ธ๋ผ์ธ ๋ทฐ (Inline View)

  • WHERE ์ ˆ์— ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์˜ฌ ๊ฒฝ์šฐ์—๋Š” ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ (Nested Subqueries)

-- ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ
SELECT 'ํ™์ •์™„' AS NAME,
      (SELECT AGE 
       FROM TB1
       WHERE NAME = 'ํ™์ •์™„'
      ) AS AGE
FROM DUAL


-- ์ธ๋ผ์ธ ๋ทฐ
SELECT AGE
FROM (SELECT AGE 
      FROM TB1
      WHERE NAME = 'ํ™์ •์™„')


-- ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ
SELECT NAME, AGE
FROM TB1
WHERE NAME = (SELECT NAME
              FROM TB1
              WHERE NAME = 'ํ™์ •์™„')




OVER()

  • ์˜ค๋ผํด์—์„œ OVER()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด GROUP BY๋‚˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ถ„์„ ํ•จ์ˆ˜ (SUM, MAX, COUNT)์™€ ์ง‘๊ณ„ ํ•จ์ˆ˜ (GROUP BY, ORDER BY)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ง‘๊ณ„ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ, ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๊ธธ์–ด์ง โ†’ OVER()๋ฅผ ์‚ฌ์šฉํ•ด ์ฟผ๋ฆฌ ๊ธธ์ด๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ์กฐ

<๋ถ„์„ํ•จ์ˆ˜>(<์ปฌ๋Ÿผ>) OVER (
    [PARTITION BY <์ปฌ๋Ÿผ1>, <์ปฌ๋Ÿผ2>, ...]
    [ORDER BY <์ปฌ๋Ÿผ1> [ASC|DESC], <์ปฌ๋Ÿผ2> [ASC|DESC], ...]
    [ROWS BETWEEN <์‹œ์ž‘์ > AND <๋์ >]
)
  • PARTITION BY: ํ–‰๋“ค์„ ์ง€์ •ํ•œ ์ปฌ๋Ÿผ์˜ ๊ฐ’์— ๋”ฐ๋ผ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • ORDER BY: ์ง€์ •๋œ ์ปฌ๋Ÿผ์˜ ๊ฐ’์— ๋”ฐ๋ผ ๊ฐ ํŒŒํ‹ฐ์…˜ ๋‚ด์—์„œ ํ–‰๋“ค์„ ์ •๋ ฌ.
  • ROWS BETWEEN: ํŠน์ • ํ–‰์„ ๊ธฐ์ค€์œผ๋กœ ๋ช‡ ๊ฐœ์˜ ํ–‰์„ ํฌํ•จํ• ์ง€๋ฅผ ์ง€์ •.

์˜ˆ์‹œ

SELECT
    employee_id,
    department_id,
    salary,
    SUM(salary) OVER (PARTITION BY department_id) as dept_total_salary,
    AVG(salary) OVER (PARTITION BY department_id) as avg_salary,
    MAX(salary) OVER (PARTITION BY department_id) as max_salary,
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as rank
FROM employees;




JOIN

-- INNER JOIN: TB1๊ณผ TB2์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ ๋ฐ˜ํ™˜.
SELECT * 
FROM TB1 JOIN TB2 
ON TB1.NAME = TB2.NAME;


-- LEFT OUTER JOIN: TB1์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์™€, ์กฐ๊ฑด์— ๋งž๋Š” TB2์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜. 
-- TB2์— ๋งค์นญ๋˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ NULL ๊ฐ’์„ ๋ฐ˜ํ™˜.
SELECT * 
FROM TB1 LEFT OUTER JOIN TB2 
ON TB1.NAME = TB2.NAME;


-- RIGHT OUTER JOIN: TB2์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์™€, ์กฐ๊ฑด์— ๋งž๋Š” TB1์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜. 
-- TB1์— ๋งค์นญ๋˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ NULL ๊ฐ’์„ ๋ฐ˜ํ™˜.
SELECT * 
FROM TB1 RIGHT OUTER JOIN TB2 
ON TB1.NAME = TB2.NAME;


-- FULL OUTER JOIN: TB1 ๋˜๋Š” TB2์— ์žˆ๋Š” ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜. 
-- ์กฐ๊ฑด์— ๋งž๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ปฌ๋Ÿผ์— NULL ๊ฐ’์„ ๋ฐ˜ํ™˜.
SELECT * 
FROM TB1 FULL OUTER JOIN TB2 
ON TB1.NAME = TB2.NAME;




UNION, UNION ALL, INTERSECT, MINUS

  • UNION์€ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋ฉด์„œ ๋‘ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉ.

  • UNION ALL์€ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋‘ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉ.

  • INTERSECT๋Š” ๋‘ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์˜ ๊ณตํ†ต ๋ถ€๋ถ„๋งŒ์„ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ.

  • MINUS๋Š” ํ•œ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์—์„œ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ œ์™ธํ•  ๋•Œ ์‚ฌ์šฉ.

-- UNION์€ ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์น˜๋ฉฐ ์ค‘๋ณต ์ œ๊ฑฐ
SELECT * FROM TB1
UNION         
SELECT * FROM TB2


-- UNION ALL์€ ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์น˜๋ฉฐ ์ค‘๋ณต ํฌํ•จ
SELECT * FROM TB1
UNION ALL      
SELECT * FROM TB2


-- INTERSECT๋Š” ๊ฐ ๊ฒฐ๊ณผ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ๋ฐ˜ํ™˜
SELECT * FROM TB1
INTERSECT
SELECT * FROM TB2


-- MINUS๋Š” 1๋ฒˆ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์—์„œ 2๋ฒˆ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ œ์™ธํ•œ ๋ ˆ์ฝ”๋“œ ๋ฐ˜ํ™˜
SELECT * FROM TB1
MINUS
SELECT * FROM TB2




DISTINCT๋ฅผ ์ด์šฉํ•œ ์ค‘๋ณต ์ œ๊ฑฐ

  • ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ฐ’๋“ค์„ ๋ฌถ๋Š” ๋ฐฉ์‹์€ GROUP BY๋„ ๊ฐ€๋Šฅ.
    • ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ GROUP BY๊ฐ€ DISTINCT์— ๋น„ํ•ด ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์„ ๊ฒฝ์šฐ์—๋Š” GROUP BY๋ฅผ ์“ฐ๋‚˜ DISTINCT๋ฅผ ์“ฐ๋‚˜ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.
SELECT DISTINCT JOB
FROM EMP

---

SELECT *
FROM EMP
GROUP BY JOB




GROUP BY

  • ๋ฌถ์„ ๊ธฐ์ค€์ด ๋˜๋Š” ์ปฌ๋Ÿผ์„ GROUP BY ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌถ๋Š”๋‹ค.
    • ๋ฌถ์€ ํ›„์—๋Š” ๋ฌถ์€ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅ, ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„ ๋ฌถ์€ ํ›„ โ†’ ํ•ฉ๊ณ„ or ํ‰๊ท ์„ ๊ตฌํ•˜๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉ
SELECT AVG(SAL), JOB
FROM EMP
GROUP BY JOB
ORDER BY AVG(SAL) DESC




HAVING

  • GROUP BY๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ๋ฌถ์€ ๋’ค์—๋Š” ๋ฌถ์€ ๋‚ด์šฉ์— WHERE ์‚ฌ์šฉ ๋ถˆ๊ฐ€ โ†’ HAVING ์‚ฌ์šฉ
    • GROUP BY ํ•˜๋‹จ์— HAVING ์กฐ๊ฑด ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
SELECT AVG(SAL), JOB
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) > 2500
ORDER BY AVG(SAL) DESC




WHERE - LIKE

  • ํŠน์ • ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์กฐํšŒ
SELECT * 
FROM TB1
WHERE NAME LIKE 'ํ™%' -- 'ํ™'์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ

SELECT * 
FROM TB1
WHERE NAME LIKE '%์ •์™„' -- '์ •์™„'์œผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ์—๋งŒ

SELECT * 
FROM TB1
WHERE NAME LIKE '%์ •์™„%' -- '์ •์™„'์ด ๋“ค์–ด์žˆ์„ ๊ฒฝ์šฐ




WHERE - LIKE IN

  • ์˜ค๋ผํด์—์„œ SELECT ์‹œ WHERE ์ ˆ์—์„œ REGEXP_LIKE๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด LIKE IN ์ฒ˜๋Ÿผ ๋‹ค์ค‘ LIKE๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • REGEXP_LIKE (์ปฌ๋Ÿผ๋ช…, '๊ฐ’|๊ฐ’')

  • RegExp - ์ •๊ทœํ‘œํ˜„์‹ (Regular Expression)

SELECT * 
FROM EMP
WHERE REGEXP_LIKE(ENAME, 'JA|AL|ING')




WHERE - IF ELSE

  • ORACLE์—์„œ WHERE์— IF, ELSE IF, ELSE๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” MYBATIS์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์ด์ง€๋งŒ ์ƒํ™ฉ์ด ์—ฌ์˜์น˜ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” WHERE ์ ˆ์— IF ์ฒ˜๋Ÿผ ๋„ฃ์–ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  • WHERE ((์กฐ๊ฑด1) OR (์กฐ๊ฑด2))

    • IF ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•  ๊ฑฐ๋ฉด ELSE๋ฅผ ๊ผญ ๋งŒ๋“ค๊ฑฐ๋‚˜ IF์— ํ•ด๋‹นํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์กฐ๊ฑด์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•˜์ž.
SELECT * 
FROM EMP
WHERE (
	(JOB = 'CLERK' AND SAL < 1000) OR          -- IF
	(JOB = 'PRESIDENT' AND SAL > 3000) OR      -- ELSE IF
	(1=1 AND SAL > 2900)                       -- ELSE
)




WHERE - NOT, ํŠน์ • ์กฐ๊ฑด ์ œ์™ธ ํ›„ ์กฐํšŒ

SELECT *
FROM TB1
WHERE NOT(AGE = 40 AND NAME = 'ํ™์ •์™„')




WHERE - ANY, SOME, ALL

  • ๋จผ์ € ANY์™€ SOME์€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์ธ๋ฐ ANY(๊ฐ’, ๊ฐ’, ๊ฐ’) ์ค‘์—์„œ ์กฐ๊ฑด์ด ํ•˜๋‚˜๋ผ๋„ ๋งž์œผ๋ฉด ์กฐํšŒํ•œ๋‹ค.
    • SAL > ANY(1000, 1500)์œผ๋กœ ๊ฑธ๋ฉด SAL์ด 1000 OR 1500๋ณด๋‹ค ํฌ๋ฉด ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.
-- ANY, SOME
SELECT *
FROM TB1
WHERE SAL > ANY(1000, 1500)
ORDER BY SAL

  • ALL์€ ์กฐ๊ฑด์— ๋ชจ๋‘ ๋งž์„ ๊ฒฝ์šฐ์—๋งŒ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.
    • SAL > ALL(1000, 1500)์˜ ๊ฒฝ์šฐ์—๋Š” SAL์ด 1000, 1500๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์—๋งŒ ์กฐํšŒ๋˜๊ฒŒ ๋œ๋‹ค.