์ปฌ๋ผ์ ๊ฐ์ ์ฝ์ด์ ์ฐ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
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 ๋ค์ ๋ถ๋ถ ์ ์ญ ```!
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;
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; -- 70096240AVG(์ซ์๊ฐ ๊ธฐ๋ก๋ ์ปฌ๋ผ๋ช ) : ํ๊ท
[์ ์ง์ ๊ธ์ฌ ํ๊ท ] 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; -- 9SELECT 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 ์ปฌ๋ผ๋ช | ํจ์์, ...
- ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ๋ฌถ์์ ํ๋๋ก ์ฒ๋ฆฌํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํจ.
- ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ ๊ฐ์ ๋ํด์ 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 ์ปฌ๋ผ๋ช | ํจ์์ ๋น๊ต์ฐ์ฐ์ ๋น๊ต๊ฐ[๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๊ฐ 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;
: ๊ทธ๋ฃน ๋ณ ์ฐ์ถ ๊ฒฐ๊ณผ ๊ฐ์ ์ง๊ณ๋ฅผ ๊ณ์ฐํ๋ ํจ์ (๊ทธ๋ฃน๋ณ๋ก ์ค๊ฐ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๊ฐ)
โก 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;
: ์ฌ๋ฌ 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 ์ฉ์ด ์ ๋ฆฌ]
| ์ค๋ผํด | SQL : 1999ํ์ค(ANSI) |
|---|---|
| ๋ฑ๊ฐ ์กฐ์ธ | ๋ด๋ถ ์กฐ์ธ(INNER JOIN), JOIN USING / ON |
| + ์์ฐ ์กฐ์ธ(NATURAL JOIN, ๋ฑ๊ฐ ์กฐ์ธ ๋ฐฉ๋ฒ ์ค ํ๋) | |
| ํฌ๊ด ์กฐ์ธ | ์ผ์ชฝ ์ธ๋ถ ์กฐ์ธ(LEFT OUTER), ์ค๋ฅธ์ชฝ ์ธ๋ถ ์กฐ์ธ(RIGHT OUTER) |
| + ์ ์ฒด ์ธ๋ถ ์กฐ์ธ(FULL OUTER, ์ค๋ผํด ๊ตฌ๋ฌธ์ผ๋ก๋ ์ฌ์ฉ ๋ชปํจ) | |
| ์์ฒด ์กฐ์ธ, ๋น๋ฑ๊ฐ ์กฐ์ธ | JOIN ON |
| ์นดํ ์์(์นดํฐ์ ) ๊ณฑ | ๊ต์ฐจ ์กฐ์ธ(CROSS JOIN) |
| CARTESIAN PRODUCT |
- ํ๋ ์ด์์ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด ์ฌ์ฉ.
- ์ํ ๊ฒฐ๊ณผ๋ ํ๋์ 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์ ์ฐ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋๋๋ค. |
โก ์ฐ๊ฒฐ๋๋ ์ปฌ๋ผ์ ๊ฐ์ด ์ผ์นํ๋ ํ๋ค๋ง ์กฐ์ธ๋จ.(์ผ์นํ๋ ๊ฐ์ด ์๋ ํ์ ์กฐ์ธ์์ ์ ์ธ๋จ)
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 |
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;
[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(๋ด๋ถ ์กฐ์ธ) ๋ฌธ์ ์
โก ์ฐ๊ฒฐ์ ์ฌ์ฉ๋ ์ปฌ๋ผ์ ๊ฐ์ด ์ผ์นํ์ง ์์ผ๋ฉด ์กฐํ ๊ฒฐ๊ณผ์ ํฌํจ๋์ง ์๋๋ค.!
โก ๋ ํ
์ด๋ธ์ ์ง์ ํ๋ ์ปฌ๋ผ๊ฐ์ด ์ผ์นํ์ง ์๋ ํ๋ ์กฐ์ธ์ ํฌํจ ์ํด
(โ ๋ฐ๋์ 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๊ฐ๋ง ์ง์ ํ ์ ์์ต๋๋ค ์ค๋ฅ๋ฐ์
โก ์กฐ์ธ๋๋ ํ
์ด๋ธ์ ๊ฐ ํ๋ค์ด ๋ชจ๋ ๋งคํ๋ ๋ฐ์ดํฐ๊ฐ ๊ฒ์๋๋ ๋ฐฉ๋ฒ(๊ณฑ์งํฉ)
(JOIN ๊ตฌ๋ฌธ์ ์๋ชป ์์ฑํ๋ ๊ฒฝ์ฐ CROSS JOIN์ ๊ฒฐ๊ณผ๊ฐ ์กฐํ๋จ)
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
โก207ํ(EMPLOYEE)23ํ*(DEPARTMENT)9ํ = 207ํ
: = (๋ฑํธ)๋ฅผ ์ฌ์ฉํ์ง ์๋ ์กฐ์ธ๋ฌธ
โก ์ง์ ํ ์ปฌ๋ผ๊ฐ์ด ์ผ์นํ๋ ๊ฒฝ์ฐ๊ฐ ์๋, ๊ฐ์ ๋ฒ์์ ํฌํจ๋๋ ํ๋ค์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์
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);
: ๊ฐ์ ํ
์ด๋ธ์ ์กฐ์ธ. ์๊ธฐ ์์ ๊ณผ ์กฐ์ธ์ ๋งบ์
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(+);
: ๋์ผํ ํ์ ๊ณผ ์ด๋ฆ์ ๊ฐ์ง ์ปฌ๋ผ์ด ์๋ ํ ์ด๋ธ ๊ฐ์ ์กฐ์ธ์ ๊ฐ๋จํ ํํํ๋ ๋ฐฉ๋ฒ
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(๊ต์ฐจ์กฐ์ธ) ๊ฒฐ๊ณผ๊ฐ ์กฐํ๋๋ค.
: N๊ฐ์ ํ ์ด๋ธ์ ์กฐํํ ๋ ์ฌ์ฉ(์์ ์ค์!!)
| ์ฌ์ ์ด๋ฆ | ๋ถ์๋ช | ์ง์ญ๋ช ์กฐํ |
|---|---|---|
| EMPLOYEE | DEPARTMENT | LOCATION |
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 ์กฐ์ธโก๋ค์ค์กฐ์ธ์ ์กฐ์ธ์์๋ฅผ ์งํค์ง ์์ ๊ฒฝ์ฐ (์๋ฌ๋ฐ์!)
[๋ค์ค ์กฐ์ธ ์ฐ์ต ๋ฌธ์ ]
-์ง๊ธ์ด ๋๋ฆฌ์ด๋ฉด์ ์์์ ์ง์ญ์ ๊ทผ๋ฌดํ๋ ์ง์ ์กฐํ, ์ฌ๋ฒ, ์ด๋ฆ, ์ง๊ธ๋ช , ๋ถ์๋ช , ๊ทผ๋ฌด์ง์ญ๋ช , ๊ธ์ฌ๋ฅผ ์กฐํํด๋ผ
ANSISELECT 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 ์ฐ์ต๋ฌธ์ ----------------------- โ 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');