Computer Science ๐Ÿ“š/SQLD

[SQLD] 2๊ณผ๋ชฉ - 1์žฅ. SQL ๊ธฐ๋ณธ

leejaejae 2024. 11. 18. 18:04

์ œ 1์ ˆ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ์š”

1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ •ํ•œ ํ˜•ํƒœ๋กœ ์ €์žฅํ•ด ๋†“์€ ๊ฒƒ
  • ๊ณ„์ธตํ˜• DB: ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋ฐ์ดํ„ฐ ์ €์žฅ (1:N)
  • ๋„คํŠธ์›Œํฌํ˜• DB: ์˜ค๋„ˆ์™€ ๋ฉค๋ฒ„ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ (M:N)
  • ๊ด€๊ณ„ํ˜• DB: ์ง‘ํ•ฉ ์—ฐ์‚ฐ๊ณผ ๊ด€๊ณ„ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ

2. ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (RDB: Relational Databae)

  • ํŒŒ์ผ ์‹œ์Šคํ…œ ๋‹จ์ : ๋™์‹œ์— ์‚ฝ์ž…/์ˆ˜์ •/์‚ญ์ œ ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค๊ณ  ๋ณต์‚ฌ๋ณธ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ์ผ์น˜์„ฑ์˜ ๋ฐœ์ƒ
  • RDB ์žฅ์ : ์ •๊ทœํ™”๋ฅผ ํ†ตํ•ด ์ด์ƒ ํ˜„์ƒ๊ณผ ์ค‘๋ณต์ œ๊ฑฐ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ, ๋ฐ์ดํ„ฐ ํšŒ๋ณต/๋ณต๊ตฌ ๊ฐ€๋Šฅ, ๋ณ‘ํ–‰ ์ œ์–ด, ๋™์‹œ์„ฑ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ณต์œ , ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ๋ฐฉ๋ฒ• ๋“ฑ ์ฒด๊ณ„ํ™”

3. SQL ๋ฌธ์žฅ๋“ค์˜ ์ข…๋ฅ˜

  • SQL: ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ ์ •์˜/์กฐ์ž‘/์ œ์–ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด
๋ช…๋ น์–ด ์ข…๋ฅ˜ ๋ช…๋ น์–ด ์„ค๋ช…
๋ฐ์ดํ„ฐ ์กฐ์ž‘์–ด(DML) SELECT
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋“ค์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด
  • RETRIEVE ๋ผ๊ณ ๋„ ํ•จ
INSERT
UPDATE
DELETE
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ๋“ค์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ๋ณ€ํ˜•์„ ๊ฐ€ํ•˜๋Š” ๋ช…๋ น์–ด
  • ex) ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ ์ง‘์–ด ๋„ฃ๊ธฐ, ๋ฐ์ดํ„ฐ ์‚ญ์ œ.์ˆ˜์ •
๋ฐ์ดํ„ฐ ์ •์˜์–ด(DDL) CREATE
ALTER
DROP
RENAME
  • ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด
  • ๊ตฌ์กฐ ์ƒ์„ฑ, ๋ณ€๊ฒฝ, ์‚ญ์ œ, ์ด๋ฆ„ ๋ฐ”๊พธ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๊ด€๋ จ๋œ ๋ช…๋ น์–ด
๋ฐ์ดํ„ฐ ์ œ์–ด์–ด(DCL) GRANT
REVOKE
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ณ  ๊ฐ์ฒด๋“ค์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒํ•œ์„ ์ฃผ๊ณ  ํšŒ์ˆ˜ํ•˜๋Š” ๋ช…๋ น์–ด
ํŠธ๋žœ์žญ์…˜ ์ œ์–ด์–ด(TCL) COMMIT
ROLLBACK
  • ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—…์˜ ๋‹จ์œ„๋ฅผ ๋ฌถ์— DML์— ์˜ํ•ด ์กฐ์ž‘๋œ ๊ฒฐ๊ณผ๋ฅผ ์ž‘์—…๋‹จ์œ„(ํŠธ๋žœ์žญ์…˜) ๋ณ„๋กœ ์ œ์–ดํ•˜๋Š” ๋ช…๋ น์–ด

4. ํ…Œ์ด๋ธ”: RDB์˜ ๊ธฐ๋ณธ ๋‹จ์œ„, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด, ์นผ๋Ÿผ๊ณผ ํ–‰์˜ 2์ฐจ์› ๊ตฌ์กฐ

์šฉ์–ด ์„ค๋ช…
ํ…Œ์ด๋ธ” ํ–‰๊ณผ ์นผ๋Ÿผ์˜ 2์ฐจ์› ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ์žฅ์†Œ, ๋ฐ๋ฒ ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์ž„
์นผ๋Ÿผ/์—ด 2์ฐจ์› ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์—์„œ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•˜๋‚˜ํ•˜๋‚˜์˜ ํŠน์„ฑ ์†์„ฑ(๋” ์ด์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Œ)
ํ–‰ (Row) 2์ฐจ์› ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”๋กœ์—์„œ ๊ฐ€๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ

5. ERD (Entity Relationship Diagram)

  • ๊ด€๊ณ„์˜ ์˜๋ฏธ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ
  • ๊ตฌ์„ฑ์š”์†Œ: ์—”ํ„ฐํ‹ฐ(Entity), ๊ด€๊ณ„(Relationship), ์†์„ฑ(Attribute) 3๊ฐ€์ง€
  • ํ‘œ๊ธฐ๋ฒ•: IE, Barker

 

์ œ 2์ ˆ SELECT๋ฌธ

1. SELECT ๋ž€?

  • ํ…Œ์ด๋ธ”์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•

  • SELECT CUST_ID, CUST_NAME, BIRTH_DAY
    FROM TB_CUST ๊ณ ๊ฐ ์ •๋ณด ํ…Œ์ด๋ธ”
    WHERE MONEY = 10000; ํ•„ํ„ฐ๋ง
  • TB_CUST ํ…Œ์ด๋ธ”์—์„œ (FROM) ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒ ์Œ
    TB_CUST ํ…Œ์ด๋ธ”์—์„œ MONEY (๋ณด์œ ๊ธˆ์•ก)์ด 10000์ธ ํŠœํ”Œ(ํ–‰)๋งŒ ๊ฐ€์ ธ์˜ค๊ฒ ์Œ
    ์ถœ๋ ฅ๋˜๋Š” ํŠœํ”Œ(ํ–‰)์— ๋Œ€ํ•ด CUST_IS, CUST_NAME, BIRTH_DAY ์ปฌ๋Ÿผ(์—ด)๋งŒ ๊ฐ€์ ธ์˜ค๊ฒ ์Œ

2. SELECT * FROM TB_PRO;

  • TB_PRO ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•จ
  • * ํ•˜๋‚˜๋งŒ ์จ๋„ ๋ชจ๋“  ์ปฌ๋Ÿผ ํ‘œํ˜„

3. SELECT DISTINCT PRO_TYPE FROM TB_PRD;

  • TB_PRD ํ…Œ์ด๋ธ”์˜ PRD_TYPE ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ์ค‘๋ณต์—†์ด(๋‹จ ํ•˜๋‚˜์˜) ์ถœ๋ ฅ

4. AS

  • SELECT ๋ถ€๋ถ„์—์„œ ์ถœ๋ ฅํ•˜๋ ค๋Š” ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ๋ณ„๋ช… (ALIAS)์„ ๋ถ€์—ฌ, ์ฆ‰ ์ปฌ๋Ÿผ๋ช…์„ ์ด๊ฑธ๋กœ ํ•˜๊ฒ ์Œ
  • ์ฃผ์˜! ๋„์–ด์“ฐ๊ธฐ ๋ถˆ๊ฐ€, ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผํ•จ, ์˜ˆ์•ฝ์–ด ๋ถˆ๊ฐ€๋Šฅ, ๊ฐ€๋Šฅ ํŠน์ˆ˜๋ฌธ์ž($, _, #)

5. SELECT ์‚ฌ์น™์—ฐ์‚ฐ : =, -, X, /

6. SELECT์—์„œ ์—ฐ๊ฒฐ ์—ฐ์‚ฐ (||): ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ, ๋ฌธ์ž์—ด์—์„œ๋Š” ‘ ‘์‚ฌ์šฉ(“ “ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜ ๋‚จ) 

7. SELECT ๋ฌธ ์‹คํ–‰ ์ˆœ์„œ(FWGHS)

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT ORDER BY

 

์ œ 3์ ˆ ํ•จ์ˆ˜

1. ๋‚ด์žฅํ•จ์ˆ˜(Built-in Function)

  • ๋ฒคํ„ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜์ธ ๋‚ด์žฅ ํ•จ์ˆ˜(Built-in Function)
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜(User Defined Function)

  • SQL์„ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ  ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๊ฐ„ํŽธ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ๋“ค์€ ์ด๋ฆ„/ํ‘œ๊ธฐ๋ฒ•์ด ๋‹ฌ๋ผ๋„ ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ๋ฒ ๊ฐ€ ๊ณตํ†ต์ ์œผ๋กœ ์ œ๊ณต
  • ๋‚ด์žฅํ•จ์ˆ˜๋Š” ๋‹ค์‹œ ํ•จ์ˆ˜์˜ ์ž…๋ ฅ ๊ฐ’์— ๋”ฐ๋ผ ๋‹จ์ผํ–‰ ํ•จ์ˆ˜ / ๋‹ค์ค‘ํ–‰ ํ•จ์ˆ˜
  • ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’์ด ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ์ถœ๋ ฅ๊ฐ’์€ ํ•˜๋‚˜๋ผ๋Š” M:1 ๊ด€๊ณ„์ž„

  • ๋‹จ์ผํ–‰ ํ•จ์ˆ˜: ๋‹จ์ผ ํ–‰ ๋‚ด์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ฐ’ ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ’์ด ์ž…๋ ฅ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉ
    • ๋ฌธ์žํ˜• ํ•จ์ˆ˜, ์ˆซ์žํ˜• ํ•จ์ˆ˜, ๋‚ ์งœํ˜• ํ•จ์ˆ˜, ๋ณ€ํ™˜ํ˜• ํ•จ์ˆ˜, NULL ๊ด€๋ จ ํ•จ์ˆ˜
    • ์ถ”์ถœ๋˜๋Š” ๊ฐ ํ–‰๋งˆ๋‹ค ์ž‘์—…์„ ์ˆ˜ํ–‰
    • ๊ฐ ํ–‰๋งˆ๋‹ค ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    • SELECT, WHERE, ORDER BY, UPDATE์˜ SET์ ˆ์— ์‚ฌ์šฉ๊ฐ€๋Šฅ
    • ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
    • ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • ๋ฌธ์žํ˜• ํ•จ์ˆ˜
      • LOWER(๋ฌธ์ž์—ด), UPPER(๋ฌธ์ž์—ด), ASCII(๋ฌธ์ž์—ด), LENFTH/LEN(๋ฌธ์ž์—ด), CONCAT(๋ฌธ์ž์—ด1, ๋ฌธ์ž์—ด2)
      • CHR/CHAR(ASCII ๋ฒˆํ˜ธ): ASCII ์ฝ”๋“œ ๋ฒˆํ˜ธ๋ฅผ ๋ฌธ์ž๋‚˜ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์คŒ 
        ex: CHR(65) / CHAR(65) → ‘A’
      • SUBSTR/SUBSTRING(๋ฌธ์ž์—ด, m[, n]): ๋ฌธ์ž์—ด ์ค‘ m์œ„์น˜์—์„œ n๊ฐœ์˜ ๋ฌธ์ž ๊ธธ์ด์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž ๋Œ๋ ค์คŒ, n์ด ์ƒ๋žต ๋˜๋ฉด ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๊นŒ์ง€์ž„
        ex: SUBSTR(“hello”, 3, 2) / SUBSTRING(“hello”, 3, 2) → ‘ll’
      • LTRIM(๋ฌธ์ž์—ด [, ์ง€์ •๋ฌธ์ž]): ๋ฌธ์ž์—ด์˜ ์ฒซ ๋ฌธ์ž๋ถ€ํ„ฐ ํ™•์ธํ•ด ์ง€์ • ๋ฌธ์ž๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ํ•ด๋‹น ๋ฌธ์ž ์ œ๊ฑฐ(์ง€์ • ๋ฌธ์ž๊ฐ€ ์ƒ๋žต๋˜๋ฉด ๊ณต๋ฐฑ ๊ฐ’์ด ๋””ํดํŠธ), SQL Server์—์„œ๋Š” ์ง€์ •๋ฌธ์ž ์‚ฌ์šฉX(๊ณต๋ฐฑ๋งŒ ์ œ๊ฑฐ ๊ฐ€๋Šฅ)
        ex: LTRIM(‘xxxYYZZxYZ’, ‘x’) → ‘YYZZxYZ’
      • RTRIM(๋ฌธ์ž์—ด [, ์ง€์ •๋ฌธ์ž]): ๋ฌธ์ž์—ด ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋ถ€ํ„ฐ ํ™•์ธํ•ด ์ง€์ • ๋ฌธ์ž ๋‚˜ํƒ€๋‚˜๋Š” ๋™์•ˆ ํ•ด๋‹น ๋ฌธ์ž ์ œ๊ฑฐ(์ง€์ • ๋ฌธ์ž ์ƒ๋žต๋˜๋ฉด ๊ณต๋ฐฑ), SQL Server์—์„œ๋Š” ์ง€์ •๋ฌธ์ž ์‚ฌ์šฉX(๊ณต๋ฐฑ๋งŒ ์ œ๊ฑฐ ๊ฐ€๋Šฅ)
        ex: RTRIM(‘XXYYzzXYzz’, ‘z’) → ‘XXYYzzXY’
      • TRIM([leading|trailing|both ์ง€์ •๋ฌธ์ž FROM ๋ฌธ์ž์—ด): ๋จธ๋ฆฌ๋ง, ๊ผฌ๋ฆฌ๋ง, ๋˜๋Š” ์–‘์ชฝ ์ง€์ • ๋ฌธ์ž ์ œ๊ฑฐ(leading | trailing | both๊ฐ€ ์ƒ๋žต๋˜๋ฉด both๊ฐ€ ๋””ํดํŠธ), SQL Server์—์„œ๋Š” ์ง€์ •๋ฌธ์ž ์‚ฌ์šฉX(๊ณต๋ฐฑ๋งŒ ์ œ๊ฑฐ ๊ฐ€๋Šฅ)
      • TRIM(‘x’ FROM ‘xxYYZZxYZxx’) → ‘YYZZxYZ
    • ์ˆซ์žํ˜• ํ•จ์ˆ˜
      • ABS(์ˆซ์ž), ROUND(์ˆซ์ž [, m])
      • SIGN(์ˆซ์ž): ์ˆซ์ž ์–‘์ˆ˜, ์Œ์ˆ˜, 0์ธ์ง€ ๊ตฌ๋ณ„ (ex: SIGN(-20), SIGN(20), SIGN(0) → -1, 1, 0)
      • MOD(์ˆซ์ž1, ์ˆซ์ž2): ์ˆซ์ž1์„ ์ˆซ์ž2๋กœ ๋‚˜๋ˆ  ๋‚˜๋จธ์ง€ ๊ฐ’ ๋ฆฌํ„ด(%์—ฐ์‚ฐ์ž๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ)
        ex: MOD(7,3) / 7%3 → 1
      • CEIL/CEILING(์ˆซ์ž): ์ˆซ์ž๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์ตœ์†Œ ์ •์†Œ ๋ฆฌํ„ด
        ex: CEIL(38.123) / CEILING(38.123) → 39 / 39
      • FLOOR(์ˆซ์ž): ์ˆซ์ž๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ตœ๋Œ€ ์ •์ˆ˜ ๋ฆฌํ„ด
        ex: FLOOR(38.123), FLOOR(-38.123) → 38, -39
      • TRUNC(์ˆซ์ž [, m]): ์ˆซ์ž๋ฅผ ์†Œ์ˆ˜ m์ž๋ฆฌ์—์„œ ์ž˜๋ผ๋ฒ„๋ฆผ, SQL ์ œ๊ณตX
        ex: TRUNC(38.5235, 3) → 38.523
      • SIN, COS, TAN,…: ์ˆซ์ž์˜ ์‚ผ๊ฐํ•จ์ˆ˜ ๊ฐ’ ๋ฆฌํ„ด
      • EXP(), POWER(), SQRT(), LOG(), LN(): ์ˆซ์ž ์ง€์ˆ˜, ๊ฑฐ๋“  ์ œ๊ณฑ, ์ œ๊ณฑ๊ทผ, ์ž์—ฐ ๋กœ๊ทธ ๊ฐ’ ๋ฆฌํ„ด
    • ๋‚ ์งœํ˜• ํ•จ์ˆ˜
      • SYSDATE / GETDATE(): ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ ์ถœ๋ ฅ
      • EXTRACT(‘YEAR’|’MONTH’|’DAY’ from d) / DATEPART(‘YEAR’|’MONTH’|’DAY’, d): ๋‚ ์งœ ๋ฐ์ดํ„ฐ์—์„œ ๋…„/์›”/์ผ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ ๊ฐ€๋Šฅ (์‹œ๊ฐ„/๋ถ„/์ดˆ๋„ ๊ฐ€๋Šฅ)
        ex) โ€จ์˜ค๋ผํด: EXTRACT(MONTH FROM HIREDATE) ์ž…์‚ฌ์›” FROM EMP;โ€จ
        SQL: SELECT ENAME, HIREDATE, DATEPART(MONTH, HIREDATE) ์ž…์‚ฌ์›” FROM EMP;
      • TO_NUMER(TO_CHAR(d, ‘YYYY’)) / YEAR(d), TO_NUMER(TO_CHAR(d, ‘MM’)) / MONTH(d),
      • TO_NUMER(TO_CHAR(d, ‘DD’)) / DAY(d): ์œ„์—๋ž‘ ๊ฐ™์€ ๊ธฐ๋Šฅ, TO_NUMBER ์ œ์™ธ์‹œ ๋ฌธ์žํ˜•์œผ๋กœ ์ถœ๋ ฅ
      • ์—ฐ์‚ฐ
        ๋‚ ์งœ + ์ˆซ์ž = ๋‚ ์งœ ; ์ˆซ์ž๋งŒํผ์˜ ๋‚ ์ˆ˜๋ฅผ ๋‚ ์งœ์— ๋”ํ•จ
        ๋‚ ์งœ - ์ˆซ์ž = ๋‚ ์งœ ; ์ˆซ์ž๋งŒํผ์˜ ๋‚ ์ˆ˜๋ฅผ ๋‚ ์งœ์—์„œ ๋บŒ
        ๋‚ ์งœ1 - ๋‚ ์งœ2 = ๋‚ ์งœ์ˆ˜ ; ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ๋‚ ์งœ์—์„œ ํ•˜๋‚˜์˜ ๋‚ ์งœ๋ฅผ ๋นผ๋ฉด ์ผ์ˆ˜๊ฐ€ ๋‚˜์˜ด
        ๋‚ ์งœ + ์ˆซ์ž/24 = ๋‚ ์งœ ; ์‹œ๊ฐ„์„ ๋‚ ์งœ์— ๋”ํ•จ
    • ๋ณ€ํ™˜ํ˜• ํ•จ์ˆ˜
      • ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ฐ˜ํ™˜ ์ข…๋ฅ˜
        • ๋ช…์‹œ์  ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ณ€ํ™˜: ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ํ˜• ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋ณ€ํ™”ํ•˜๋„๋ก ๋ช…์‹œํ•ด ์ฃผ๋Š” ๊ฒฝ์šฐ
        • ์•”์‹œ์  ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ณ€ํ™˜: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋ณ€ํ™˜ํ•ด ๊ฒŒ์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ
        • ๋ณ€ํ™˜ํ˜• ํ•จ์ˆ˜ ์ข…๋ฅ˜
        • ์˜ค๋ผํด
          TO_NUMER(๋ฌธ์ž์—ด): alphanumeric ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜
          TO_CHAR(์ˆซ์ž|๋‚ ์งœ [, FORMAT]): ์ˆซ์ž๋‚˜ ๋‚ ์งœ๋ฅผ ์ฃผ์–ด์ง„ FORMAT ํ˜•ํƒœ๋กœ ๋ฌธ์ž์—ด ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜
          TO_DATE(๋ฌธ์ž์—ด [, FORMAT]): ๋ฌธ์ž์—ด์„ ์ฃผ์–ด์ง„ FORMAT ํ˜•ํƒœ๋กœ ๋‚ ์งœ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜
        • SQL
          CAST (expression AS data_type [(length)]): expression ์„ ๋ชฉํ‘œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜
          CONVERT (data_type [(length)], expression [, style]): expression ์„ ๋ชฉํ‘œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜
    • NULL ๊ด€๋ จ ํ•จ์ˆ˜
      • NVL(ํ‘œํ˜„์‹ 1, ํ‘œํ˜„์‹ 2) / ISNULL(ํ‘œํ˜„์‹1, ํ‘œํ˜„์‹2): ํ‘œํ˜„์‹ 1์˜ ๊ฒฐ๊ณผ๊ฐ€ NULL์ด๋ฉด ํ‘œํ˜„์‹2 ๊ฐ’ ์ถœ๋ ฅ, ํ‘œํ˜„์‹1๊ณผ ํ‘œํ˜„์‹2์˜ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๊ฐ™์•„์•ผ ํ•จ, ๊ฒฐ๊ณผ๊ฐ’์„ NULL์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์„ ์–ป๊ณ ์ž ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
      • NULLIF(ํ‘œํ˜„์‹1, ํ‘œํ˜„์‹2): ํ‘œํ˜„์‹1์ด ํ‘œํ˜„์‹2์™€ ๊ฐ™์œผ๋ฉด NULL, ๋‹ค๋ฅด๋ฉด ํ‘œํ˜„์‹1 ๋ฆฌํ„ด
      • CONALESCE(ํ‘œํ˜„์‹1, ํ‘œํ˜„์‹2,…): ์ž„์˜์˜ ๊ฐœ์ˆ˜ ํ‘œํ˜„์‹์—์„œ NULL์ด ์•„๋‹Œ ์ตœ์ดˆ์˜ ํ‘œํ˜„์‹, ์ธ์ˆ˜ ์ˆซ์ž ํ•œ์ •X, ์ž„์˜์˜ ๊ฐœ์ˆ˜ EXPR์—์„œ NULL์ด ์•„๋‹Œ ์ตœ์ดˆ์˜ EXPR ๋‚˜ํƒ€๋ƒ„(๋งŒ์•ฝ ๋ชจ๋“  EXPR์ด NULL์ด๋ฉด NULL ๋ฆฌํ„ด)
      • NULL๊ณผ ๊ณต์ง‘ํ•ฉ: SELECT 1 FROM DUAL WHERE 1 = 2; ์™€ ๊ฐ™์€ ์กฐ๊ฑด์ด ๋Œ€ํ‘œ์ ์ธ ๊ณต์ง‘ํ•ฉ ๋ฐœ์ƒ ์ฟผ๋ฆฌ, ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐใ… ํ•œ ๊ฑด๋„ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณต์ง‘ํ•ฉ, NULL ๋ฐ์ดํ„ฐ์™€๋Š” ๋˜ ๋‹ค๋ฅด๊ฒŒ ์ดํ•ดํ•ด์•ผ ํ•จ

  • ๋‹ค์ค‘ํ–‰ ํ•จ์ˆ˜: ์—ฌ๋Ÿฌ ๋ ˆ์ฝ”๋“œ์˜ ๊ฐ’๋“ค์„ ์ž…๋ ฅ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉ
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ–‰์ด ์ž…๋ ฅ, ํ•˜๋‚˜์˜ ๊ฐ’ ๋ฐ˜ํ™˜
    • ์ง‘๊ณ„ํ•จ์ˆ˜๊ฐ€ ๋‹ค์ค‘ ํ–‰ ํ•จ์ˆ˜
    • SUM, AVG, MAX, MIN, COUNT ๋“ฑ

 

์ œ 4์ ˆ WHERE ์ ˆ

1. WHERE

  • ์ž์‹ ์ด ์›ํ•˜๋Š” ์ž๋ฃŒ๋งŒ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์ด์šฉ
  • WHERE ์ ˆ์— ์กฐ๊ฑด์ด ์—†๋Š” FTS(full table scan) ๋ฌธ์žฅ์€ SQL ํŠœ๋‹ 1์ฐจ ๊ฒ€ํ†  ๋Œ€์ƒ์ž„

2. WHERE ์—ฐ์‚ฐ์ž ์ข…๋ฅ˜

  • ์ฒ˜๋ฆฌ ์ˆœ์„œ: ๋ถ€์ • ์—ฐ์‚ฐ์ž ๋น„๊ต ์—ฐ์‚ฐ์ž ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž 

3. ์ฐธ๊ณ 

  • ์˜ค๋ผํด์— ‘ ‘ ์ž…๋ ฅํ•˜๋ฉด NULL๋กœ ์ž…๋ ฅ๋˜์–ด ์กฐํšŒํ•˜๋ ค๋ฉด IS NULL ์กฐ๊ฑด์œผ๋กœ ์กฐํšŒํ•˜์—ฌ์•ผ ํ•จ. SQL์—์„œ๋Š” ‘ ‘ ๋กœ ์ €์žฅ ๋ฐ ์กฐํšŒ ๊ฐ€๋Šฅ

4. CASE ํ‘œํ˜„ (IF-THEN-ELSE ๋…ผ๋ฆฌ์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹)

  • CASE ํ‘œํ˜„์€ IF-THEN-ELSE ๋…ผ๋ฆฌ์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„์‹ ์ž‘์„ฑ
  • SQL ๋น„๊ต ์—ฐ์‚ฐ ๊ธฐ๋Šฅ์„ ๋ณด์™„ํ•˜๋Š” ์—ญํ•ญ
  • ANSI/ISO ํ‘œ์ค€์—๋Š” CASE Expression์ด๋ผ๊ณ  ํ‘œ์‹œ
  • ํ•จ์ˆ˜์™€ ๊ฐ™์€ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ Oracle์˜ DECODE ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ

  • ๋‹จ์ผํ–‰ CASE ํ‘œํ˜„์˜ ์ข…๋ฅ˜
    • ๊ฒ€์ƒ‰ CASE ํ‘œํ˜„์‹: ๊ฐœ๋ณ„ ์กฐ๊ฑด ํ™•์ธํ•˜๊ณ  ๋ฐ˜ํ™˜
    • ๋‹จ์ˆœ CASE ํ‘œํ˜„์‹: ํ‘œํ˜„์‹ ๊ฐ’ ๊ธฐ์ค€, ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ํ™•์ธ
    • DECODE: ์—ฌ๋Ÿฌ ์กฐ๊ฑด ๋น„๊ตํ•˜๊ณ  ์ผ์น˜ํ•˜๋Š” ์กฐ๊ฑด์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

 

์ œ 5์ ˆ GROUP BY, HAVING ์ ˆ

1. ์ง‘๊ณ„ํ•จ์ˆ˜

  • ์—ฌ๋Ÿฌ ํ–‰๋“ค์˜ ๊ทธ๋ฃน์ด ๋ชจ์—ฌ์„œ ๊ทธ๋ฃน ๋‹น ๋‹จ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ๋‹ค์ค‘ํ–‰ ํ•จ์ˆ˜
  • GROUP BY ์ ˆ์€ ํ–‰๋“ค์„ ์†Œ๊ทธ๋ฃน
  • SELECT ์ ˆ, HAVING ์ ˆ, ORDER BY ์ ˆ์— ์‚ฌ์šฉ

  • ์ง‘๊ณ„ํ•จ์ˆ˜๋ช… (ALL | Distinct ์นผ๋Ÿผ)
  • ์ฃผ๋กœ ์ˆซ์žํ˜•์—์„œ ์‚ฌ์šฉ, MIN MAX COUNT ๋Š” ๋ฌธ์ž ๋‚ ์งœ๋„ ์ ์šฉ ๊ฐ€๋Šฅ
  • ์ง‘๊ณ„ํ•จ์ˆ˜ ์ข…๋ฅ˜: COUNT(*), COUNT(NULL ์ œ์™ธ), SUM(NULL ์ œ์™ธ), AVG(NULL ์ œ์™ธ), MIN, MAX, STDDEV(ํ‘œํ˜„์‹์˜ ํ‘œ์ค€ํŽธ์ฐจ ์ถœ๋ ฅ), VARIAN(ํ‘œํ˜„์‹์˜ ๋ถ„์‚ฐ ์ถœ๋ ฅ), ๊ธฐํƒ€

2. GROUP BY ์ ˆ

  • FROM ์ ˆ๊ณผ WHERE ์ ˆ ๋’ค์— ์˜ด, ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์€ ๊ทธ๋ฃน์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์†Œ๊ทธ๋ฃน๋ณ„ ๊ธฐ์ค€์„ ์ •ํ•œ ํ›„, SELECT์ ˆ์— ์ง‘๊ณ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
  • ์ง‘๊ณ„ํ•จ์ˆ˜์˜ ํ†ต๊ณ„ ์ •๋ณด๋Š” NULL ์ œ์™ธํ•˜๊ณ  ์ˆ˜ํ–‰
  • SELECT์ ˆ๊ณผ ๋‹ฌ๋ฆฌ ALIAS ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • ROLLUP ์ด๋‚˜ CUBE์— ์˜ํ•œ ์†Œ๊ณ„๊ฐ€ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ์—๋Š” GROUPING(EXPR)=1 ์ด ํ‘œ์‹œ
  • ๊ทธ ์™ธ ๊ฒฐ๊ณผ์—๋Š” GROUPING(EXPR)=0 ์ด ํ‘œ์‹œ

3.  HAVING ์ ˆ

  • GROUP BY์ ˆ์˜ ๊ธฐ์ค€ํ•ญ๋ชฉ์ด๋‚˜ ์†Œ๊ทธ๋ฃน์˜ ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์กฐ๊ฑด ํ‘œ์‹œ
  • GROUP BY์ ˆ์— ์˜ํ•œ ์†Œ๊ทธ๋ฃน๋ณ„๋กœ ๋งŒ๋“ค์–ด์ง„ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ ์ค‘, HAVING์ ˆ์—์„œ ์ œํ•œ ์กฐ๊ฑด์„ ๋‘์–ด ๋งŒ์กฑํ•˜๋Š” ๋‚ด์šฉ๋งŒ ์ถœ๋ ฅ
  • ์ผ๋ฐ˜์ ์œผ๋กœ GROUP BY์ ˆ ๋’ค์— ์œ„์น˜ํ•˜์ง€๋งŒ GROUP BY ์—†์–ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • WHERE ์ ˆ ์กฐ๊ฑด ๋ณ€๊ฒฝ์€ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • HAVING ์ ˆ ์กฐ๊ฑด ๋ณ€๊ฒฝ์€ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์€ ์—†๊ณ  ์ถœ๋ ฅ๋˜๋Š” ๋ ˆ์ฝ”๋“œ ๊ฐœ์ˆ˜๋งŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

4. GROUP BY ์ ˆ๊ณผ HAVING ์ ˆ์˜ ํŠน์„ฑ

  • GROUP BY ์— ์˜ํ•œ ์†Œ๊ทธ๋ฃน๋ณ„ ๋งŒ๋“ค์–ด์ง„ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ ์ค‘ HAVING ์กฐ๊ฑด ๋งŒ์กฑํ•˜๋Š” ๋‚ด์šฉ๋งŒ ์ถœ๋ ฅ
  • ๊ฐ€๋Šฅํ•˜๋ฉด GROUP BY ํ•˜๊ธฐ ์ „์—, WHERE ์ ˆ๋กœ ๊ณ„์‚ฐ ๋Œ€์ƒ์„ ์ค„์ด๋Š”๊ฒŒ ํšจ๊ณผ์ ์ž„
  • WHERE ์ ˆ์€ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ Group์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ํ•„์š”์—†๋Š” ์กฐ๊ฑด์„ ๋ฏธ๋ฆฌ ์ œ๊ฑฐ ํ•˜๋Š” ์—ญํ• 
  • HAVING ์ ˆ์€ GROUP BY๋กœ ๋งŒ๋“ค์–ด์ง„ ์†Œ๊ทธ๋ฃน์— ๋Œ€ํ•ด์„œ๋งŒ ์กฐ๊ฑด์ž„

5. CASE ํ‘œํ˜„์„ ํ™œ์šฉํ•œ ์›”๋ณ„ ๋ฐ์ดํ„ฐ ์ง‘๊ณ„: ํ•จ์ˆ˜ (CASE( ))~GROUP BY

  • ๋ชจ๋ธ๋ง์˜ ์ œ1์ •๊ทœํ™”๋กœ ์ธํ•ด ๋ฐ˜๋ณต๋˜๋Š” ์นผ๋Ÿผ์˜ ๊ฒฝ์šฐ ๊ตฌ๋ถ„ ์นผ๋Ÿผ์„ ๋‘๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ง‘ํ•ฉ์„, ์ •ํ•ด์ง„ ์นผ๋Ÿผ ์ˆ˜๋งŒํผ ํ™•์žฅํ•ด์„œ ์ง‘๊ณ„ ๋ณด๊ณ ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฒ•

6. ์ง‘๊ณ„ํ•จ์ˆ˜์™€ NULL ์ฒ˜๋ฆฌ

  • ๋ ˆํฌํŠธ ์ถœ๋ ฅ ๋•Œ NULL์ด ์•„๋‹Œ 0์„ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” NVL(SUM(SAL), 0)์ด๋‚˜, ISNULL(SUM(SAL), 0)์ฒ˜๋Ÿผ ์ „์ฒด SUM์˜ ๊ฒฐ๊ณผ๊ฐ€ NULL์ธ ๊ฒฝ์šฐ(๋Œ€์ƒ ๊ฑด์ˆ˜๊ฐ€ ๋ชจ๋‘ NULL์ธ ๊ฒฝ์šฐ)์—๋งŒ ํ•œ ๋ฒˆ NVL/ISNULL ํ•จ์ˆ˜ ์‚ฌ์šฉ

 

์ œ 6์ ˆ ORDER BY ์ ˆ

1. ORDER BY ์ •๋ ฌ

  • SQL ๋ฌธ์žฅ์œผ๋กœ ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชฉ์ ์— ๋งž๊ฒŒ ํŠน์ • ์นผ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ
  • ORDER BY ์ ˆ์— ์นผ๋Ÿผ๋ช… ๋Œ€์‹  SELECT ์ ˆ์—์„œ ์‚ฌ์šฉํ•œ ALIAS ๋ช…, ์นผ๋Ÿผ ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ, SQL ๋ฌธ์žฅ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ์œ„์น˜, SELECT์ ˆ์—์„œ ์˜ค์ง ํ•œ ๊ฐœ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • ์ˆซ์žํ˜• ํƒ€์ž…์€ ์˜ค๋ฆ„์ฐจ์ˆœ์‹œ ์ž‘์€ ๊ฐ’ / ๋‚ ์งœํ˜• ํƒ€์ž…์€ ์˜ค๋ฆ„์ฐจ์ˆœ์‹œ ๋น ๋ฅธ ๋‚ ๋ถ€ํ„ฐ ์ถœ๋ ฅ
  • ORDER BY์—๋Š” GROUP BY ์นผ๋Ÿผ์ด๋‚˜ SELECT ์นผ๋Ÿผ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • Oracle์—์„  null์„ ๊ฐ€์žฅ ํฐ ๊ฐ’์„, SQL Server์—์„  ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ

2. SELECT ๋ฌธ์žฅ ์‹คํ–‰ ์ˆœ์„œ 

  • 1) ๋ฐœ์ทŒ ๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ฐธ๊ณ (FROM) → 2) ๋ฐœ์ทŒ ๋Œ€์‚ฐ ๋ฐ์ดํ„ฐ ์•„๋‹Œ ๊ฒƒ์€ ์ œ๊ฑฐ(WHERE) → 3) ํ–‰๋“ค์„ ์†Œ๊ทธ๋ฃนํ™” (GROUP BY) → 4) ๊ทธ๋ฃนํ•‘๋œ ๊ฐ’์˜ ์กฐ๊ฑด์— ๋งž๋Š” ๊ฒƒ๋งŒ ์ถœ๋ ฅ(HAVING) → 5) ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ถœ๋ ฅ/๊ณ„์‚ฐ (SELECT) → 6) ๋ฐ์ดํ„ฐ ์ •๋ ฌ (ORDER BY)

 

์ œ 7์ ˆ ์กฐ์ธ(JOIN)

1. JOIN - ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”๋“ค์„ ์—ฐ๊ฒฐ / ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ

  • JOIN์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ , ๋Œ€ํ‘œ์  ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ž„
  • ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ํ–‰๋“ค์€ PK ๋‚˜ FK ๊ฐ’์˜ ์—ฐ๊ด€์— ์˜ํ•ด JOIN์ด ์„ฑ๋ฆฝ
  • ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” PK, FK ๊ด€๊ณ„๊ฐ€ ์—†์–ด๋„ ๋…ผ๋ฆฌ์ ์ธ ๊ฐ’๋“ค์˜ ์—ฐ๊ด€๋งŒ์œผ๋กœ JOIN ์„ฑ๋ฆฝ ๊ฐ€๋Šฅ

  • ํ•˜๋‚˜์˜ SQL ๋ฌธ์žฅ์—์„œ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์ž‡์Œ
  • FROM ์ ˆ์— ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์ด ๋‚˜์—ด๋˜๋”๋ผ๋„ SQL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ๋‘ ๊ฐœ์˜ ์ง‘ํ•ฉ ๊ฐ„์—๋งŒ JOIN์ด ์ผ์–ด๋‚จ
  • FROM ์ ˆ์— A, B, C 3๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ๋‚˜์—ด๋˜์—ˆ๋”๋ผ๋„ ํŠน์ • 2๊ฐœ์˜ ํ…Œ์ด๋ธ”๋งŒ ๋จผ์ € ์กฐ์ธ๋˜๊ณ , ๊ทธ ์กฐ์ธ๋œ ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ ์ง‘ํ•ฉ๊ณผ ๋‚จ์€ ํ•œ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ๋‹ค์Œ ์ฐจ๋ก€๋กœ ์กฐ์ธ

2. EQUI JOIN (๋“ฑ๊ฐ€ ์กฐ์ธ)

  • ๋‘ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ ๊ฐ’์ด ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ, ๋Œ€๋ถ€๋ถ„ PK ↔๏ธŽ FK ๊ด€๊ณ„ ๊ธฐ๋ฐ˜
  • JOIN ์กฐ๊ฑด์€ WHERE ์ ˆ์— ๊ธฐ์ˆ , JOIN~ON~ 

  • ์กฐ๊ฑด ์ ˆ์— ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ALIAS ๋ช…์„ ์ ์šฉํ•ด SQL๋ฌธ์„ ์ž‘์„ฑํ–ˆ์„ ๊ฒฝ์šฐ, WHERE ์ ˆ๊ณผ SELECT ์ ˆ์—๋Š” ํ…Œ์ด๋ธ”๋ช…์ด ์•„๋‹Œ ALIAS๋ฅผ ์‚ฌ์šฉ

3. Non EQUI JOIN (๋น„๋“ฑ๊ฐ€ ์กฐ์ธ)

  • ๋‘ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ ๊ฐ’์ด ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  • Non EQUI JOIN์˜ ๊ฒฝ์šฐ์—๋Š” “=“ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ (Between, >, >=, <, <= ๋“ฑ) ์—ฐ์‚ฐ์ž๋“ค์„ ์‚ฌ์šฉํ•ด JOIN ์ˆ˜ํ–‰
  • WHERE ํ…Œ์ด๋ธ”1.์นผ๋Ÿผ๋ช…1 BETWEEN ํ…Œ์ด๋ธ”2.์นผ๋Ÿผ๋ช…1 AND ํ…Œ์ด๋ธ”2.์นผ๋Ÿผ๋ช…2;

 

์ œ 8์ ˆ ํ‘œ์ค€ ์กฐ์ธ

1. STANDAR SQL (ํ‘œ์ค€ SQL) ๊ฐœ์š”

  • ํ‘œ์ค€ SQL์˜ ๊ธฐ๋Šฅ
    • STANDAR JOIN ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (CROSS, OUTER JOIN ๋“ฑ ์ƒˆ๋กœ์šด FROM ์ ˆ JOIN ๊ธฐ๋Šฅ๋“ค)
    • SCALAR SUBQUERT, TOP-N QUERY ๋“ฑ์˜  ์ƒˆ๋กœ์šด ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ๋“ค
    • ROLLUP, CUBE, GROUPING SETS ๋“ฑ์˜ ์ƒˆ๋กœ์šด ๋ฆฌํฌํŒ… ๊ธฐ๋Šฅ
    • WINDOW FUNCTION ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ฐœ๋…์˜ ๋ถ„์„ ๊ธฐ๋Šฅ๋“ค
  • ์ผ๋ฐ˜ ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž ํ˜„์žฌ SQL
    • UNION ์—ฐ์‚ฐ → UNION ๊ธฐ๋Šฅ: ํ•ฉ์ง‘ํ•ฉ
    • INTERSECTION ์—ฐ์‚ฐ → INTERSECT ๊ธฐ๋Šฅ: ๊ต์ง‘ํ•ฉ
    • DIFFERENCE ์—ฐ์‚ฐ → EXCEPT ๊ธฐ๋Šฅ(Oracle์€ MINUS): ์ฐจ์ง‘ํ•ฉ
    • PRODUCT ์—ฐ์‚ฐ → CROSS JOIN ๊ธฐ๋Šฅ: ๊ณฑ์ง‘ํ•ฉ
  • ์ˆœ์ˆ˜ ๊ด€๊ณ„ ์—ฐ์‚ฐ์ž ํ˜„์žฌ SQL
    • SELECT ์—ฐ์‚ฐ → WHERE ์ ˆ: ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰ ์กฐํšŒ
    • PROJECT ์—ฐ์‚ฐ → SELECT ์ ˆ: ์กฐ๊ฑด์— ๋งž๋Š” ์นผ๋Ÿผ ์กฐํšŒ
    • (NATURAL) JOIN ์—ฐ์‚ฐ → ๋‹ค์–‘ํ•œ JOIN ๊ธฐ๋Šฅ: ์—ฌ๋Ÿฌ ์กฐ์ธ ์กด์žฌ
    • DIVIDE ์—ฐ์‚ฐ ํ˜„์žฌ ์‚ฌ์šฉ X

2. FROM ์ ˆ์˜ JOIN ํ˜•ํƒœ

  • ANSI/ISO SQL์—์„œ ํ‘œ์‹œํ•˜๋Š” FROM ์ ˆ์˜ JOIN ํ˜•ํƒœ
    : INNER JOIN / NATURAL JOIN / USING ์กฐ๊ฑด์ ˆ / ON ์กฐ๊ฑด์ ˆ / CROSS JOIN / OUTER JOIN
  • ๊ธฐ์กด WHERE ์ ˆ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • FROM ์ ˆ์—์„œ JOIN ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ ๊ฐ€๋Šฅ

3. INNER JOIN - ๋‚ด๋ถ€ JOIN

  • JOIN ์กฐ๊ฑด์—์„œ ๋™์ผํ•œ ๊ฐ’์ด ์žˆ๋Š” ํ–‰๋งŒ ๋ฐ˜ํ™˜
  • DEFAULT ์˜ต์…˜์ด๋ฏ€๋กœ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, CROSS JOIN / OUTER JOIN ๊ณผ๋Š” ๊ฐ™์ด ์‚ฌ์šฉ X
  • USING ์กฐ๊ฑด์ ˆ์ด๋‚˜ ON ์กฐ๊ฑด์ ˆ์„ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ
  • ์ค‘๋ณต ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ ๋ณ„๊ฐœ์˜ ์นผ๋Ÿผ์œผ๋กœ ํ‘œ์‹œ
  • SELECT ~ FROM ~ INNER JOIN DEPT ON ~

4. NATURAL JOIN

  • ๋‘ ํ…Œ์ด๋ธ”๊ฐ„ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋ชจ๋“  ์นผ๋Ÿผ์— ๋Œ€ํ•ด EQUI JOIN ์ˆ˜ํ–‰
  • USING, ON, WHERE์—์„œ JOIN ์ •์˜X
  • JOIN์— ์‚ฌ์šฉ๋œ ์นผ๋Ÿผ์€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…
  • ALIAS๋‚˜ ์ ‘๋‘์‚ฌ ๋ถ™์ผ ์ˆ˜ X
  • ์‚ฌ์› ๋ฒˆํ˜ธ์™€ ์‚ฌ์› ์ด๋ฆ„, ์†Œ์† ๋ถ€์„œ ์ฝ”๋“œ์™€ ์†Œ์† ๋ถ€์„œ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค
    SELECT DEPTNO, EMPNO, ENAME, DNAME FROM EMP NATURAL JOIN DEPT;

5. USING ์กฐ๊ฑด์ ˆ

  • FROM ์ ˆ์—์„œ USING ์กฐ๊ฑด์ ˆ์„ ์ด์šฉํ•ด ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์นผ๋Ÿผ๋“ค ์ค‘์—์„œ ์›ํ•˜๋Š” ์นผ๋Ÿผ์— ๋Œ€ํ•ด์„œ๋งŒ ์„ ํƒ์ ์œผ๋กœ EQUI JOIN์„ ํ•  ์ˆ˜ ์ž‡์Œ
  • SQL Server์—์„œ๋Š” ์ง€์› X
  • JOIN ์นผ๋Ÿผ์— ๋Œ€ํ•ด์„œ๋Š” ALIAS๋‚˜ ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋ถ™์ผ ์ˆ˜X
  • JOIN์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์นผ๋Ÿผ์€ 1๊ฐœ๋งŒ ํ‘œ์‹œ
  • Oracle SQL>> SELECT * FROM DEPT JOIN DEPT_TEMP USING(DEPTNO);

6. ON ์กฐ๊ฑด์ ˆ

  • ์นผ๋Ÿผ๋ช…์ด ๋‹ฌ๋ผ๋„ JOIN ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • WHERE ๊ฒ€์ƒ‰ ์กฐ๊ฑด์€ ์ถฉ๋Œ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ON ์กฐ๊ฑด์ ˆ์—์„œ ์‚ฌ์šฉ๋œ ๊ด„ํ˜ธ๋Š” ์˜ต์…˜์ž„
  • ALIAS ๋ฐ ํ…Œ์ด๋ธ”๋ช… ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ

  • WHERE ์ ˆ๊ณผ ํ˜ผ์šฉ
    • SQL>> “๋ถ€์„œ์ฝ”๋“œ 30์ธ ๋ถ€์„œ์˜ ์†Œ์† ์‚ฌ์› ์ด๋ฆ„ ๋ฐ ์†Œ์† ๋ถ€์„œ ์ฝ”๋“œ, ๋ถ€์„œ์ฝ”๋“œ, ๋ถ€์„œ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค”โ€จ
      SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME FROM EMP Eโ€จ
      JOIN DEPT D ON (E.DEPTNO = D.DPETNO) WHERE E.DEPTNO = 30;
  • ON ์กฐ๊ฑด์ ˆ + ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์กฐ๊ฑด ์ถ”๊ฐ€
    • SQL>> “๋งค๋‹ˆ์ € ์‚ฌ์›๋ฒˆํ˜ธ๊ฐ€ 7698๋ฒˆ์ธ ์‚ฌ์›๋“ค์˜ ์ด๋ฆ„ ๋ฐ ์†Œ์† ๋ถ€์„œ ์ฝ”๋“œ, ๋ถ€์„œ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค”โ€จ
      SELECT E.ENAME, E.MGR, D.DEPTNO, D.DNAME FROM EMP Eโ€จ
      JOIN DEPT D ON (E.DEPTNO = D.DEPTNO) WHERE E.MGR = 7698;
  • ON ์กฐ๊ฑด์ ˆ ์˜ˆ์ œ
    • SQL>> “ํŒ€๊ณผ ์Šคํƒ€๋””์›€ ํ…Œ์ด๋ธ”์„ ํŒ€ ID๋กœ ์กฐ์ธํ•˜์—ฌ ํŒ€์ด๋ฆ„, ํŒ€ID, ์Šคํƒ€๋””์›€ ์ด๋ฆ„์„ ์ฐพ์•„๋ณธ๋‹ค. STADIUM์—๋Š” ํŒ€ID๊ฐ€ HOMETEAM_ID๋ผ๋Š” ์นผ๋Ÿผ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์Œ”โ€จ
      SELECT TEAM_NAME, TEAM_ID, STADIUM_NAME FROM TEAMโ€จ
      JOIN STADIUM ON TEAM.TEAM_ID = STADIUM.HOMETEAM_ID ORDER BY TEAM_ID;
  • ๋‹ค์ค‘ ํ…Œ์ด๋ธ” JOIN
    • SQL>> “์‚ฌ์›๊ณผ DEPT ํ…Œ์ด๋ธ”์˜ ์†Œ์† ๋ถ€์„œ๋ช…, DEPT_TEMP ํ…Œ์ด๋ธ”์˜ ๋ฐ”๋€ ๋ถ€์„œ๋ช… ์ •๋ณด๋ฅผ ์ฐพ์•„๋ณธ๋‹ค”โ€จ
      SELECT E.EMPNO, D.DEPTNO, D.DNAME, T.DNAME New_DNAME FROM EMPLOYEE Eโ€จ
      JOIN DEPT D ON (E.DEPTNO = D.DEPTNO) JOIN DEPT_TEMP T ON (E.DEPTNO = T.DEPTNO);

7. CROSS JOIN (= CARTESIAN PRODUCT / CROSS PRODUCT)

  • JOIN ์กฐ๊ฑด์ด ์—†๋Š” ๊ฒฝ์šฐ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ์กฐํ•ฉ
  • JOIN ํ•  ๋•Œ ์ ์ ˆํ•œ JOIN ์กฐ๊ฑด ์นผ๋Ÿผ์ด ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ
  • ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์กฐํ•ฉ์„ ์ถœ๋ ฅ
  • ๊ฒฐ๊ณผ๋Š” ์–‘์ชฝ ์ง‘ํ•ฉ์˜ M*N ๊ฑด์˜ ๋ฐ์ดํ„ฐ ์กฐํ•ฉ ๋ฐœ์ƒ

8. OUTER JOIN

  • JOIN ์กฐ๊ฑด์—์„œ ๋™์ผํ•œ ๊ฐ’์ด ์—†๋Š” ํ–‰๋„(NULL๋„) ์ถœ๋ ฅ
  • USING ์กฐ๊ฑด์ ˆ์ด๋‚˜ ON ์กฐ๊ฑด์ ˆ์„ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉ
  • IN/ON ์—ฐ์‚ฐ์ž X
  • ํ‘œ์‹œ๊ฐ€ ๋ˆ„๋ฝ๋œ ์นผ๋Ÿผ์ด ์žˆ์„ ๊ฒฝ์šฐ OUTER JOIN ์˜ค๋ฅ˜, FULL OUTER JOIN ๋ฏธ์ง€์›
  • FULL OUTER JOIN ๋ฏธ์ง€์›์œผ๋กœ STANDART JOIN ์ฃผ๋กœ ์‚ฌ์šฉ
  • LEFT OUTER JOIN (↔๏ธŽ RIGHT)
    • ์ขŒ์ธก ํ…Œ์ด๋ธ”์—์„œ ๋จผ์ € ๋ฐ์ดํ„ฐ ์ฝ๊ณ , ์šฐ์ธก ํ…Œ์ด๋ธ”์—์„œ JOIN ๋Œ€์ƒ ์ฝ๊ธฐ
    • ์ขŒ์ธก ๊ธฐ์ค€, OUTER ํ‚ค์›Œ๋“œ ์ƒ๋žต ๊ฐ€๋Šฅ
  • RIGHT OUTER JOIN - LEFT๋ž‘ ๋ฐ˜๋Œ€
  • FULL OUTER JOIN
    • ํ•ฉ์ง‘ํ•ฉ ๊ฐœ๋…, LEFT, RIGHT ๋‹ค ์ฝ์–ด ์˜ด
    • ์กฐ์ธ์ด ๋˜๋Š” ๋ชจ๋“  ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ฝ์–ด JOIN ํ•จ

9. INNER JOIN vs. OUTER JOIN vs. CROSS JOIN ๋น„๊ต 

  1. INNER: B-B, C-C
  2. LEFT OUTER: B-B, C-C, D-NULL, E-NULL
  3. RIGHT OUTER: A-NULL, B-B, C-C
  4. FULL: NULL-A, B-B, C-C, D-NULL, E-NULL
  5. CROSS: B-A, B-B, B-C, C-A, C-B, C-C, D-A, D-B, D-C, E-A, D-B, D-C