ํ•จ์ˆ˜ & GROUP BY HAVING & JOIN

์ด๋ฏผ๊ฒฝยท2024๋…„ 3์›” 5์ผ

DB

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

ํ•จ์ˆ˜

๐Ÿ“– ํ•จ์ˆ˜๋ž€?

์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ์ฝ์–ด์„œ ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

๐Ÿ“– ๋‹จ์ผ ํ–‰ ํ•จ์ˆ˜?

N๊ฐœ์˜ ๊ฐ’์„ ์ฝ์–ด์„œ N๊ฐœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

๐Ÿ“– ๊ทธ๋ฃน ํ•จ์ˆ˜?

N๊ฐœ์˜ ๊ฐ’์„ ์ฝ์–ด 1๊ฐœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜(ํ•ฉ๊ณ„, ํ‰๊ท , ์ตœ๋Œ€, ์ตœ์†Œ)

๐Ÿ’ก ํ•จ์ˆ˜๋Š” SELECT ๋ฌธ ์˜ SELECT์ ˆ, WHERE์ ˆ ORDER BY์ ˆ , GROUP BY์ ˆ, HAVING์ ˆ ์‚ฌ์šฉ๊ฐ€๋Šฅ


๐Ÿ“• ๋‹จ์ผ ํ–‰ ํ•จ์ˆ˜

LENGH(์ปด๋Ÿผ๋ช… | ๋ฌธ์ž์—ด) : ๊ธธ์ด ๋ฐ˜ํ™˜

SELECT EMAIL, LENGTH(EMAIL)
FROM EMPLOYEE;

INSTR(์ปฌ๋Ÿผ๋ช… | ๋ฌธ์ž์—ด, '์ฐพ์„ ๋ฌธ์ž์—ด' [, ์ฐพ๊ธฐ ์‹œ์ž‘ํ•  ์œ„์น˜ [, ์ˆœ๋ฒˆ]])
: ์ง€์ •ํ•œ ์œ„์น˜๋ถ€ํ„ฐ ์ง€์ •ํ•œ ์ˆœ๋ฒˆ์งธ๋กœ ๊ฒ€์ƒ‰๋˜๋Š” ๋ฌธ์ž์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜

[๋ฌธ์ž์—ด์„ ์•ž์—์„œ๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ B์œ„์น˜ ์กฐํšŒ]
SELECT INSTR('BANNA-BANNA-BANNA', 'B') FROM DUAL; -- 1 
[๋ฌธ์ž์—ด์„ 5๋ฒˆ์งธ ๋ฌธ์ž๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ๋ฒˆ์งธ์— ์žˆ๋Š” B์œ„์น˜๋ฅผ ์กฐํšŒ]
SELECT INSTR('BANNA-BANNA-BANNA', 'B', 5) FROM DUAL; --7
[๋ฌธ์ž์—ด์„ 5๋ฒˆ์งธ ๋ฌธ์ž๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ B ์œ„์น˜๋ฅผ ์กฐํšŒ]
SELECT INSTR('BANNA-BANNA-BANNA', 'B', 5 , 2) FROM DUAL; --13
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์›๋ช…, ์ด๋ฉ”์ผ, ์ด๋ฉ”์ผ ์ค‘ '@' ์œ„์น˜ ์กฐํšŒ]
SELECT EMP_NAME, EMAIL, INSTR(EMAIL, '@')
FROM EMPLOYEE;

SUBSTR('๋ฌธ์ž์—ด' | ์ปฌ๋Ÿผ๋ช…, ์ž˜๋ผ๋‚ด๊ธฐ ์‹œ์ž‘ํ•  ์œ„์น˜[, ์ž˜๋ผ๋‚ผ ๊ธธ์ด])
: ์ปฌ๋Ÿผ์ด๋‚˜ ๋ฌธ์ž์—ด์—์„œ ์ง€์ •ํ•œ ์œ„์น˜๋ถ€ํ„ฐ ์ง€์ •๋œ ๊ธธ์ด๋งŒํผ ๋ฌธ์ž์—ด์„ ์ž˜๋ผ๋‚ด์„œ ๋ฐ˜ํ™˜
โžก ์ž˜๋ผ๋‚ผ ๊ธธ์ด ์ƒ๋žต ์‹œ ๋๊นŒ์ง€ ์ž˜๋ผ๋ƒ„

[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์›๋ช…, ์ด๋ฉ”์ผ ์ค‘ ์•„์ด๋”” ๋ถ€๋ถ„๋งŒ ์กฐํšŒ]
SELECT EMP_NAME, EMAIL, SUBSTR(EMAIL, 1, INSTR(EMAIL, '@')-1) ID
FROM EMPLOYEE;

TRIM([[์˜ต์…˜] '๋ฌธ์ž์—ด' | ์ปฌ๋Ÿผ๋ช… FROM]'๋ฌธ์ž์—ด' | ์ปฌ๋Ÿผ๋ช…)
: ์ฃผ์–ด์ง„ ์ปฌ๋Ÿผ์ด๋‚˜ ๋ฌธ์ž์—ด์˜ ์•ž, ๋’ค, ์–‘์ชฝ์— ์žˆ๋Š” ์ง€์ •๋œ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐ
โžก ๋ณดํ†ต ์–‘์ชฝ ๊ณต๋ฐฑ ์ œ๊ฑฐ์— ๋งŽ์ด ์‚ฌ์šฉ

  • ์˜ต์…˜ : LEADING(์•ž์ชฝ), TRAILING(๋’ค์ชฝ),BOTH(์–‘์ชฝ, ๊ธฐ๋ณธ๊ฐ’)
SELECT TRIM('           LEE MIN KYUNG          ') "๊ณต๋ฐฑ์ œ๊ฑฐ TEST"
FROM DUAL; -- ์–‘์ชฝ ๊ณต๋ฐฑ ์ œ๊ฑฐ
SELECT TRIM(BOTH '#' FROM  '####์ด๋ฏผ๊ฒฝ####') "์–‘์ชฝ ๊ณต๋ฐฑ์ œ๊ฑฐ"
FROM DUAL;
SELECT TRIM(LEADING '#' FROM  '####์ด๋ฏผ๊ฒฝ####') "์•ž์ชฝ ๊ณต๋ฐฑ์ œ๊ฑฐ"
FROM DUAL;
SELECT TRIM(TRAILING '#' FROM  '####์ด๋ฏผ๊ฒฝ####') "๋’ค์ชฝ ๊ณต๋ฐฑ์ œ๊ฑฐ"
FROM DUAL;

๐Ÿ“• ์ˆซ์ž ๊ด€๋ จ ํ•จ์ˆ˜

ABS(์ˆซ์ž | ์ปฌ๋Ÿผ๋ช…) : ์ ˆ๋Œ€ ๊ฐ’

SELECT ABS(10), ABS(-10) FROM DUAL;
SELECT '์ ˆ๋Œ€๊ฐ’ ๊ฐ™์Œ' ABS๋น„๊ต
FROM DUAL
WHERE ABS(10) = ABS(-10); 
โžก WHERE์ ˆ์—์„œ๋„ ํ•จ์ˆ˜ ์ž‘์„ฑ ๊ฐ€๋Šฅ

MOD(์ˆซ์ž | ์ปฌ๋Ÿผ๋ช…, ์ˆซ์ž | ์ปฌ๋Ÿผ๋ช…) : ๋‚˜๋จธ์ง€ ๊ฐ’ ๋ฐ˜ํ™˜

[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์›์˜ ์›”๊ธ‰์„ 100๋งŒ์œผ๋กœ ๋‚˜๋ˆด์„ ๋•Œ ๋‚˜๋จธ์ง€ ์กฐํšŒ]
SELECT EMP_NAME, SALARY, MOD(SALARY,1000000)
FROM EMPLOYEE;
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ๋ฒˆ์ด ์ง์ˆ˜์ธ ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„ ์กฐํšŒ]
SELECT EMP_ID, EMP_NAME "์‚ฌ๋ฒˆ์ด ์ง์ˆ˜์ธ ์‚ฌ์›"
FROM EMPLOYEE
WHERE MOD(EMP_ID,2) = 0;
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ๋ฒˆ์ด ํ™€์ˆ˜์ธ ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„ ์กฐํšŒ]
SELECT EMP_ID, EMP_NAME "์‚ฌ๋ฒˆ์ด ํ™€์ˆ˜์ธ ์‚ฌ์›"
FROM EMPLOYEE
WHERE MOD(EMP_ID,2) <> 0; -- <> ๊ฐ™์ง€์•Š๋‹ค

ROUND (์ˆซ์ž | ์ปฌ๋Ÿผ๋ช… [, ์†Œ์ˆ˜์  ์œ„์น˜)
: ๋ฐ˜์˜ฌ๋ฆผ (๊ธฐ๋ณธ๊ฐ’ ์†Œ์ˆ˜์  ์ฒซ๋ฒˆ์งธ ์ž๋ฆฌ => 0)

[์†Œ์ˆ˜์  ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ]
SELECT ROUND(123.456) FROM DUAL; -- 123
[์†Œ์ˆ˜์  ๋‘ ๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ  (์†Œ์ˆ˜์  ํ•œ์ž๋ฆฌ๋งŒ ํ‘œํ˜„)]
SELECT ROUND(123.456, 1) FROM DUAL; -- 123.5 
โžก ๋’ค์— ์˜ค๋Š” ์ˆซ์ž๋Š” ๋ช‡๋ฒˆ์งธ ์†Œ์ˆ˜์  ์ž๋ฆฌ๊นŒ์ง€ ๋‚˜ํƒ€๋‚ผ ๊ฒƒ์ธ๊ฐ€๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ข‹์Œ!
[์†Œ์ˆ˜์  ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ(0 ๊ธฐ๋ณธ๊ฐ’)]
SELECT ROUND(123.456, 0) FROM DUAL;
[์†Œ์ˆ˜์  0๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•ด์„œ ์†Œ์ˆ˜์  -1 ์ž๋ฆฌ ํ‘œํ˜„]
SELECT ROUND(123.456,-1) FROM DUAL; -- 120
โžก 1์˜ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•ด์„œ 10์˜ ์ž๋ฆฌ๋ถ€ํ„ฐ ํ‘œํ˜„ํ•œ๋‹ค๋Š” ๋ง
SELECT ROUND(123.456,-2) FROM DUAL; -- 100
โžก10์˜ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•ด์„œ 100์˜ ์ž๋ฆฌ๋ถ€ํ„ฐ ํ‘œํ˜„

CEIL(์ˆซ์ž | ์ปฌ๋Ÿผ๋ช…) : ์˜ฌ๋ฆผ
FLOOR(์ˆซ์ž | ์ปฌ๋Ÿผ๋ช…) : ๋‚ด๋ฆผ

โžก ๋‘˜๋‹ค ์†Œ์ˆ˜์  ์ฒซ์งธ ์ž๋ฆฌ์—์„œ ์˜ฌ๋ฆผ / ๋‚ด๋ฆผ ์ฒ˜๋ฆฌ

SELECT CEIL(123.1) ๋ฌด์กฐ๊ฑด์˜ฌ๋ฆผ,FLOOR(123.9) ๋ฌด์กฐ๊ฑด๋‚ด๋ฆผ FROM DUAL ; --124,123 

TRUNC(์ˆซ์ž | ์ปฌ๋Ÿผ๋ช… [,์œ„์น˜]) : ํŠน์ • ์œ„์น˜ ์•„๋ž˜๋ฅผ ๋ฒ„๋ฆผ(์ ˆ์‚ญ)

SELECT TRUNC(123.456) ๋‹ค๋ฒ„๋ฆผ FROM DUAL; -- 123, ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์†Œ์ˆ˜์  ์•„๋ž˜๋ฅผ ์ „๋ถ€ ๋ฒ„๋ฆผ 
SELECT TRUNC(123.456,1) ์†Œ์ˆ˜์ 1๊ฐœ๋นผ๊ณ ๋ฒ„๋ฆผ FROM DUAL; --123.4, ์†Œ์ˆ˜์  ์ฒซ์งธ ์ž๋ฆฌ ์•„๋ž˜ ๋ฒ„๋ฆผ 
SELECT TRUNC(123.456,-1) "10์˜์ž๋ฆฌ ์•„๋ž˜ ๋ฒ„๋ฆผ" FROM DUAL; --120, 10์˜์ž๋ฆฌ ์•„๋ž˜ ๋ฒ„๋ฆผ 
[๋ฒ„๋ฆผ, ๋‚ด๋ฆผ ์ฐจ์ด์ ]
SELECT FLOOR(-123.5), TRUNC(-123.5) FROM DUAL; -- TRUNC ๋’ค์— ๋ถ€๋ถ„ ์ ˆ์‚ญ
```!

๐Ÿ“• ๋‚ ์งœ(DATE) ๊ด€๋ จ ํ•จ์ˆ˜

SYSDATE : ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ ์‹œ๊ฐ„(๋…„, ์›”, ์ผ, ์‹œ, ๋ถ„, ์ดˆ)์„ ๋ฐ˜ํ™˜

SELECT SYSDATE  FROM DUAL;

SYSTIMESTMP : SYSDATE + MS ๋‹จ์œ„ ์ถ”๊ฐ€

SELECT SYSTIMESTAMP  FROM DUAL;

TIMESTAMP : ํŠน์ • ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๊ฑฐ๋‚˜ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด

2024-02-29 11:20:47.593 +0900 (UTC์—์„œ +9์‹œ๊ฐ„ ๋‚˜ํƒ€๋ƒ„, ํ•œ๊ตญ ํ‘œ์ค€์‹œ)

MONTHS_BETWEEN(๋‚ ์งœ, ๋‚ ์งœ) : ๋‘ ๋‚ ์งœ์˜ ๊ฐœ์›” ์ˆ˜ ์ฐจ์ด ๋ฐ˜ํ™˜

SELECT ROUND(MONTHS_BETWEEN(SYSDATE, '2024-06-26'),3) "์ˆ˜๊ฐ• ๊ธฐ๊ฐ„(๊ฐœ์›”)"
FROM DUAL;

โœ” ์˜ˆ์ œ๋ฌธ์ œ

[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์›์˜ ์ด๋ฆ„, ์ž…์‚ฌ์ผ, ๊ทผ๋ฌดํ•œ ๊ฐœ์›” ์ˆ˜, ๊ทผ๋ฌด ๋…„์ฐจ ์กฐํšŒ]
SELECT EMP_NAME, HIRE_DATE, 
CEIL (MONTHS_BETWEEN(SYSDATE, HIRE_DATE))  "๊ทผ๋ฌดํ•œ ๊ฐœ์›” ์ˆ˜",
CEIL (MONTHS_BETWEEN(SYSDATE, HIRE_DATE)/12) || '๋…„์ฐจ' "๊ทผ๋ฌด๋…„์ฐจ"
FROM EMPLOYEE;

๐Ÿ’ก || : ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ž(๋ฌธ์ž์—ด ์ด์–ด์“ฐ๊ธฐ๋ฅผ ๋œปํ•œ๋‹ค!)

ADD_MONTHS(๋‚ ์งœ, ์ˆซ์ž) : ๋‚ ์งœ์— ์ˆซ์ž๋งŒํผ์˜ ๊ฐœ์›” ์ˆ˜๋ฅผ ๋”ํ•จ(์Œ์ˆ˜๋„ ๊ฐ€๋Šฅ)

SELECT ADD_MONTHS(SYSDATE,4)FROM DUAL; 
SELECT ADD_MONTHS(SYSDATE,-1)FROM DUAL; 

LAST_DAY(๋‚ ์งœ) : ํ•ด๋‹น ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ๋ฅผ ๊ตฌํ•จ

SELECT LAST_DAY(SYSDATE) FROM DUAL; 
SELECT LAST_DAY(ADD_MONTHS(SYSDATE,1)) FROM DUAL; 
SELECT LAST_DAY('2021-02-01') FROM DUAL; 

โ—พ EXTRACT : ๋…„, ์›”, ์ผ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๋ฆฌํ„ด
โ—พ EXTRACT (YEAR FROM ๋‚ ์งœ) : ๋…„๋„๋งŒ ์ถ”์ถœ
โ—พ EXTRACT (MONTH FROM ๋‚ ์งœ): ์›”๋งŒ ์ถ”์ถœ
โ—พ EXTRACT (DAY FROM ๋‚ ์งœ): ์ผ๋งŒ ์ถ”์ถœ

[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ์‚ฌ์›์˜ ์ด๋ฆ„, ์ž…์‚ฌ์ผ(์ž…์‚ฌ๋…„๋„, ์›”, ์ผ) ์กฐํšŒ]
SELECT EMP_NAME,
		EXTRACT(YEAR FROM HIRE_DATE) || '๋…„' ||
		EXTRACT(MONTH FROM HIRE_DATE) || '์›”' ||
		EXTRACT(DAY FROM HIRE_DATE) || '์ผ' AS ์ž…์‚ฌ์ผ --์ž…์‚ฌ์ผ์ด๋ผ๊ณ  ๋ณ„์นญ์ง€์ •
FROM EMPLOYEE;

๐Ÿ“• ํ˜•๋ณ€ํ™˜ ํ•จ์ˆ˜

: ๋ฌธ์ž์—ด(CHAR), ์ˆซ์ž(NUMBER), ๋‚ ์งœ(DATE) ๋ผ๋ฆฌ ํ˜•๋ณ€ํ™˜ ๊ฐ€๋Šฅ

๐Ÿ“–๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜

  • TO_CHAR(๋‚ ์งœ,[ํฌ๋งท]) : ๋‚ ์งœํ˜•๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์žํ˜• ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝ
  • TO_CHAR(์ˆซ์ž,[ํฌ๋งท]) : ์ˆซ์žํ˜•๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์žํ˜• ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝ

๐Ÿ’ก ์ˆซ์ž ๋ณ€ํ™˜ ์‹œ ํฌ๋งท ํŒจํ„ด

  • 9 : ์ˆซ์ž ํ•œ์นธ์„ ์˜๋ฏธ, ์—ฌ๋Ÿฌ๊ฐœ ์ž‘์„ฑ ์‹œ ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ
  • 0 : ์ˆซ์ž ํ•œ์นธ์„ ์˜๋ฏธ, ์—ฌ๋Ÿฌ๊ฐœ ์ž‘์„ฑ ์‹œ ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ + ๋นˆ์นธ 0 ์ถ”๊ฐ€
  • L : ํ˜„์žฌ DB์— ์„ค์ •๋œ ๋‚˜๋ผ์˜ ํ™”ํ ๊ธฐํ˜ธ
SELECT TO_CHAR(1234) ํ˜•๋ณ€ํ™˜ FROM DUAL; -- 1,234 -> '1234'(๋ฌธ์žํ˜•)
SELECT TO_CHAR(1234, '99999') FROM DUAL; -- '1234'
SELECT TO_CHAR(1234, '00000') FROM DUAL; -- '01234'
SELECT TO_CHAR(EXTRACT(MONTH FROM HIRE_DATE),'00') || '์›”' FROM EMPLOYEE;
SELECT TO_CHAR(1000000, '9,999,999') || '์›' FROM DUAL; -- '1,000,000์› 
SELECT TO_CHAR(1000000, 'L9,999,999') || '์›' FROM DUAL; -- '1,000,000์› 

๐Ÿ’ก ๋‚ ์งœ ๋ณ€ํ™˜ ์‹œ ํฌ๋งท ํŒจํ„ด

  • YYYY : ๋…„๋„ / YY :๋…„๋„ (์งง๊ฒŒ)
  • RRRR : ๋…„๋„ / RR : ๋…„๋„(์งง๊ฒŒ)
  • MM : ์›” / DD : ์ผ
  • AM ๋˜๋Š” PM : ์˜ค์ „/ ์˜คํ›„ ํ‘œ์‹œ
  • HH : ์‹œ๊ฐ„ / HH24 : 24์‹œ๊ฐ„ ํ‘œ๊ธฐ๋ฒ•
  • MI : ๋ถ„ / SS : ์ดˆ
  • DAY : ์š”์ผ(์ „์ฒด) / DY : ์š”์ผ(์š”์ผ๋ช…๋งŒ ํ‘œ์‹œ)

[2024-02-29 12:21:08.000]
SELECT SYSDATE FROM DUAL; 
[2024/02/29 12:20:54 ๋ชฉ์š”์ผ]
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS DAY') FROM DUAL;
[02/29(๋ชฉ)]
SELECT TO_CHAR(SYSDATE,'MM/DD (DY)')FROM DUAL; 
[2024๋…„ 02์›” 29์ผ ๋ชฉ]
SELECT TO_CHAR(SYSDATE,'YYYY"๋…„" MM"์›”" DD"์ผ" DY') FROM DUAL;
โžก ๋…„, ์›”, ์ผ์ด ๋‚ ์งœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŒจํ„ด์œผ๋กœ ์ธ์‹์ด ์•ˆ๋˜์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•จ!
๋”ฐ๋ผ์„œ "" ์Œ๋”ฐ์˜ดํ‘œ๋ฅผ ์ด์šฉํ•ด์„œ ๋‹จ์ˆœํ•œ ๋ฌธ์ž๋กœ ์ธ์‹์‹œํ‚ค๋ฉด ํ•ด๊ฒฐ๋จ 

๐Ÿ“– ๋‚ ์งœ๋กœ ๋ณ€ํ™˜ TO_DATE

  • TO_DATE(๋ฌธ์žํ˜• ๋ฐ์ดํ„ฐ,[ํฌ๋งท]) : ๋ฌธ์žํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ ์งœ๋กœ ๋ณ€๊ฒฝ
  • TO_DATE(์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ,[ํฌ๋งท]) : ์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ ์งœ๋กœ ๋ณ€๊ฒฝ
    โžก ์ง€์ •๋œ ํฌ๋งท์œผ๋กœ ๋‚ ์งœ๋ฅผ ์ธ์‹ํ•จ
SELECT TO_DATE('2024-02-29') "TODATE ๋ฌธ์žํ˜•TEST" FROM DUAL;
SELECT TO_DATE(20240229) "TODATE ์ˆซ์žํ˜•TEST" FROM DUAL;
SELECT TO_DATE('240229 1123350') FROM DUAL;
--  ์—๋Ÿฌ๋ฐœ์ƒ! ORA-01861 :๋ฆฌํ„ฐ๋Ÿด์ด ํ˜•์‹ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ
---> ํŒจํ„ด์„ ์ ์šฉํ•ด์„œ ์ž‘์„ฑ๋œ ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž๊ฐ€ ์–ด๋–ค ๋‚ ์งœ ํ˜•์‹์ธ์ง€ ์ธ์‹์‹œํ‚ด ๋”ฐ๋ผ์„œ
SELECT TO_DATE('240229 123350', 'YYMMDD HH24MISS') FROM DUAL; -- ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋จ
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ์ง์›์ด ํƒœ์–ด๋‚œ ์ƒ๋…„์›”์ผ(1990๋…„ 05์›” 13์ผ) ์กฐํšŒ]
SELECT EMP_NAME,
	TO_CHAR(TO_DATE(SUBSTR(EMP_NO,1,INSTR(EMP_NO,'-')-1), 'RRMMDD'),
					'YYYY"๋…„" MM"์›”" DD"์ผ"') AS ์ƒ๋…„์›”์ผ 
FROM EMPLOYEE;

๐Ÿ’ก Y/R ์ฐจ์ด์ 

  • Y ํŒจํ„ด : ํ˜„์žฌ ์„ธ๊ธฐ(21์„ธ๊ธฐ == 20XX๋…„๋Œ€ == 2000๋…„๋Œ€)
  • R ํŒจํ„ด : 1์„ธ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ ˆ๋ฐ˜(50๋…„) ์ด์ƒ์ธ ๊ฒฝ์šฐ ์ด์ „์„ธ๊ธฐ(1980๋…„๋Œ€)
    ์ ˆ๋ฐ˜(50๋…„)์˜ ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ ํ˜„์žฌ ์„ธ๊ธฐ(2000๋…„๋Œ€)
SELECT TO_DATE('510505','YYMMDD') FROM DUAL; --2051-05-05 00:00:00.000
SELECT TO_DATE('510505','RRMMDD') FROM DUAL; --1951-05-05 00:00:00.000
SELECT TO_DATE('400505','RRMMDD') FROM DUAL; --2040-05-05 00:00:00.000

๐Ÿ“– ์ˆซ์ž ํ˜• ๋ณ€ํ™˜

TO_NUMBER(๋ฌธ์ž๋ฐ์ดํ„ฐ, [ํฌ๋งท]) : ๋ฌธ์žํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ˆซ์ž ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝ

SELECT '1,000,000' + 5000000 FROM DUAL;
โžก ORA-01722: ์ˆ˜์น˜๊ฐ€ ๋ถ€์ ํ•ฉ ํ•ฉ๋‹ˆ๋‹ค.
SELECT TO_NUMBER('1,000,000', '9,999,999') + 5000000 FROM DUAL;

๐Ÿ“• [NULL ์ฒ˜๋ฆฌ ํ•จ์ˆ˜]

NVL(์ปฌ๋Ÿผ๋ช…, ์ปฌ๋Ÿผ๊ฐ’์ด NULL์ผ ๋•Œ ๋ฐ”๊ฟ€ ๊ฐ’) : NULL ์ธ ์ปฌ๋Ÿผ๊ฐ’์„ ๋‹ค๋ฅธ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ

[NULL๊ณผ ์‚ฐ์ˆ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋ฌด์กฐ๊ฑด NULL]
SELECT EMP_NAME,SALARY, NVL(BONUS, 0), NVL(SALARY * BONUS,0)
FROM EMPLOYEE;

NVL2(์ปฌ๋Ÿผ๋ช…, ๋ฐ”๊ฟ€๊ฐ’1, ๋ฐ”๊ฟ€๊ฐ’2)
: ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋ฐ”๊ฟ€๊ฐ’1๋กœ ๋ณ€๊ฒฝ, ํ•ด๋‹น ์ปฌ๋Ÿผ์ด NULL์ด๋ฉด ๋ฐ”๊ฟ€๊ฐ’2๋กœ ๋ณ€๊ฒฝ

[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ๋ณด๋„ˆ์Šค๋ฅผ ๋ฐ›์œผ๋ฉด 'O' ์•ˆ๋ฐ›์œผ๋ฉด 'X' ์กฐํšŒ]
SELECT EMP_NAME, NVL2(BONUS,'O','X') "๋ณด๋„ˆ์Šค ์ˆ˜๋ น"
FROM EMPLOYEE; 

๐Ÿ“• ์„ ํƒํ•จ์ˆ˜

DECODE(๊ณ„์‚ฐ์‹ | ์ปฌ๋Ÿผ๋ช…, ์กฐ๊ฑด๊ฐ’1, ์„ ํƒ๊ฐ’1, ์กฐ๊ฑด๊ฐ’2, ์„ ํƒ๊ฐ’2 ...., ์•„๋ฌด๊ฒƒ๋„ ์ผ์น˜ํ•˜์ง€ ์•Š์„๋•Œ)
: ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’ ๋˜๋Š” ์ปฌ๋Ÿผ์ด ์กฐ๊ฑด์‹๊ณผ ๊ฐ™์œผ๋ฉด ๊ฒฐ๊ณผ ๊ฐ’ ๋ฐ˜ํ™˜

[์ง์›์˜ ์„ฑ๋ณ„ ๊ตฌํ•˜๊ธฐ (๋‚จ:1, ์—ฌ:2)]
SELECT EMP_NAME, DECODE(SUBSTR(EMP_NO,8,1), '1','๋‚จ์„ฑ','2','์—ฌ์„ฑ') ์„ฑ๋ณ„
FROM EMPLOYEE;
[ ์ง์›์˜ ๊ธ‰์—ฌ๋ฅผ ์ธ์ƒํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ง๊ธ‰ ์ฝ”๋“œ๊ฐ€ J7์ธ ์ง์›์€ 20% ์ธ์ƒ, 
์ง๊ธ‰ ์ฝ”๋“œ๊ฐ€ J6์ธ ์ง์›์€ 15% ์ธ์ƒ,์ง๊ธ‰ ์ฝ”๋“œ๊ฐ€ J5์ธ ์ง์›์€ 10% ์ธ์ƒ, ๊ทธ ์™ธ ์ง๊ธ‰์€ 5% ์ธ์ƒ.
์ด๋ฆ„, ์ง๊ธ‰์ฝ”๋“œ, ๊ธ‰์—ฌ, ์ธ์ƒ๋ฅ , ์ธ์ƒ๋œ ๊ธ‰์—ฌ๋ฅผ ์กฐํšŒ]
SELECT EMP_NAME, JOB_CODE , SALARY, 
		DECODE(JOB_CODE, 'J7', '20%','J6', '15%','J5','10%','5%') ์ธ์ƒ๋ฅ ,
		DECODE(JOB_CODE,'J7',SALARY*1.2,'J6',SALARY*1.15, 'J5',SALARY*1.1,SALARY*1.05) "์ธ์ƒ๋œ ๊ธ‰์—ฌ"
 FROM EMPLOYEE;

CASE WHEN ์กฐ๊ฑด์‹ THEN ๊ฒฐ๊ณผ๊ฐ’
CASE WHEN ์กฐ๊ฑด์‹ THEN ๊ฒฐ๊ณผ๊ฐ’
ELSE ๊ฒฐ๊ณผ๊ฐ’
END

: ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’ ๋˜๋Š” ์ปฌ๋Ÿผ์ด ์กฐ๊ฑด์‹๊ณผ ๊ฐ™์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜ (์กฐ๊ฑด์€ ๋ฒ”์œ„ ๊ฐ’ ๊ฐ€๋Šฅ)

[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ๊ธ‰์—ฌ๊ฐ€ 500๋งŒ์› ์ด์ƒ์ด๋ฉด '๋Œ€',
			๊ธ‰์—ฌ๊ฐ€ 300๋งŒ์› ์ด์ƒ500๋งŒ์› ๋ฏธ๋งŒ์ด๋ฉด '์ค‘', ๊ธ‰์—ฌ๊ฐ€ 300๋งŒ์› ๋ฏธ๋งŒ '์†Œ'์œผ๋กœ ์กฐํšŒ]
SELECT EMP_NAME, SALARY, 
		CASE WHEN SALARY >= 5000000 THEN '๋Œ€'
			 WHEN SALARY >= 3000000 THEN '์ค‘'
			 ELSE '์†Œ'
			 END "๊ธ‰์—ฌ ๋ฐ›๋Š” ์ •๋„"
FROM EMPLOYEE;	

๐Ÿ“• ๊ทธ๋ฃน ํ•จ์ˆ˜

: ํ•˜๋‚˜ ์ด์ƒ์˜ ํ–‰์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด ์—ฐ์‚ฐํ•˜์—ฌ ์ดํ•ฉ, ํ‰๊ท  ๋“ฑ์˜ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ ํ–‰์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

SUM(์ˆซ์ž๊ฐ€ ๊ธฐ๋ก๋œ ์ปฌ๋Ÿผ๋ช…) : ํ•ฉ๊ณ„

[๋ชจ๋“  ์ง์›์˜ ๊ธ‰์—ฌ ํ•ฉ]
SELECT SUM(SALARY) FROM EMPLOYEE; -- 70096240

AVG(์ˆซ์ž๊ฐ€ ๊ธฐ๋ก๋œ ์ปฌ๋Ÿผ๋ช…) : ํ‰๊ท 

[์ „์ง์› ๊ธ‰์—ฌ ํ‰๊ท ]
SELECT ROUND(AVG(SALARY)) FROM EMPLOYEE; -- 3047663
[๋ถ€์„œ์ฝ”๋“œ๊ฐ€ 'D9'์ธ ์‚ฌ์›๋“ค์˜ ๊ธ‰์—ฌ ํ•ฉ, ํ‰๊ท ]
SELECT SUM(SALARY), ROUND(AVG(SALARY)) --ํ•ด์„ ์ˆœ์„œ 3
FROM EMPLOYEE -- ํ•ด์„ ์ˆœ์„œ 1
WHERE DEPT_CODE ='D9'; -- ํ•ด์„ ์ˆœ์„œ 2

MIN(์ปฌ๋Ÿผ๋ช…) : ์ตœ์†Ÿ๊ฐ’
MAX(์ปฌ๋Ÿผ๋ช…) : ์ตœ๋Œ€๊ฐ’
โžก ํƒ€์ž… ์ œํ•œ ์—†์Œ (์ˆซ์ž : ๋Œ€/์†Œ, ๋‚ ์งœ : ๊ณผ๊ฑฐ/๋ฏธ๋ž˜, ๋ฌธ์ž์—ด : ๋ฌธ์ž ์ˆœ์„œ)

[๊ธ‰์—ฌ ์ตœ์†Œ๊ฐ’, ๊ฐ€์žฅ ๋น ๋ฅธ ์ž…์‚ฌ์ผ, ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅธ ์ด๋ฉ”์ผ์„ ์กฐํšŒ]
SELECT MIN(SALARY), MIN(HIRE_DATE), MIN(EMAIL)
FROM EMPLOYEE;
[๊ธ‰์—ฌ ์ตœ๋Œ€๊ฐ’, ๊ฐ€์žฅ ๋А๋ฆฐ ์ž…์‚ฌ์ผ, ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ๋А๋ฆฐ ์ด๋ฉ”์ผ์„ ์กฐํšŒ]
SELECT MAX(SALARY), MAX(HIRE_DATE), MAX(EMAIL)
FROM EMPLOYEE;
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ๊ธ‰์—ฌ๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ์›์˜ ์ด๋ฆ„, ๊ธ‰์—ฌ, ์ง๊ธ‰์ฝ”๋“œ๋ฅผ ์กฐํšŒ]
SELECT EMP_NAME, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE SALARY = (SELECT MAX(SALARY)FROM EMPLOYEE);
โžก ์„œ๋ธŒ์ฟผ๋ฆฌ + ๊ทธ๋ฃนํ•จ์ˆ˜
  • COUNT() : ํ–‰ ๊ฐœ์ˆ˜๋ฅผ ํ—ค์•„๋ ค์„œ ๋ฆฌํ„ด
  • COUNT([DISTINCT] ์ปฌ๋Ÿผ๋ช…) : ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ํ–‰์˜ ๊ฐœ์ˆ˜๋ฅผ ํ—ค์•„๋ ค์„œ ๋ฆฌํ„ดํ•จ
  • COUNT(*) : NULL์„ ํฌํ•จํ•œ ์ „์ฒด ํ–‰ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด
  • COUNT(์ปฌ๋Ÿผ๋ช…) : NULL์„ ์ œ์™ธํ•œ ์‹ค์ œ ๊ฐ’์ด ๊ธฐ๋ก๋œ ํ–‰์˜ ๊ฐœ์ˆ˜๋งŒ ๋ฆฌํ„ดํ•จ
SELECT COUNT(*) FROM EMPLOYEE; -- 23ํ–‰, EMPLOYEE ํ…Œ์ด๋ธ”์˜ ํ–‰์˜ ๊ฐœ์ˆ˜
[BONUS๋ฅผ ๋ฐ›๋Š” ์‚ฌ์›์˜ ์ˆ˜]
SELECT COUNT(*) 
FROM EMPLOYEE
WHERE BONUS IS NOT NULL; -- 9
SELECT COUNT(BONUS) 
FROM EMPLOYEE; --9 WHY? NULL์„ ์ œ์™ธํ•œ ์‹ค์ œ ๊ฐ’์ด ๊ธฐ๋ก๋œ ํ–‰์˜ ๊ฐœ์ˆ˜๋งŒ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ
SELECT DISTINCT DEPT_CODE FROM EMPLOYEE; --7ํ–‰
SELECT COUNT(DISTINCT DEPT_CODE) FROM EMPLOYEE; --6ํ–‰
--> WHY ? ์œ„์™€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š”๊ฐ€? NULL ๊ฐ’์ด ํฌํ•จ๋˜์ง€ ์•Š์•„์„œ์ด๋‹ค.
-- COUNT(์ปฌ๋Ÿผ๋ช…) ์— ์˜ํ•ด NULL์„ ์ œ์™ธํ•œ ์‹ค์ œ ๊ฐ’์ด ์žˆ๋Š” ํ–‰์˜ ๊ฐœ์ˆ˜๋งŒ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์„ฑ๋ณ„์ด ๋‚จ์„ฑ์ธ ์‚ฌ์›์˜ ์ˆ˜ ์กฐํšŒ]
SELECT COUNT(*) 
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO,8,1) = '1'; -- 15๋ช…
SELECT SUM(DECODE(SUBSTR(EMP_NO,8,1), '1',1,0))
FROM EMPLOYEE; --15๋ช…

๐Ÿ’ก SELECT ๋ฌธ ํ•ด์„ ์ˆœ์„œ

  • ํ•ด์„5: SELECT ์ปฌ๋Ÿผ๋ช… AS ๋ณ„์นญ, ๊ณ„์‚ฐ์‹, ํ•จ์ˆ˜์‹
  • ํ•ด์„1: FROM ํ…Œ์ด๋ธ”๋ช…
    ํ•ด์„2: WHERE ์ปฌ๋Ÿผ๋ช… | ํ•จ์ˆ˜์‹ ๋น„๊ต์—ฐ์‚ฐ์ž ๋น„๊ต๊ฐ’
    ํ•ด์„3: GROUP BY ๊ทธ๋ฃน์„ ๋ฌถ์„ ์ปฌ๋Ÿผ๋ช…
  • ํ•ด์„4: HAVING ๊ทธ๋ฃนํ•จ์ˆ˜์‹ ๋น„๊ต์—ฐ์‚ฐ์ž ๋น„๊ต๊ฐ’
  • ํ•ด์„6: ORDER BY ์ปฌ๋Ÿผ๋ช… | ๋ณ„์นญ | ์ปฌ๋Ÿผ์ˆœ๋ฒˆ ์ •๋ ฌ๋ฐฉ์‹(ASC/DESC) [NULLS FIRST | LAST]
โ” NULLS FIRST | LAST 
NULL ๊ฐ’์ด ์•ž์— ๋‚˜์˜ค๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€ ๋’ค์— ๋‚˜์˜ค๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋œป ํ•จ.




GROUP BY HAVING

โ” GROUP BY ์ ˆ

: ๊ฐ™์€ ๊ฐ’๋“ค์ด ์—ฌ๋Ÿฌ๊ฐœ ๊ธฐ๋ก๋œ ์ปฌ๋Ÿผ์„ ๊ฐ€์ง€๊ณ  ๊ฐ™์€ ๊ฐ’๋“ค์„ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์Œ

GROUP  BY ์ปฌ๋Ÿผ๋ช… | ํ•จ์ˆ˜์‹, ...
  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ๋ฌถ์—์„œ ํ•˜๋‚˜๋กœ ์ฒ˜๋ฆฌํ•  ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•จ.
  • ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์€ ๊ฐ’์— ๋Œ€ํ•ด์„œ SELECT์ ˆ์—์„œ ๊ทธ๋ฃนํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•จ.
  • ๊ทธ๋ฃนํ•จ์ˆ˜๋Š” ๋‹จ ํ•œ๊ฐœ์˜ ๊ฒฐ๊ณผ ๊ฐ’๋งŒ ์‚ฐ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฃน์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ์‚ฐ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ฃนํ•จ์ˆ˜๊ฐ€ ์ ์šฉ๋œ ๊ธฐ๋ถ„์„ ORDER BY์ ˆ์— ๊ธฐ์ˆ ํ•˜์—ฌ ์‚ฌ์šฉ
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ๋ถ€์„œ์ฝ”๋“œ, ๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ ํ•ฉ ์กฐํšŒ]
--1) ๋ถ€์„œ์ฝ”๋“œ๋งŒ ์กฐํšŒ
SELECT DEPT_CODE FROM EMPLOYEE; --23ํ–‰
--2) ์ „์ฒด ๊ธ‰์—ฌ ํ•ฉ ์กฐํšŒ
SELECT SUM(SALARY) FROM EMPLOYEE; --1ํ–‰
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE;
-- ์˜ค๋ฅ˜ ๋ฐœ์ƒ ORA-00937: ๋‹จ์ผ ๊ทธ๋ฃน์˜ ๊ทธ๋ฃน ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค
--์˜ค๋ฅ˜ ๋ฐœ์ƒํ•œ ์œ„ ๋‚ด์šฉ ์•Œ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜๊ธฐ!
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE; --> DEPT_CODE๊ฐ€ ๊ฐ™์€ ํ–‰๋ผ๋ฆฌ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์ด ๋จ.

[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์ง๊ธ‰์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ์‚ฌ๋žŒ์˜ ์ง๊ธ‰์ฝ”๋“œ, ๊ธ‰์—ฌํ‰๊ท , ์ธ์›์ˆ˜๋ฅผ ์ง๊ธ‰์ฝ”๋“œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์กฐํšŒ]
SELECT JOB_CODE, ROUND(AVG(SALARY)),COUNT(*)
FROM EMPLOYEE
GROUP BY JOB_CODE
ORDER BY JOB_CODE ;
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์„ฑ๋ณ„(๋‚จ/์—ฌ)๊ณผ ๊ฐ ์„ฑ๋ณ„ ๋ณ„ ์ธ์› ์ˆ˜, ๊ธ‰์—ฌ ํ•ฉ์„ ์ธ์› ์ˆ˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์กฐํšŒ]
SELECT DECODE(SUBSTR(EMP_NO,8,1),'1', '๋‚จ', '2','์—ฌ') ์„ฑ๋ณ„ ,
				COUNT(*) "์ธ์› ์ˆ˜" , SUM(SALARY) "๊ธ‰์—ฌ ํ•ฉ"  
FROM EMPLOYEE
GROUP BY DECODE(SUBSTR(EMP_NO,8,1),'1', '๋‚จ', '2','์—ฌ') 
					--> ๋ณ„์นญ์‚ฌ์šฉ์ด ์•ˆ๋œ๋‹ค! ๋ณ„์นญ ๋˜๋Š” ์ปฌ๋Ÿผ์ˆœ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉดX SELECT์ ˆ์„ ํ•ด์„ํ•˜๊ธฐ ์ „์ด๊ธฐ ๋•Œ๋ฌธ
ORDER BY "์ธ์› ์ˆ˜" ; --> ํ•ด์„์ˆœ์„œ๋กœ ์ธํ•ด ๋ณ„์นญ ์‚ฌ์šฉO

๐Ÿ“– WHERE์ ˆ GROUP BY ์ ˆ์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ

[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ๋ถ€์„œ์ฝ”๋“œ๊ฐ€ D5, D6์ธ ๋ถ€์„œ์˜ ํ‰๊ท  ๊ธ‰์—ฌ, ์ธ์› ์ˆ˜ ์กฐํšŒ]
SELECT DEPT_CODE, ROUND(AVG(SALARY)), COUNT(*)
FROM EMPLOYEE
WHERE DEPT_CODE IN('D5','D6')
GROUP BY DEPT_CODE ;
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์ง๊ธ‰๋ณ„ 2000๋…„๋„ ์ดํ›„ (2000๋…„ ํฌํ•จ) ์ž…์‚ฌ์ž๋“ค์˜ ๊ธ‰์—ฌ ํ•ฉ์„ ์กฐํšŒ (์ง๊ธ‰์ฝ”๋“œ ์˜ค๋ฆ„์ฐจ์ˆœ)]
SELECT JOB_CODE , SUM(SALARY) 
FROM EMPLOYEE
๋ฐฉ๋ฒ• 1 - WHERE HIRE_DATE >= TO_DATE('2000-01-01') 
๋ฐฉ๋ฒ• 2 - WHERE EXTRACT (YEAR FROM HIRE_DATE) >= 2000
๋ฐฉ๋ฒ• 3 - WHERE SUBSTR(TO_CHAR(HIRE_DATE, 'YYYY'),1,4) >= '2000'
GROUP BY JOB_CODE
ORDER BY 1;

GROUP BY์ ˆ์€ ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์„ ๋ฌถ์–ด์„œ ๊ทธ๋ฃน์œผ๋กœ ์ง€์ • ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ๊ทธ๋ฃน ๋‚ด ๊ทธ๋ฃน์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ!
ํ•˜์ง€๋งŒ ์ฃผ์˜์‚ฌํ•ญ์ด ์žˆ๋‹ค..!

โ— GROUP BY ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ
SELECT ๋ฌธ์— GROUP BY ์ ˆ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, SELECT ์ ˆ์— ๋ช…์‹œํ•œ ์กฐํšŒํ•˜๋ ค๋Š” ์ปฌ๋Ÿผ ์ค‘ ๊ทธ๋ฃน ํ•จ์ˆ˜๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์€ ์ปฌ๋Ÿผ์„ ๋ชจ๋‘ GROUP BY ์ ˆ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค ๐Ÿ‘€

 [EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ๋ถ€์„œ๋ณ„๋กœ ๊ฐ™์€ ์ง๊ธ‰์ธ ์‚ฌ์›์˜ ์ˆ˜๋ฅผ ์กฐํšŒ/ ๋ถ€์„œ์ฝ”๋“œ ์˜ค๋ฆ„์ฐจ์ˆœ, ์ง๊ธ‰์ฝ”๋“œ ๋‚ด๋ฆผ์ฐจ์ˆœ]
SELECT DEPT_CODE, JOB_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY DEPT_CODE , JOB_CODE 
โžกDEPT_CODE๋กœ ๊ทธ๋ฃน์„ ๋‚˜๋ˆ„๊ณ , ๋‚˜๋ˆ ์ง„ ๊ทธ๋ฃน๋‚ด์—์„œ JOB_CODE๋กœ ๋˜ ๊ทธ๋ฃน์„ ๋ถ„๋ฅ˜(=>์„ธ๋ถ„ํ™”)
ORDER BY DEPT_CODE, JOB_CODE DESC;
โžก GROUP BY ํ‘œํ˜„์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.

๐Ÿ“– HAVING ์ ˆ

: ๊ทธ๋ฃนํ•จ์ˆ˜๋กœ ๊ตฌํ•ด ์˜ฌ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉ

HAVING ์ปฌ๋Ÿผ๋ช… | ํ•จ์ˆ˜์‹ ๋น„๊ต์—ฐ์‚ฐ์ž ๋น„๊ต๊ฐ’
[๋ถ€์„œ๋ณ„ ํ‰๊ท  ๊ธ‰์—ฌ๊ฐ€ 3๋ฐฑ๋งŒ์› ์ด์ƒ์ธ ๋ถ€์„œ๋ฅผ ์กฐํšŒ(๋ถ€์„œ์ฝ”๋“œ ์˜ค๋ฆ„์ฐจ์ˆœ)]
SELECT DEPT_CODE , ROUND(AVG(SALARY))
FROM EMPLOYEE
-- WHERE AVG(SALARY) >= 3000000 
โžก ํ•œ์‚ฌ๋žŒ์˜ ๊ธ‰์—ฌ๊ฐ€ 3๋ฐฑ๋งŒ ์ด์ƒ์ด๋ผ๋Š” ์กฐ๊ฑด์ด๊ธฐ์— ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ์กฑX/๋ถ€์„œ๋ณ„ ํ‰๊ท ๊ธ‰์—ฌ๋กœ ๊ตฌํ•ด์•ผํ•จ! 
โžก WHERE ์ ˆ์€ ํ…Œ์ด๋ธ” ๋‹น ํ•˜๋‚˜ํ•˜๋‚˜์˜ ์กฐ๊ฑด์„ ๊ตฌํ•˜๋Š” ๊ฒƒ !
GROUP BY DEPT_CODE
HAVING AVG(SALARY) >=3000000 
โžกDEPT_CODE ๊ทธ๋ฃน ์ค‘ ๊ธ‰์—ฌ ํ‰๊ท ์ด 3๋ฐฑ๋งŒ ์ด์ƒ์ธ ๊ทธ๋ฃน๋งŒ ์กฐํšŒ
โžก HAVING์€ ํ…Œ์ด๋ธ”์˜ ๊ทธ๋ฃน์˜ ์กฐ๊ฑด์„ ๊ตฌํ•˜๋Š” ๊ฒƒ!(๋ฐ˜๋“œ์‹œ ๊ทธ๋ฃนํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค)
ORDER BY DEPT_CODE ;
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์ง๊ธ‰๋ณ„ ์ธ์›์ˆ˜๊ฐ€ 5๋ช… ์ดํ•˜์ธ ์ง๊ธ‰์ฝ”๋“œ, ์ธ์›์ˆ˜ ์กฐํšŒ(์ง๊ธ‰์ฝ”๋“œ ์˜ค๋ฆ„์ฐจ์ˆœ)]
SELECT JOB_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY JOB_CODE
HAVING COUNT(*)<=5 โžก HAVING ์ ˆ์—์„œ๋Š” ๊ทธ๋ฃน ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ž‘์„ฑ๋œ๋‹ค!!!
ORDER BY 1;

๐Ÿ“– ์ง‘๊ณ„ ํ•จ์ˆ˜(ROLLUP, CUBE)

: ๊ทธ๋ฃน ๋ณ„ ์‚ฐ์ถœ ๊ฒฐ๊ณผ ๊ฐ’์˜ ์ง‘๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜ (๊ทธ๋ฃน๋ณ„๋กœ ์ค‘๊ฐ„ ์ง‘๊ณ„ ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€)
โžก GROUP BY ์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜!

  • ROLLUP : GROUUP BY ์ ˆ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์ž‘์„ฑ๋œ ์ปฌ๋Ÿผ์˜ ์ค‘๊ฐ„ ์ง‘๊ฒŒ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
SELECT DEPT_CODE, JOB_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY ROLLUP(DEPT_CODE , JOB_CODE)
ORDER BY 1;
  • CUBE : GROUP BY ์ ˆ์— ์ž‘์„ฑ๋œ ๋ชจ๋“  ์ปฌ๋Ÿผ์˜ ์ค‘๊ฐ„ ์ง‘๊ณ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
SELECT DEPT_CODE, JOB_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY CUBE(DEPT_CODE , JOB_CODE)
ORDER BY 1;

๐Ÿ“– SET OPERATOR (์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž)

: ์—ฌ๋Ÿฌ SELECT์˜ ๊ฒฐ๊ณผ(RESULT SET)๋ฅผ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋กœ ๋งŒ๋“œ๋Š” ์—ฐ์‚ฐ์ž

  • UNION (ํ•ฉ์ง‘ํ•ฉ) : ๋‘ SELECT ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์นจ (๋‹จ, ์ค‘๋ณต์€ ํ•œ๋ฒˆ๋งŒ ์ž‘์„ฑ)
  • INTERECT (๊ต์ง‘ํ•ฉ) : ๋‘ SELECT ๊ฒฐ๊ณผ ์ค‘ ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„๋งŒ ์กฐํšŒ
  • UNION ALL : UNION + INTERSECT ํ•ฉ์ง‘ํ•ฉ์—์„œ ์ค‘๋ณต ๋ถ€๋ถ„ ์ œ๊ฑฐ X
  • MINUS (์ฐจ์ง‘ํ•ฉ) : A ์—์„œ A, B ๊ต์ง‘ํ•ฉ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๊ณ  ์กฐํšŒ
[EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ๋ถ€์„œ์ฝ”๋“œ๊ฐ€ 'D5' ์ธ ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๋ถ€์„œ์ฝ”๋“œ, ๊ธ‰์—ฌ]
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY 
FROM EMPLOYEE
WHERE DEPT_CODE  = 'D5';
[๊ธ‰์—ฌ๊ฐ€ 300๋งŒ ์ดˆ๊ณผ์ธ ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๋ถ€์„œ์ฝ”๋“œ, ๊ธ‰์—ฌ]
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;

โžก ๊ทธ๋ ‡๋‹ค๋ฉด ๋‘๊ฐ€์ง€์˜ ๋‚ด์šฉ์„ ์ง‘ํ•ฉ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜์—ฌ ๋‚˜ํƒ€๋‚ด๋ณด๊ธฐ!!

1. UNION
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY 
FROM EMPLOYEE
WHERE DEPT_CODE  = 'D5'
UNION 
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
โžก์ค‘๋ณต๊ฐ’ ์ œ๊ฑฐ๋˜๊ณ  ํ•ฉ์นœ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ํ•œ๋ฒˆ๋งŒ ์ž‘์„ฑ๋œ๋‹ค (์‹ฌ๋ด‰์„ , ๋Œ€๋ถํ˜ผ์ด ์ค‘๋ณต๋˜์–ด ํ•œ๋ฒˆ๋งŒ ๋‚˜์˜ด)

2. INTERSECT
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY 
FROM EMPLOYEE
WHERE DEPT_CODE  = 'D5'
INTERSECT 
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
โžก์ค‘๋ณต๋˜๋Š” ์‚ฌ๋žŒ๋งŒ ๋‚˜์˜ด (์‹ฌ๋ด‰์„ , ๋Œ€๋ถํ˜ผ๋งŒ ๋‚˜์˜ด)

3. UNION ALL
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY 
FROM EMPLOYEE
WHERE DEPT_CODE  = 'D5'
UNION ALL
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
โžก ํ•ฉ์ง‘ํ•ฉ์—์„œ ์ค‘๋ณต์ œ๊ฑฐ ์•ˆํ•˜๊ณ  ๋‚˜์˜ค๋Š” ๊ฒƒ (์‹ฌ๋ด‰์„ , ๋Œ€๋ถํ˜ผ ๋‘๋ฒˆ์”ฉ ๋‚˜์˜ด)

4. MINUS
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY 
FROM EMPLOYEE
WHERE DEPT_CODE  = 'D5'
MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
โžก A(์•ž์— ์ ์€ ๊ฒƒ)๋ž‘ B(๋’ค์— ์ ์€ ๊ฒƒ)์˜ ๊ต์ง‘ํ•ฉ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‚˜๋จธ์ง€๊ฐ€ ๋‚˜์˜ด (์‹ฌ๋ด‰์„ , ๋Œ€๋ถํ˜ผ ๋นผ๊ณ  ๋‚˜์˜ด)

โ—โ— ์ง‘ํ•ฉ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

์กฐํšŒํ•˜๋Š” ์ปฌ๋Ÿผ์˜ ํƒ€์ž…(๋ฌธ์ž-๋ฌธ์ž/ ์ˆซ์ž-์ˆซ์ž ๋“ฑ), ๊ฐœ์ˆ˜๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค!! ๐Ÿ‘€

SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY 
FROM EMPLOYEE
WHERE DEPT_CODE  = 'D5'
UNION 
SELECT  EMP_ID , EMP_NAME , DEPT_CODE ,1
FROM EMPLOYEE
WHERE SALARY > 3000000;
ํ…Œ์ด๋ธ”์ด ๋‹ฌ๋ผ๋„ ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๊ดœ์ฐฎ์Œ!
โžก ์ฆ‰, ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์ด์ง€๋งŒ ์ปฌ๋Ÿผ์˜ ํƒ€์ž…, ๊ฐœ์ˆ˜๋งŒ ์ผ์น˜ํ•˜๋ฉด ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ๊ฐ€๋Šฅ!
SELECT EMP_ID , EMP_NAME FROM EMPLOYEE
UNION 
SELECT DEPT_ID, DEPT_TITLE FROM DEPARTMENT;



JOIN

[JOIN ์šฉ์–ด ์ •๋ฆฌ]

์˜ค๋ผํดSQL : 1999ํ‘œ์ค€(ANSI)
๋“ฑ๊ฐ€ ์กฐ์ธ๋‚ด๋ถ€ ์กฐ์ธ(INNER JOIN), JOIN USING / ON
+ ์ž์—ฐ ์กฐ์ธ(NATURAL JOIN, ๋“ฑ๊ฐ€ ์กฐ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜)
ํฌ๊ด„ ์กฐ์ธ์™ผ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ(LEFT OUTER), ์˜ค๋ฅธ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ(RIGHT OUTER)
+ ์ „์ฒด ์™ธ๋ถ€ ์กฐ์ธ(FULL OUTER, ์˜ค๋ผํด ๊ตฌ๋ฌธ์œผ๋กœ๋Š” ์‚ฌ์šฉ ๋ชปํ•จ)
์ž์ฒด ์กฐ์ธ, ๋น„๋“ฑ๊ฐ€ ์กฐ์ธJOIN ON
์นดํ…Œ์‹œ์•ˆ(์นดํ‹ฐ์…˜) ๊ณฑ๊ต์ฐจ ์กฐ์ธ(CROSS JOIN)
CARTESIAN PRODUCT
  • ๋ฏธ๊ตญ ๊ตญ๋ฆฝ ํ‘œ์ค€ ํ˜‘ํšŒ(American National Standards Institute, ANSI) ๋ฏธ๊ตญ์˜ ์‚ฐ์—… ํ‘œ์ค€์„ ์ œ์ •ํ•˜๋Š” ๋ฏผ๊ฐ„๋‹จ์ฒด.
  • ๊ตญ์ œํ‘œ์ค€ํ™”๊ธฐ๊ตฌ ISO์— ๊ฐ€์ž…๋˜์–ด ์žˆ์Œ.

๐Ÿ“• JOIN

  • ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ.
  • ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” ํ•˜๋‚˜์˜ Result Set์œผ๋กœ ๋‚˜์˜ด.
  • JOIN์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ํ•˜๋‚˜์”ฉ ์ด์–ด ๋ถ™์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค!
  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ SQL์„ ์ด์šฉํ•ด ํ…Œ์ด๋ธ”๊ฐ„ '๊ด€๊ณ„'๋ฅผ ๋งบ๋Š” ๋ฐฉ๋ฒ•
  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”์— ๋‹ด๊ณ  ์žˆ์–ด ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒํ•˜๋ ค๋ฉด ํ•œ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€์•ผ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
    ์ด ๋•Œ, ํ…Œ์ด๋ธ”๊ฐ„ ๊ด€๊ณ„๋ฅผ ๋งบ๊ธฐ ์œ„ํ•œ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ์—ญํ• ์ด ํ•„์š”ํ•œ๋ฐ, ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ปฌ๋Ÿผ์ด ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ€ ๋จ.

โžก ๊ธฐ์กด์— ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ ํ•  ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๋”ฐ๋กœ ์กฐํšŒํ•จ.

[์ง์›๋ฒˆํ˜ธ, ์ง์›๋ช…, ๋ถ€์„œ์ฝ”๋“œ, ๋ถ€์„œ๋ช…์„ ์กฐํšŒํ•˜๊ณ ์ž ํ•  ๋•Œ]
SELECT EMP_ID, EMP_NAME, DEPT_CODE
FROM EMPLOYEE;
[๋ถ€์„œ๋ช…์€ DEPARTMENT ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒ ๊ฐ€๋Šฅ]
SELECT DEPT_ID, DEPT_TITLE
FROM DEPARTMENT;
[JOIN ์‚ฌ์šฉํ•˜์—ฌ ๋‘๊ฐœ์˜ ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒ๊ฐ€๋Šฅ]
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
[์ž‘์„ฑ ๋ฐฉ๋ฒ•]
ANSI ๊ตฌ๋ฌธ์˜ค๋ผํด ๊ตฌ๋ฌธ
โžก ANSI์—์„œ USING๊ณผ ON์„ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

๐Ÿ“– 1. ๋‚ด๋ถ€ ์กฐ์ธ(INNER JOIN) (= ๋“ฑ๊ฐ€ ์กฐ์ธ(EQUAL JOIN))

โžก ์—ฐ๊ฒฐ๋˜๋Š” ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ํ–‰๋“ค๋งŒ ์กฐ์ธ๋จ.(์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์—†๋Š” ํ–‰์€ ์กฐ์ธ์—์„œ ์ œ์™ธ๋จ)

ANSI
-์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•  ์ปฌ๋Ÿผ๋ช…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ ON()์„ ์‚ฌ์šฉ
(์˜ค๋ผํด ๋ฌธ๋ฒ• ๋ณด๋‹ค๋Š” ANSI ๋ฌธ๋ฒ•์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•จ)

SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

์˜ค๋ผํด

  • ์—ฐ๊ฒฐํ•  ํ…Œ์ด๋ธ”์„ FROM์ ˆ ์˜†์— , ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ๋ฐ‘์— ์กฐ๊ฑด์œผ๋กœ ์ปฌ๋Ÿผ๋ช…์ด ๊ฐ™์„ ๋•Œ ๋ผ๋Š” ์กฐ๊ฑด์„ ๋„ฃ์–ด์คŒ.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID ;

๐Ÿ“– DEPARTMENT ํ…Œ์ด๋ธ”, LOCATION ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜์—ฌ ๋ถ€์„œ๋ช…, ์ง€์—ญ๋ช… ์กฐํšŒํ•˜๊ธฐ

 DEPARTMENT ํ…Œ์ด๋ธ”
 DEPT_ID|DEPT_TITLE|LOCATION_ID|
-------+----------+-----------+
D1     |์ธ์‚ฌ๊ด€๋ฆฌ๋ถ€     |L1         |
D2     |ํšŒ๊ณ„๊ด€๋ฆฌ๋ถ€     |L1         |
D3     |๋งˆ์ผ€ํŒ…๋ถ€      |L1         |
D4     |๊ตญ๋‚ด์˜์—…๋ถ€     |L1         |
D5     |ํ•ด์™ธ์˜์—…1๋ถ€    |L2         |
D6     |ํ•ด์™ธ์˜์—…2๋ถ€    |L3         |
D7     |ํ•ด์™ธ์˜์—…3๋ถ€    |L4         |
D8     |๊ธฐ์ˆ ์ง€์›๋ถ€     |L5         |
D9     |์ด๋ฌด๋ถ€       |L1         |
LOCATION ํ…Œ์ด๋ธ”
LOCAL_CODE|NATIONAL_CODE|LOCAL_NAME|
----------+-------------+----------+
L1        |KO           |ASIA1     |
L2        |JP           |ASIA2     |
L3        |CH           |ASIA3     |
L4        |US           |AMERICA   |
L5        |RU           |EU        |

1) ์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•  ๋‘ ์ปฌ๋Ÿผ๋ช…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ

ANSI ๋ฐฉ์‹

SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT
JOIN LOCATION ON (LOCATION_ID  = LOCAL_CODE);

์˜ค๋ผํด ๋ฐฉ์‹

SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT, LOCATION 
WHERE  LOCATION_ID  = LOCAL_CODE;

2) ์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•  ๋‘ ์ปฌ๋Ÿผ๋ช…์ด ๊ฐ™์€ ๊ฒฝ์šฐ

[EMPLOYEE ํ…Œ์ด๋ธ”, JOBํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ์ง๊ธ‰์ฝ”๋“œ, ์ง๊ธ‰๋ช… ์กฐํšŒ

ANSI

  • ์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•  ์ปฌ๋Ÿผ๋ช…์ด ๊ฐ™์€ ๊ฒฝ์šฐ USING(์ปฌ๋Ÿผ๋ช…)์„ ์‚ฌ์šฉํ•จ
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);

์˜ค๋ผํด ( ๋ณ„์นญ ์‚ฌ์šฉ )

  • ํ…Œ์ด๋ธ” ๋ณ„๋กœ ๋ณ„์นญ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์˜ค๋ผํด์€ ๋ณ„์นญ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
SELECT EMP_ID,EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE  ,JOB
WHERE JOB_CODE  = JOB_CODE;
โžก ORA-00918: ์—ด์˜ ์ •์˜๊ฐ€ ์• ๋งคํ•ฉ๋‹ˆ๋‹ค โžก ๋ณ„์นญ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ด์œ  

๋”ฐ๋ผ์„œ

SELECT EMP_ID,EMP_NAME, E.JOB_CODE, JOB_NAME
-- (= SELECT EMP_ID,EMP_NAME, J.JOB_CODE, JOB_NAME)
FROM EMPLOYEE  E ,JOB J
WHERE E.JOB_CODE  = J.JOB_CODE;

๐Ÿ‘€ INNER(๋‚ด๋ถ€ ์กฐ์ธ) ๋ฌธ์ œ์ 
โžก ์—ฐ๊ฒฐ์— ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ์— ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์กฐํšŒ ๊ฒฐ๊ณผ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.!


๐Ÿ“– 2. ์™ธ๋ถ€ ์กฐ์ธ (OUTER JOIN)

โžก ๋‘ ํ…Œ์ด๋ธ”์˜ ์ง€์ •ํ•˜๋Š” ์ปฌ๋Ÿผ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ–‰๋„ ์กฐ์ธ์— ํฌํ•จ ์‹œํ‚ด
(โ— ๋ฐ˜๋“œ์‹œ OUTER JOIN ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.)

[OUTER JOIN๊ณผ ๋น„๊ตํ•  INNER JOIN ์ฟผ๋ฆฌ๋ฌธ]
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
INNER (์ƒ๋žต๊ฐ€๋Šฅ)JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

1) LEFT [OUTER] JOIN : ํ•ฉ์น˜๊ธฐ์— ์‚ฌ์šฉํ•œ ๋‘ ํ…Œ์ด๋ธ” ์ค‘ ์™ผํŽธ์— ๊ธฐ์ˆ ๋œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ˆ˜๋กœ JOIN
โžก ์™ผํŽธ์— ์ž‘์„ฑ๋œ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์ด ๊ฒฐ๊ณผ์— ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค(JOIN์ด ์•ˆ๋˜๋Š” ํ–‰๋„ ๊ฒฐ๊ณผ์— ํฌํ•จ)

ANSI ํ‘œ์ค€

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT
ON( DEPT_CODE = DEPT_ID);-- 23ํ–‰ (ํ•˜๋™์šด,์ด์˜ค๋ฆฌ ํฌํ•จ)

์˜ค๋ผํด ๊ตฌ๋ฌธ

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID (+); 

โœ” ๋ฐ˜๋Œ€์ชฝ ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ์— (+) ๊ธฐํ˜ธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•จ !

2) RIGHT [ OUTER ] JOIN : ํ•ฉ์น˜๊ธฐ์— ์‚ฌ์šฉํ•œ ๋‘ ํ…Œ์ด๋ธ” ์ค‘
-์˜ค๋ฅธํŽธ์— ๊ธฐ์ˆ ๋œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ JOIN

ANSI ํ‘œ์ค€

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE RIGHT JOIN DEPARTMENT
ON( DEPT_CODE = DEPT_ID); 
โžก EMPLOYEE ๋ถ€์„œ์— ์—†๋Š” ๋ถ€์„œ๋“ค๋„ ํ•จ๊ป˜ ๋‚˜ํƒ€๋‚จ. (NULL๋กœ)
โœ” ๋งˆ์ผ€ํŒ… ๋ถ€, ๊ตญ๋‚ด์˜์—…๋ถ€, ํ•ด์™ธ ์˜์—…3๋ถ€ NULL

์˜ค๋ผํด ๊ตฌ๋ฌธ

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID ; 

3) FULL[OUTER] JOIN : ํ•ฉ์น˜๊ธฐ์— ์‚ฌ์šฉํ•œ ๋‘ ํ…Œ์ด๋ธ”์ด ๊ฐ€์ง„
โ—พ ๋ชจ๋“  ํ–‰์„ ๊ฒฐ๊ณผ์— ํฌํ•จ
(์˜ค๋ผํด ๊ตฌ๋ฌธ FULL OUTER JOIN์„ ์‚ฌ์šฉ โŒ)

ANSI ํ‘œ์ค€

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE FULL JOIN DEPARTMENT
ON( DEPT_CODE = DEPT_ID); โžก ํฌํ•จํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฐ’์ด ๋‹ค ๋‚˜์˜ด

์˜ค๋ผํด ๊ตฌ๋ฌธ(์•ˆ๋จ!!!XX)

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID(+) ; 
โžก ORA-01468: outer-join๋œ ํ…Œ์ด๋ธ”์€ 1๊ฐœ๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์˜ค๋ฅ˜๋ฐœ์ƒ

๐Ÿ“– 3. ๊ต์ฐจ ์กฐ์ธ (CROSS JOIN == CARTESIAN PRODUCT)

โžก ์กฐ์ธ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰๋“ค์ด ๋ชจ๋‘ ๋งคํ•‘๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰๋˜๋Š” ๋ฐฉ๋ฒ•(๊ณฑ์ง‘ํ•ฉ)
(JOIN ๊ตฌ๋ฌธ์„ ์ž˜๋ชป ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ CROSS JOIN์˜ ๊ฒฐ๊ณผ๊ฐ€ ์กฐํšŒ๋จ)

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT; 
โžก207ํ–‰(EMPLOYEE)23ํ–‰*(DEPARTMENT)9ํ–‰ = 207ํ–‰

๐Ÿ“–4. ๋น„๋“ฑ๊ฐ€ ์กฐ์ธ(NON EQUAL JOIN)

: = (๋“ฑํ˜ธ)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์กฐ์ธ๋ฌธ
โžก ์ง€์ •ํ•œ ์ปฌ๋Ÿผ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹Œ, ๊ฐ’์˜ ๋ฒ”์œ„์— ํฌํ•จ๋˜๋Š” ํ–‰๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹

SELECT * FROM SAL_GRADE;
SELECT EMP_NAME, SAL_LEVEL FROM EMPLOYEE;
[์‚ฌ์›์˜ ๊ธ‰์—ฌ์— ๋”ฐ๋ฅธ ๊ธ‰์—ฌ ๋“ฑ๊ธ‰ ํŒŒ์•…ํ•˜๊ธฐ]
SELECT EMP_NAME, SALARY, SAL_GRADE.SAL_LEVEL โžก ๋‘ ํ…Œ์ด๋ธ”์˜ SAL_LEVEL์˜ ๋ช…์นญ์ด ๊ฐ™์•„์„œ ์–ด๋””์„œ ์˜ค๋Š” SAL_LEVEL์ธ์ง€ ํ‘œ์‹œํ•ด์ค˜์•ผํ•จ
FROM EMPLOYEE
JOIN SAL_GRADE ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);

๐Ÿ“– 5. ์ž์ฒด ์กฐ์ธ(SELF JOIN)

: ๊ฐ™์€ ํ…Œ์ด๋ธ”์„ ์กฐ์ธ. ์ž๊ธฐ ์ž์‹ ๊ณผ ์กฐ์ธ์„ ๋งบ์Œ
TIP! ๊ฐ™์€ ํ…Œ์ด๋ธ” 2๊ฐœ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  JOIN ์ง„ํ–‰

[์‚ฌ๋ฒˆ, ์ด๋ฆ„, ์‚ฌ์ˆ˜์˜ ์‚ฌ๋ฒˆ, ์‚ฌ์ˆ˜์˜ ์ด๋ฆ„ ์กฐํšŒ]
ANSIํ‘œ์ค€

SELECT E1.EMP_ID, E1.EMP_NAME, NVL(E1.MANAGER_ID,'์—†์Œ'),NVL(E2.EMP_NAME,'-')
FROM EMPLOYEE E1
LEFT JOIN EMPLOYEE E2 ON (E1.MANAGER_ID = E2.EMP_ID);
โžก๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ํ…Œ์ด๋ธ”์ธ์ง€ ๋ชจ๋ฅด๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ ๋”ฐ๋ผ์„œ ๋ณ„์นญ์„ ์ง€์ •ํ•˜์—ฌ ๊ฐ ์ปฌ๋Ÿผ๋ช… ์•ž์— ๋ช…์‹œํ•ด์ค€๋‹ค

์˜ค๋ผํด ๊ตฌ๋ฌธ

SELECT E1.EMP_ID, E1.EMP_NAME, NVL(E1.MANAGER_ID,'์—†์Œ'),NVL(E2.EMP_NAME,'-')
FROM EMPLOYEE E1, EMPLOYEE E2
WHERE E1.MANAGER_ID  = E2.EMP_ID(+);

๐Ÿ“– 6. ์ž์—ฐ ์กฐ์ธ(NATUAL JOIN)

: ๋™์ผํ•œ ํƒ€์ž…๊ณผ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ์ด ์žˆ๋Š” ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์กฐ์ธ์„ ๊ฐ„๋‹จํžˆ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ๋ฐ˜๋“œ์‹œ ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๋™์ผํ•œ ์ปฌ๋Ÿผ๋ช…, ํƒ€์ž…์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ์ด ํ•„์š”
    โžก ์—†์„ ๊ฒฝ์šฐ ๊ต์ฐจ ์กฐ์ธ๋จ.
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
-- JOIN JOB USING(JOB_CODE);
NATURAL JOIN JOB;
[๊ต์ฐจ์กฐ์ธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ]
(EMPLOYEEํ…Œ์ด๋ธ”์— ๊ฐ™์€ ์ปฌ๋Ÿผ๋ช…์ด ์—†๊ธฐ์— ๊ต์ฐจ์กฐ์ธ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ)
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE 
NATURAL JOIN DEPARTMENT;
โžก ์ž˜๋ชป ์กฐ์ธํ•˜๋ฉด CROSS JOIN(๊ต์ฐจ์กฐ์ธ) ๊ฒฐ๊ณผ๊ฐ€ ์กฐํšŒ๋œ๋‹ค.

๐Ÿ“– 7. ๋‹ค์ค‘ ์กฐ์ธ

: N๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ(์ˆœ์„œ ์ค‘์š”!!)

์‚ฌ์› ์ด๋ฆ„๋ถ€์„œ๋ช…์ง€์—ญ๋ช… ์กฐํšŒ
EMPLOYEEDEPARTMENTLOCATION

ANSI ํ‘œ์ค€

SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON( LOCATION_ID = LOCAL_CODE);

์˜ค๋ผํด ์ „์šฉ

SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT,LOCATION
WHERE DEPT_CODE = DEPT_ID  -- EMPLOYEE + DEPARMENT ์กฐ์ธ
AND LOCATION_ID = LOCAL_CODE; --(EMPLOYEE + DEPARMENT ) + LOCATION ์กฐ์ธ

โžก๋‹ค์ค‘์กฐ์ธ์€ ์กฐ์ธ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์€ ๊ฒฝ์šฐ (์—๋Ÿฌ๋ฐœ์ƒ!)


[๋‹ค์ค‘ ์กฐ์ธ ์—ฐ์Šต ๋ฌธ์ œ]
-์ง๊ธ‰์ด ๋Œ€๋ฆฌ์ด๋ฉด์„œ ์•„์‹œ์•„ ์ง€์—ญ์— ๊ทผ๋ฌดํ•˜๋Š” ์ง์› ์กฐํšŒ, ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ์ง๊ธ‰๋ช…, ๋ถ€์„œ๋ช…, ๊ทผ๋ฌด์ง€์—ญ๋ช…, ๊ธ‰์—ฌ๋ฅผ ์กฐํšŒํ•ด๋ผ
ANSI

SELECT EMP_ID,EMP_NAME,JOB_NAME,DEPT_TITLE, LOCAL_NAME,SALARY
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE)
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCAL_CODE = LOCATION_ID)
WHERE JOB_NAME = '๋Œ€๋ฆฌ' 
AND LOCAL_NAME LIKE 'ASIA%';

์˜ค๋ผํด

SELECT EMP_ID,EMP_NAME,JOB_NAME,DEPT_TITLE, LOCAL_NAME,SALARY
FROM EMPLOYEE E, JOB J, DEPARTMENT, LOCATION
WHERE E.JOB_CODE =J.JOB_CODE 
AND DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE
AND JOB_NAME = '๋Œ€๋ฆฌ' 
AND LOCAL_NAME LIKE 'ASIA%';

JOIN ์—ฐ์Šต๋ฌธ์ œ

-----------------JOIN ์—ฐ์Šต๋ฌธ์ œ-----------------------
โœ” 1.์ฃผ๋ฏผ๋ฒˆํ˜ธ๊ฐ€ 70๋…„๋Œ€ ์ƒ์ด๋ฉด์„œ ์„ฑ๋ณ„์ด ์—ฌ์ž์ด๊ณ , ์„ฑ์ด '์ „'์”จ์ธ ์ง์›๋“ค์˜
์‚ฌ์›๋ช…, ์ฃผ๋ฏผ๋ฒˆํ˜ธ, ๋ถ€์„œ๋ช…, ์ง๊ธ‰๋ช…์„ ์กฐํšŒํ•˜์‹œ์˜ค.
SELECT EMP_NAME, EMP_NO, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
NATURAL JOIN JOB
WHERE EMP_NAME LIKE '์ „%'
AND SUBSTR(EMP_NO,8,1)='2'
AND EMP_NO LIKE '7%' ;
โœ” 2. ์ด๋ฆ„์— 'ํ˜•'์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์ง์›๋“ค์˜ ์‚ฌ๋ฒˆ, ์‚ฌ์›๋ช…, ์ง๊ธ‰๋ช…, ๋ถ€์„œ๋ช…์„ ์กฐํšŒํ•˜์‹œ์˜ค.
SELECT EMP_ID, EMP_NAME, JOB_NAME, DEPT_TITLE
FROM EMPLOYEE
NATURAL JOIN JOB
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE EMP_NAME LIKE '%ํ˜•%';
โœ” 3. ํ•ด์™ธ์˜์—… 1๋ถ€, 2๋ถ€์— ๊ทผ๋ฌดํ•˜๋Š” ์‚ฌ์›์˜ ์‚ฌ์›๋ช…, ์ง๊ธ‰๋ช…, ๋ถ€์„œ์ฝ”๋“œ, ๋ถ€์„œ๋ช…์„ ์กฐํšŒํ•˜์‹œ์˜ค.
SELECT EMP_NAME, JOB_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
NATURAL JOIN JOB
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE DEPT_TITLE IN('ํ•ด์™ธ์˜์—…1๋ถ€','ํ•ด์™ธ์˜์—…2๋ถ€');
โœ” 4. ๋ณด๋„ˆ์Šคํฌ์ธํŠธ๋ฅผ ๋ฐ›๋Š” ์ง์›๋“ค์˜ ์‚ฌ์›๋ช…, ๋ณด๋„ˆ์Šคํฌ์ธํŠธ, ๋ถ€์„œ๋ช…, ๊ทผ๋ฌด์ง€์—ญ๋ช…์„ ์กฐํšŒํ•˜์‹œ์˜ค.
SELECT EMP_NAME, BONUS,DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE 
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
LEFT JOIN LOCATION ON ( LOCATION_ID = LOCAL_CODE)
WHERE BONUS IS NOT NULL;
โžกNULL์ธ ๊ฐ’๋„ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ LEFT JOIN ํ•ด์•ผํ•จ
โœ” 5. ๋ถ€์„œ๊ฐ€ ์žˆ๋Š” ์‚ฌ์›์˜ ์‚ฌ์›๋ช…, ์ง๊ธ‰๋ช…, ๋ถ€์„œ๋ช…, ์ง€์—ญ๋ช… ์กฐํšŒ
SELECT EMP_NAME, JOB_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
NATURAL JOIN JOB
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCAL_CODE = LOCATION_ID);
--WHERE DEPT_CODE IS NOT NULL; ์•ˆ์จ๋„ ์ถœ๋ ฅ๊ฐ€๋Šฅ
โœ” 6. ๊ธ‰์—ฌ๋“ฑ๊ธ‰๋ณ„ ์ตœ์†Œ๊ธ‰์—ฌ(MIN_SAL)๋ฅผ ์ดˆ๊ณผํ•ด์„œ ๋ฐ›๋Š” ์ง์›๋“ค์˜ ์‚ฌ์›๋ช…, ์ง๊ธ‰๋ช…,
๊ธ‰์—ฌ, ์—ฐ๋ด‰(๋ณด๋„ˆ์Šคํฌํ•จ)์„ ์กฐํšŒํ•˜์‹œ์˜ค. (์—ฐ๋ด‰์— ๋ณด๋„ˆ์Šคํฌ์ธํŠธ๋ฅผ ์ ์šฉํ•˜์‹œ์˜ค.)
SELECT EMP_NAME, JOB_NAME , SALARY,SALARY *(1+NVL(BONUS,0))*12
FROM EMPLOYEE
NATURAL JOIN JOB
JOIN SAL_GRADE USING (SAL_LEVEL)
WHERE SALARY  > MIN_SAL;
โœ” 7.ํ•œ๊ตญ(KO)๊ณผ ์ผ๋ณธ(JP)์— ๊ทผ๋ฌดํ•˜๋Š” ์ง์›๋“ค์˜ ์‚ฌ์›๋ช…, ๋ถ€์„œ๋ช…, ์ง€์—ญ๋ช…, ๊ตญ๊ฐ€๋ช…์„ ์กฐํšŒํ•˜์‹œ์˜ค.
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME, NATIONAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCAL_CODE =LOCATION_ID)
JOIN NATIONAL USING (NATIONAL_CODE)
WHERE NATIONAL_CODE IN ('KO', 'JP');
โœ” 8. ๊ฐ™์€ ๋ถ€์„œ์— ๊ทผ๋ฌดํ•˜๋Š” ์ง์›๋“ค์˜ ์‚ฌ์›๋ช…, ๋ถ€์„œ์ฝ”๋“œ, ๋™๋ฃŒ์ด๋ฆ„์„ ์กฐํšŒํ•˜์‹œ์˜ค.(SELF JOIN ์‚ฌ์šฉ)
SELECT E1.EMP_NAME, E1.DEPT_CODE, E2.EMP_NAME 
FROM EMPLOYEE E1
JOIN EMPLOYEE E2 ON (E1.DEPT_CODE = E2.DEPT_CODE)
WHERE E1.EMP_NAME <> E2.EMP_NAME
ORDER BY 1;
โœ” 9. ๋ณด๋„ˆ์Šคํฌ์ธํŠธ๊ฐ€ ์—†๋Š” ์ง์›๋“ค ์ค‘์—์„œ ์ง๊ธ‰์ฝ”๋“œ๊ฐ€ J4์™€ J7์ธ ์ง์›๋“ค์˜ ์‚ฌ์›๋ช…, ์ง๊ธ‰๋ช…, ๊ธ‰์—ฌ๋ฅผ ์กฐํšŒํ•˜์‹œ์˜ค. 
--(๋‹จ, JOIN, IN ์‚ฌ์šฉํ•  ๊ฒƒ)
SELECT EMP_NAME,JOB_NAME, SALARY
FROM EMPLOYEE
NATURAL JOIN JOB
WHERE BONUS IS NULL
AND JOB_CODE IN('J4','J7');
profile
ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž

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