๐Ÿ“š ์„œ๋ธŒ์ฟผ๋ฆฌ ํ™œ์šฉํ•˜๊ธฐ

yoondguยท2022๋…„ 5์›” 7์ผ
0

Oracle

๋ชฉ๋ก ๋ณด๊ธฐ
8/9

์„œ๋ธŒ์ฟผ๋ฆฌ(sub query)


  • ๋ฉ”์ธ ์ฟผ๋ฆฌ ๋‚ด๋ถ€์— ์ •์˜๋œ ์ฟผ๋ฆฌ
  • ๋‹ค๋ฅธ select ๋ฌธ์˜ ๋‚ด๋ถ€์— ์ •์˜๋œ select๋ฌธ

๐Ÿ’ก ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ณด๋‹ค ์กฐ์ธ์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋” ์„ฑ๋Šฅ์ด ์ข‹๊ณ  ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•  ๊ฒƒ. ๋ฌผ๋ก , ์กฐ์ธ์ด ์•„๋‹Œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ๋งŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋„ ์žˆ๋‹ค.
SQL Developer์˜ โ€˜๊ณ„ํš์„ค๋ช…โ€™ ํƒญ์—์„œ ๊ฐ ์ฟผ๋ฆฌ ๋ณ„ ์‹คํ–‰ ์ˆœ์„œ ๋ฐ ๋น„์šฉ(cost)์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ทœ๋ชจ๊ฐ€ ํด ์ˆ˜๋ก ์„ฑ๋Šฅ ํŠœ๋‹, ์ตœ์ ์˜ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๐Ÿ“Œ ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ๊ธฐ๋ณธ ํ˜•์‹๊ณผ ํŠน์ง•

  • ์„œ๋ธŒ์ฟผ๋ฆฌ ํ˜•์‹
      select column, column
      from table
      where column ์—ฐ์‚ฐ์ž (select column
                           from table)
    • ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ณณ
      • where ์ ˆ

      • having ์ ˆ

      • from ์ ˆ (์„œ๋ธŒ์ฟผ๋ฆฌ๋ณด๋‹ค๋Š” ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.)

        ๐Ÿ’ก ๋ทฐ : ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”
      • select๋ฌธ์˜ from์ ˆ ๋‚ด๋ถ€์˜ select๋ฌธ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ทฐ(๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”)๋ฅผ
        ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ์ด๋Š” ๋‚ด๋ถ€์˜ select๋ฌธ์ด ์ข…๋ฃŒ๋˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค.

      • DB์— ๋ทฐ๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘๋ฉด ๊ณ„์† ๋‚จ์•„์žˆ์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ํŠน์ง•
    • ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ , ๋ฉ”์ธ์ฟผ๋ฆฌ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.
    • ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ฒฐ๊ณผ๋Š” ๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ์กฐ๊ฑด์‹์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.
    • ์กฐ๊ฑด์‹์—์„œ, ๋น„๊ต๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์ด ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ฒฐ๊ณผ๋กœ๋งŒ ํš๋“ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
      • ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ๋น„๊ต๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์„œ๋ธŒ์ฟผ๋ฆฌ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์ 
    • ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ฐ˜๋“œ์‹œ ๊ด„ํ˜ธ๋กœ ๋ฌถ๋Š”๋‹ค.
    • ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ฒฐ๊ณผ๊ฐ€ ๋‹จ์ผํ–‰์ธ์ง€, ๋‹ค์ค‘ํ–‰์ธ์ง€์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
      • ๋‹ค์ค‘ํ–‰์ธ๋ฐ ์–ด์ฉŒ๋‹ค ํ–‰์ด ํ•˜๋‚˜๋งŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์ธ์ง€, ๋‹จ์ผํ–‰์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ“Œ ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์ข…๋ฅ˜

  • ๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ
    • ์‹คํ–‰๊ฒฐ๊ณผ๋กœ ํ•œ ํ–‰๋งŒ ๋ฐ˜ํ™˜๋œ๋‹ค. (์‹คํ–‰๊ฒฐ๊ณผ๊ฐ€ 1ํ–‰, 1์—ด์ด๋‹ค.)
  • ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ
    • ์‹คํ–‰๊ฒฐ๊ณผ๋กœ ์—ฌ๋Ÿฌ ํ–‰์ด ๋ฐ˜ํ™˜๋œ๋‹ค. (์‹คํ–‰๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ ํ–‰, 1์—ด์ด๋‹ค.)
    • ๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ, ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋น„๊ต์—ฐ์‚ฐ์ž ๊ตฌ๋ถ„
๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ
=in
<> ์˜ค๋ผํด์—์„œ๋Š” !=not in
>>any, >all
<<any <all

๐Ÿ’ก IN ์—ฐ์‚ฐ์ž๋Š” ๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ๋„ = ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋‹จ์ผํ–‰, ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ์— ์ƒ๊ด€์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
๋™๋“ฑ ๋น„๊ต์— ๋Œ€ํ•ด์„œ๋Š” = ๋ณด๋‹ค๋Š” IN์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋‹ค์ค‘์—ด ์„œ๋ธŒ์ฟผ๋ฆฌ
    • ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ๊ฐ’์ด ์กฐํšŒ์กฐ๊ฑด์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. (ํ–‰์˜ ์ˆ˜๋Š” ์ƒ๊ด€ ์—†๋‹ค.)
    • ๋‹ค์ค‘์—ด ์„œ๋ธŒ์ฟผ๋ฆฌ ํ˜•์‹
      • ๋น„๊ต ์—ฐ์‚ฐ์ž: IN, NOT IN (ํฌ๊ธฐ ๋น„๊ต ์—ฐ์‚ฐ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.)

      • ๋‘ ์ปฌ๋Ÿผ์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋™์ผํ•˜๊ฑฐ๋‚˜, ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ๋ฌต์‹œ์  ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

        select column, column, ....
          from table1 
          where (column1, column2) in (select column3, column4 
                                       from table2)
      • IN : ์•„๋ž˜ ๋‘ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ํ–‰์„ ์กฐํšŒ

        colum1=column3 and colum2=colum4

      • NOT IN : ์•„๋ž˜ ๋‘ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(ํ•˜๋‚˜๋ผ๋„ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ)๋ฅผ ์กฐํšŒ

        column1โ‰ column3 or column2โ‰ column4

        • where์ ˆ ์ขŒํ•ญ์˜ column1๊ณผ ์„œ๋ธŒ์ฟผ๋ฆฌ ๋‚ด column3์˜ ๊ฐ’์ด ๊ฐ™์€ ๊ฒฝ์šฐ
        • where์ ˆ ์ขŒํ•ญ์˜ column2๊ณผ ์„œ๋ธŒ์ฟผ๋ฆฌ ๋‚ด column4์˜ ๊ฐ’์ด ๊ฐ™์€ ๊ฒฝ์šฐ

์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ํ™œ์šฉ


๐Ÿ“Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์กฐํšŒํ•˜๊ธฐ

๋ณต์ˆ˜ ๊ฐœ์˜ ์กฐ๊ฑด์— ๋Œ€ํ•˜์—ฌ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

-- 80๋ฒˆ ๋ถ€์„œ์—์„œ ๊ทผ๋ฌดํ•˜๊ณ , 80๋ฒˆ ๋ถ€์„œ์˜ ํ‰๊ท ๊ธ‰์—ฌ๋ณด๋‹ค ๊ธ‰์—ฌ๋ฅผ ๋งŽ์ด ๋ฐ›์€ ์ง์›์ด๊ณ , 80๋ฒˆ ๋ถ€์„œ์˜ ๊ด€๋ฆฌ์ž์™€ ๊ฐ™์€ ํ•ด์— ์ž…์‚ฌํ•œ ์ง์›์„ ์กฐํšŒํ•˜๊ธฐ
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
AND SALARY > (SELECT AVG(SALARY)
              FROM EMPLOYEES
              WHERE DEPARTMENT_ID = 80)
AND TO_CHAR(HIRE_DATE, 'YYYY') = (SELECT TO_CHAR(E.HIRE_DATE, 'YYYY')
                                 FROM EMPLOYEES E, DEPARTMENTS D
                                 WHERE E.EMPLOYEE_ID = D.MANAGER_ID
                                 AND D.DEPARTMENT_ID = 80);

๐Ÿ“Œ HAVING์ ˆ์—์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

๋‹ค์ค‘ํ–‰ ํ•จ์ˆ˜์˜ ์ค‘์ฒฉ์€ SELECT์ ˆ์—์„œ๋งŒ ํ—ˆ์šฉ๋œ๋‹ค.

๋”ฐ๋ผ์„œ HAVING COUNT(*) = MAX(COUNT(*))๋ผ๊ณ  ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์—†๊ณ , ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•œ๋‹ค.

SELECT JOB_ID, COUNT(*)
FROM EMPLOYEES
GROUP BY JOB_ID
HAVING COUNT(*) > 10
ORDER BY JOB_ID;

-- ์ง์ข… ๋ณ„๋กœ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ–ˆ์„ ๋•Œ ์‚ฌ์›์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ง์ข…์„ ์กฐํšŒํ•˜๊ธฐ
SELECT JOB_ID, COUNT(*) CNT
FROM EMPLOYEES
GROUP BY JOB_ID
HAVING COUNT(*) = (SELECT MAX(COUNT(*)) 
                   FROM EMPLOYEES
                   GROUP BY JOB_ID);

๐Ÿ“Œ WITH์ ˆ์—์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

WITH์ ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด SQL๋ฌธ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋˜๋Š” SQL๋ฌธ ํ˜น์€ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”๋กœ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

WITH ๊ฐ€์ƒํ…Œ์ด๋ธ”๋ณ„์นญ
AS (SELECT ์ปฌ๋Ÿผ๋ช…1, ์ปฌ๋Ÿผ๋ช…2, ํ‘œํ˜„์‹ ๋ณ„์นญ1, ํ‘œํ˜„์‹ ๋ณ„์นญ2
     FROM ํ…Œ์ด๋ธ”๋ช…
     WHERE ์กฐ๊ฑด์‹)
 SELECT ์ปฌ๋Ÿผ๋ช…1, ์ปฌ๋Ÿผ๋ช…2, ๋ณ„์นญ1, ๋ณ„์นญ2
 FROM ๊ฐ€์ƒํ…Œ์ด๋ธ”๋ณ„์นญ

-- ์ง์ข… ๋ณ„๋กœ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ–ˆ์„ ๋•Œ ์‚ฌ์›์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ง์ข…์„ ์กฐํšŒํ•˜๊ธฐ
-- ์œ„์˜ SQL์„ WITH์ ˆ์„ ์‚ฌ์šฉํ•ด์„œ ๋ณ€๊ฒฝํ•˜๊ธฐ
WITH JOB_EMPS   -- SELECT๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”๋กœ ์ง€์ •. ์—ฌ๋Ÿฌ ๊ฐ€์ƒ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
AS (SELECT JOB_ID, COUNT(*) CNT
    FROM EMPLOYEES
    GROUP BY JOB_ID)
SELECT JOB_ID, CNT
FROM JOB_EMPS
WHERE CNT = (SELECT MAX(CNT)
            FROM JOB_EMPS);

๐Ÿ“Œ ์˜์‚ฌ์ปฌ๋Ÿผ(Pseudo Columns)์—์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

  • ์˜์‚ฌ์ปฌ๋Ÿผ์€ ์‹ค์ œ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜์–ด์žˆ์ง€ ์•Š์€ ์ปฌ๋Ÿผ์ด๋‹ค.
  • ์˜์‚ฌ์ปฌ๋Ÿผ์€ SQL์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปฌ๋Ÿผ์ด๋‹ค.
    • ROWNUM: ์˜์‚ฌ์ปฌ๋Ÿผ ์ค‘ ํ•˜๋‚˜๋กœ, ์กฐํšŒ ๊ฒฐ๊ณผ์˜ ๊ฐ ํ–‰์— ์ˆœ์„œ๋Œ€๋กœ 1๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ์ˆœ๋ฒˆ์„ ๋ถ™์—ฌ์ฃผ๋Š” ์ปฌ๋Ÿผ
-- ์ง์ข… ๋ณ„๋กœ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ–ˆ์„ ๋•Œ ์‚ฌ์›์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ง์ข…์„ ์กฐํšŒํ•˜๊ธฐ
-- ์˜์‚ฌ์นผ๋Ÿผ ROWNUM์˜ ์ˆœ๋ฒˆ์„ ์ด์šฉํ•ด์„œ ์กฐํšŒํ•˜๊ธฐ. ์ˆœ๋ฒˆ์ด 1๋ฒˆ์ธ ํ–‰์ด ์‚ฌ์›์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ง์ข…์˜ ํ–‰์ด๋‹ค.
SELECT JOB_ID, CNT
FROM (SELECT JOB_ID, COUNT(*) CNT
     FROM EMPLOYEES
     GROUP BY JOB_ID
     ORDER BY CNT DESC) -- ์ง์ข… ๋ณ„ ์‚ฌ์›์ˆ˜๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”
WHERE ROWNUM = 1;       -- ์กฐํšŒ๊ฒฐ๊ณผ์˜ ์ˆœ๋ฒˆ 1์ธ ํ–‰์„ ์กฐํšŒ (ROWNUM ์ปฌ๋Ÿผ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ€์ •)

0๊ฐœ์˜ ๋Œ“๊ธ€