๐Ÿ“š ์กฐ์ธ์˜ ์ข…๋ฅ˜

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

Oracle

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

์กฐ์ธ์˜ ์ข…๋ฅ˜


  • ์กฐ์ธ : 2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ
    • FROM์ ˆ์— ์—ฐ๊ฒฐํ•  ํ…Œ์ด๋ธ”๋“ค์„ ์ง€์ • ํ›„, WHERE์ ˆ์— ์กฐ์ธ์กฐ๊ฑด์„ ์ •์˜ํ•œ๋‹ค.
    • ์กฐ์ธ์กฐ๊ฑด์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜ = ์—ฐ๊ฒฐํ•œ ํ…Œ์ด๋ธ” ์ˆ˜ - 1

๐Ÿ“Œ ์กฐ์ธ์˜ ๊ธฐ๋ณธ ํ˜•์‹

(1) ๋ณ„์นญ ์—†์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

-- SELECT ํ…Œ์ด๋ธ”1.์ปฌ๋Ÿผ๋ช…, ํ…Œ์ด๋ธ”1.์ปฌ๋Ÿผ๋ช…, ํ…Œ์ด๋ธ”2.์ปฌ๋Ÿผ๋ช…, ํ…Œ์ด๋ธ”2.์ปฌ๋Ÿผ๋ช…
-- FROM ํ…Œ์ด๋ธ”1, ํ…Œ์ด๋ธ”2
-- WHERE ํ…Œ์ด๋ธ”1.์ปฌ๋Ÿผ๋ช… = ํ…Œ์ด๋ธ”2.์ปฌ๋Ÿผ๋ช…;

(2) FROM์ ˆ์—์„œ ์ •ํ•œ ํ…Œ์ด๋ธ”์˜ ๋ณ„์นญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

-- SELECT ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช…
-- FROM ํ…Œ์ด๋ธ”1 ๋ณ„์นญ1, ํ…Œ์ด๋ธ”2 ๋ณ„์นญ2
-- WHERE ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช… = ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช…;

(3) 2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”๋ผ๋ฆฌ ์กฐ์ธํ•  ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์กฐ์ธ ์กฐ๊ฑด ๊ด€๊ณ„๋Š” ๋‹ค์–‘ํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

-- SELECT ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ3.์ปฌ๋Ÿผ๋ช…
-- FROM ํ…Œ์ด๋ธ”1 ๋ณ„์นญ1, ํ…Œ์ด๋ธ”2 ๋ณ„์นญ2, ํ…Œ์ด๋ธ”3 ๋ณ„์นญ3
-- WHERE ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช… = ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช…
-- AND ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช… = ๋ณ„์นญ3.์ปฌ๋Ÿผ๋ช…;

-- SELECT ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช…, ๋ณ„์นญ3.์ปฌ๋Ÿผ๋ช…
-- FROM ํ…Œ์ด๋ธ”1 ๋ณ„์นญ1, ํ…Œ์ด๋ธ”2 ๋ณ„์นญ2, ํ…Œ์ด๋ธ”3 ๋ณ„์นญ3
-- WHERE ๋ณ„์นญ1.์ปฌ๋Ÿผ๋ช… = ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช…
-- AND ๋ณ„์นญ2.์ปฌ๋Ÿผ๋ช… = ๋ณ„์นญ3.์ปฌ๋Ÿผ๋ช…;   

๐Ÿ“Œ ์กฐ์ธ์˜ ์ข…๋ฅ˜

  • ์นดํ‹ฐ์…˜๊ณฑ
    • ์นดํ‹ฐ์…˜๊ณฑ์€ ์กฐ์ธ์กฐ๊ฑด์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ , ๋‘ ๊ฐœ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ์กฐ์ธ์กฐ๊ฑด์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์กฐ์ธ๋œ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ๊ฐ€์ ธ์˜ค๊ฒŒ๋œ๋‹ค.
    • ์ด๋Ÿฐ ๊ฒฝ์šฐ ์กฐ์ธ ์ž‘์—…์— ์ฐธ์กฐ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ํ–‰์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ณฑํ•œ ๊ฐ’๋งŒํผ์˜ ํ–‰์ด ์กฐํšŒ๊ฒฐ๊ณผ๊ฐ€ ๋œ๋‹ค.
    • ANSI SQL์—์„œ๋Š” CROSS JOIN์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ๋“ฑ๊ฐ€ ์กฐ์ธ
    • ์กฐ์ธํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์ปฌ๋Ÿผ๊ฐ’์ด ์„œ๋กœ ๊ฐ™์€ ๊ฒƒ๋ผ๋ฆฌ ์กฐ์ธํ•ด์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ โ‡’ ์†์„ฑ์˜ ๊ฐ’์ด ๊ฐ™์€ ํ–‰๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•œ๋‹ค.
-- ๊ธ‰์—ฌ๋ฅผ 10000 ์ด์ƒ ๋ฐ›๋Š” ์ง์›์˜ ์•„์ด๋””, ์ด๋ฆ„, ์ง์ข…์•„์ด๋””, ์ง์ข…์ œ๋ชฉ, ์ตœ์ €๊ธ‰์—ฌ, ์ตœ๊ณ ๊ธ‰์—ฌ, ๊ธ‰์—ฌ๋ฅผ ์กฐํšŒํ•˜๊ธฐ
--                      EMPLOYEES  EMPLOYEES  EMPLOYEES
--                                            JOBS     JOBS   JOBS   JOBS   EMPLOYEES  
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, E.JOB_ID, J.JOB_TITLE, J.MAX_SALARY, J.MIN_SALARY, E.SALARY
FROM EMPLOYEES E, JOBS J    
WHERE E.SALARY >= 10000 -- ๊ฒ€์ƒ‰์กฐ๊ฑด
AND E.JOB_ID = J.JOB_ID -- ์กฐ์ธ์กฐ๊ฑด
ORDER BY E.EMPLOYEE_ID;

  • ๋น„๋“ฑ๊ฐ€ ์กฐ์ธ
    • ์ดํ€„ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์กฐ์ธํ•œ๋‹ค.
    • ์ฃผ๋กœ ๊ตฌ๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋“ฑ๊ธ‰์„ ํŒ์ •ํ•˜์—ฌ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
      • ๊ตฌ๊ฐ„์— ๋Œ€ํ•œ ์กฐ๊ฑด์‹์„ ๋น„๋“ฑ๊ฐ€ ์กฐ์ธ์กฐ๊ฑด์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.
-- ๊ธ‰์—ฌ๊ฐ€ 10000 ์ด์ƒ์ธ ์ง์›๋“ค์˜ ์ง์› ์•„์ด๋””, ์ด๋ฆ„, ๊ธ‰์—ฌ, ๊ธ‰์—ฌ๋“ฑ๊ธ‰ ์กฐํšŒํ•˜๊ธฐ
-- ๊ธ‰์—ฌ์— ๋Œ€ํ•œ ์กฐํšŒ์กฐ๊ฑด์ด ๊ธ‰์—ฌ๋“ฑ๊ธ‰๊ณผ ๋งž์•„๋–จ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.
-- ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋ผ, ๋ฒ”์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋“ค์„ ์กฐํšŒํ•  ๊ฒƒ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ๋น„๋“ฑ๊ฐ€์กฐ์ธ์„ ํ™œ์šฉํ•œ๋‹ค.
-- E                                E      E    E       S
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, E.SALARY, S.GRADE
FROM EMPLOYEES E, SALARY_GRADE S
WHERE E.SALARY >= 10000
AND E.SALARY >= S.MIN_SALARY AND E.SALARY <= S.MAX_SALARY -- ๋น„๋“ฑ๊ฐ€ ์กฐ์ธ์กฐ๊ฑด
ORDER BY E.EMPLOYEE_ID;

  • ์…€ํ”„ ์กฐ์ธ (์ž์ฒด ์กฐ์ธ)
    • ํ…Œ์ด๋ธ” ํ•œ ๊ฐœ๋กœ ์กฐ์ธ์„ ํ•˜๋Š” ๊ฒƒ. ์ž๊ธฐ ์ž์‹ ๊ณผ ์กฐ์ธํ•œ๋‹ค.
      • ๊ฐ™์€ ํ…Œ์ด๋ธ”์„ 2๊ฐœ ์ค€๋น„ํ•˜๊ณ , ํ•˜๋‚˜๋Š” ์ž์‹๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”, ํ•˜๋‚˜๋Š” ๋ถ€๋ชจ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”๋กœ ์—ญํ• ์„ ๋‚˜๋ˆˆ๋‹ค.
      • ๋ถ€๋ชจ๋ ˆ์ฝ”๋“œ-์ž์‹๋ ˆ์ฝ”๋“œ๋Š” ์ผ๋Œ€๋‹ค์˜ ๊ด€๊ณ„์ด๋‹ค.
    • ์ž๊ธฐ ์ž์‹ ์˜ ์†์„ฑ์„ ์Šค์Šค๋กœ ์ฐธ์กฐํ•˜๋Š” ํ˜•ํƒœ์˜ ํ…Œ์ด๋ธ”์—์„œ ์…€ํ”„ ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ™์€ ํ…Œ์ด๋ธ”์ด์ง€๋งŒ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ๋ณ„์นญ์„ ์ง“๊ณ  ์กฐ์ธ์กฐ๊ฑด์„ ์ž‘์„ฑํ•œ๋‹ค.
      • ์กฐํšŒ๊ฒฐ๊ณผ์—์„œ ์ปฌ๋Ÿผ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์กด์žฌํ•˜๋ฏ€๋กœ ์ด๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ผญ ๋ณ„์นญ์„ ์จ์•ผ ํ•œ๋‹ค. ( ex EMP.EMPLOYEE_ID EMP_ID, MNG.EMPLOYEE_ID MNG_ID )
-- ๊ธ‰์—ฌ๊ฐ€ 10000 ์ด์ƒ์ธ ์ง์›๋“ค์˜ ์ง์› ์•„์ด๋””, ์ด๋ฆ„, ๊ธ‰์—ฌ, ๊ธ‰์—ฌ๋“ฑ๊ธ‰ ์กฐํšŒํ•˜๊ธฐ
-- ๊ธ‰์—ฌ์— ๋Œ€ํ•œ ์กฐํšŒ์กฐ๊ฑด์ด ๊ธ‰์—ฌ๋“ฑ๊ธ‰๊ณผ ๋งž์•„๋–จ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.
-- ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋ผ, ๋ฒ”์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋“ค์„ ์กฐํšŒํ•  ๊ฒƒ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ๋น„๋“ฑ๊ฐ€์กฐ์ธ์„ ํ™œ์šฉํ•œ๋‹ค.
-- E                                E      E    E       S
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, E.SALARY, S.GRADE
FROM EMPLOYEES E, SALARY_GRADE S
WHERE E.SALARY >= 10000
AND E.SALARY >= S.MIN_SALARY AND E.SALARY <= S.MAX_SALARY -- ๋น„๋“ฑ๊ฐ€ ์กฐ์ธ์กฐ๊ฑด
ORDER BY E.EMPLOYEE_ID;

  • ํฌ๊ด„ ์กฐ์ธ (Outer ์กฐ์ธ)
    • ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ–ˆ์„ ๋•Œ ์—ฐ๊ฒฐ๋˜๋Š” ํ–‰์ด ์—†๋Š” ์ •๋ณด๋„ ์กฐ์ธ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์กฐ์ธ
      • (+)๊ธฐํ˜ธ๋Š” ์—ฐ๊ฒฐ๋˜๋Š” ์ƒ๋Œ€๊ฐ€ ์—†๋Š” ํ–‰๋„ ์กฐ์ธ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก, ์ƒ๋Œ€ ํ…Œ์ด๋ธ”์— NULLํ–‰์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
      • ํ–‰์ด ๋ถ€์กฑํ•œ ์ชฝ์— (+)๋ฅผ ๋ถ™์ธ๋‹ค.
-- ์‚ฌ์›์•„์ด๋””, ์‚ฌ์›์ด๋ฆ„, ํ•ด๋‹น ์‚ฌ์—…์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ด€๋ฆฌ์ž ์•„์ด๋””, ๊ด€๋ฆฌ์ž ์ด๋ฆ„์„ ์กฐํšŒํ•˜๊ธฐ
--    E1          E2                  E3                  E
SELECT EMP.EMPLOYEE_ID EMP_ID,
        EMP.FIRST_NAME EMP_NAME,
        MGR.EMPLOYEE_ID MRG_ID,
        MGR.FIRST_NAME MGR_NAME
FROM EMPLOYEES EMP, EMPLOYEES MGR -- ์‚ฌ์›์ •๋ณด ์—ญํ• ์„ ํ•˜๋Š” EMP, ๊ด€๋ฆฌ์ž์ธ ์‚ฌ์›์ •๋ณด ์—ญํ• ์„ ํ•˜๋Š” MGR
WHERE EMP.MANAGER_ID = MGR.EMPLOYEE_ID 
ORDER BY EMP_ID;

-- ์ง์ข… ์•„์ด๋””, ์ง์ข… ์ตœ์ €๊ธ‰์—ฌ, ์ง์ข…์ตœ์ €๊ธ‰์—ฌ์˜ ๋“ฑ๊ธ‰, ์ง์ข… ์ตœ๊ณ ๊ธ‰์—ฌ, ์ง์ข… ์ตœ๊ณ ๊ธ‰์—ฌ์˜ ๋“ฑ๊ธ‰ ***(๊ฐ™์€ ํ…Œ์ด๋ธ” ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•˜๊ธฐ)
--      J           J               S1               J               S2
-- ๊ธ‰์—ฌ ๋“ฑ๊ธ‰ํ…Œ์ด๋ธ”์ด 2๊ฐœ ํ•„์š”ํ•˜๋‹ค. (์ตœ์ €๊ธ‰์—ฌ, ์ตœ๊ณ ๊ธ‰์—ฌ์™€ ์กฐ์ธํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ฐ๊ฐ ํ…Œ์ด๋ธ” 2๊ฐœ.)
SELECT J.JOB_ID, J.MIN_SALARY, S1.GRADE MIN_GRADE, J.MAX_SALARY, S2.GRADE MAX_GRADE
FROM JOBS J, SALARY_GRADE S1, SALARY_GRADE S2
WHERE (J.MIN_SALARY >= S1.MIN_SALARY AND J.MIN_SALARY <= S1.MAX_SALARY)
AND (J.MAX_SALARY >= S2.MIN_SALARY AND J.MAX_SALARY <= S2.MAX_SALARY)
ORDER BY J.JOB_ID;

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