[Day7] Oracle 7 [10/5]
1. TO_CHAR( , 'format') ํจ์์์ 'format'์ ์ฌ์ฉ๋๋ ๊ธฐํธ๋ฅผ ์ ์ผ์ธ์.
ใฑ. ๋
๋ : Y, YY, YYY, [YYYY], IY, IYY, IYYY, IYYYY, YEAR, SYEAR, RR, RRRR
ใด. ์ : MM, MONTH, MON
ใท. ์์ ์ผ : DD
์ฃผ์ ์ผ : D
๋
์ ์ผ : DDD
ใน. ์์ผ : DY, DAY
ใ
. ์์ ์ฃผ์ฐจ : W
๋
์ ์ฃผ์ฐจ : WW, IW
ใ
. ์๊ฐ/24์๊ฐ : HH, HH24, HH12
ใ
. ๋ถ : MI
ใ
. ์ด : SS
ใ
. ์์ ์์ ์ง๋ ์ด : SSSSS
ใ
. ์ค์ /์คํ : AM, PM
TS ์๊ฐ ์คํ 3:12:33
DS ๋ ์ง
DL ๋ ์ง
2. ๋ณธ์ธ์ ์์ผ๋ก๋ถํฐ ์ค๋๊น์ง ์ด์์จ ์ผ์, ๊ฐ์์, ๋
์๋ฅผ ์ถ๋ ฅํ์ธ์..
SELECT TO_DATE( '1993.12.10' )
, SYSDATE
, CEIL( ABS( TO_DATE( '1993.12.10' ) - SYSDATE ) ) ์ผ์
, MONTHS_BETWEEN( SYSDATE, TO_DATE( '1993.12.10' ) ) ๊ฐ์์
, MONTHS_BETWEEN( SYSDATE, TO_DATE( '1993.12.10' ) ) / 12 ) ๋
์
FROM dual;
์ ์ CEIL
๋ฐ์ฌ๋ฆผ ROUND
์ ์ญ FLOOR, TRUNC
3. IW์ WW ์ ์ฐจ์ด์ . *****
-- 'WW' : 1์ผ-7์ผ์ ๊ธฐ์ค์ผ๋ก ์ฃผ์ฐจ ํ์
-- 'IW' : ์ผ์์ผ์ ๊ธฐ์ ์ผ๋ก ์ฃผ์ฐจ ํ์
-- WW : ~> ์์ผ์ ๊ด๊ณ ์์ด 7์ผ์ ๊ธฐ์ค์ผ๋ก ์ฃผ์ฐจ๋ฅผ ๊ตฌ๋ถ
-- 01~07์ผ ๊น์ง 1์ฃผ์ฐจ
-- 08~14์ผ ๊น์ง 2์ฃผ์ฐจ
-- 15~21์ผ ๊น์ง 3์ฃผ์ฐจ
--
--
--IW : ~> ์์ผ(์ํ์๋ชฉ๊ธํ ์ผ ์)์ ๊ธฐ์ค์ผ๋ก ์ฃผ์ฐจ๋ฅผ ๊ตฌ๋ถ ISO ํ์ค
--์ผ~์์์ผ ๋์ด๊ฐ๋ฉด์ ์ฃผ์ฐจ๊ฐ ๋ฐ๋๋ค.
'2022.01.01' IW
SELECT TO_CHAR( TO_DATE('2022.01.01') , 'IW' ) -- ๋
์ค์ 52์ฃผ์ฐจ ํ
, TO_CHAR( TO_DATE('2022.01.02') , 'IW' ) -- ๋
์ค์ 52์ฃผ์ฐจ ์ผ
-- , TO_CHAR( TO_DATE('2022.01.01') , 'WW' ) -- ๋
์ค์ 1์ฃผ์ฐจ
-- , TO_CHAR( TO_DATE('2022.01.07') , 'WW' ) -- ๋
์ค์ 1์ฃผ์ฐจ
-- , TO_CHAR( TO_DATE('2022.01.08') , 'WW' ) -- ๋
์ค์ 2์ฃผ์ฐจ
FROM dual;
4.
4-1. ์ด๋ฒ ๋ฌ์ด ๋ช ์ผ๊น์ง ์๋ ํ์ธ.
SELECT SYSDATE
, LAST_DAY( SYSDATE )
, TO_CHAR( LAST_DAY( SYSDATE ), 'DD' ) -- ๋ฌธ์
, EXTRACT( DAY FROM LAST_DAY( SYSDATE ) ) -- ์ซ์
FROM dual;
4-2. ์ค๋์ด ๋
์ค ๋ช ์งธ ์ฃผ, ์์ค ๋ช ์งธ์ฃผ์ธ์ง ํ์ธ.
SELECT SYSDATE
, TO_CHAR( SYSDATE, 'WW' ) -- ๋
์ค ๋ช ์งธ์ฃผ
, TO_CHAR( SYSDATE, 'IW' ) -- "
, TO_CHAR( SYSDATE, 'W' ) -- ๊ทธ ๋ฌ์ ๋ช ์งธ์ฃผ
FROM dual;
5. emp ์์ pay ๋ฅผ NVL(), NVL2(), COALESCE()ํจ์๋ฅผ ์ฌ์ฉํด์ ์ถ๋ ฅํ์ธ์.
SELECT sal + NVL( comm, 0 ) pay
, sal + NVL2( comm, comm, 0 ) pay
, COALESCE( sal + comm , sal , 0 ) pay
, sal + COALESCE( comm , 0 ) pay
FROM emp;
5-2. empํ
์ด๋ธ์์ mgr์ด null ์ธ ๊ฒฝ์ฐ -1 ๋ก ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ ์์ฑ
mgr ์ปฌ๋ผ : ์ง์์์ฌ์ ์ฌ์๋ฒํธ(empno)
mgr ์ด ๋(null) ์ด๋ผ๋ง์ ์ง์์์ฌ X , CEO
ใฑ. nvl()
ใด. nvl2()
ใท. COALESCE()
SELECT NVL( mgr, -1)
, NVL2( mgr, mgr , -1)
, COALESCE( mgr , -1 )
FROM emp
-- WHERE mgr IS [NOT] NULL;
6. insa ์์ ์ด๋ฆ,์ฃผ๋ฏผ๋ฒํธ, ์ฑ๋ณ( ๋จ์/์ฌ์ ), ์ฑ๋ณ( ๋จ์/์ฌ์ ) ์ถ๋ ฅ ์ฟผ๋ฆฌ ์์ฑ-
ใฑ. DECODE()
ใด. CASE ํจ์
SELECT name, ssn
, DECODE( MOD( SUBSTR( ssn, -7, 1) , 2 ) , 1, '๋จ์', '์ฌ์' ) gender
, CASE -- DECODE ํจ์์ ํ์ฅ. = + if~
1) CASE ๊ตฌ๋ฌธ ํํ 1
WHEN MOD( SUBSTR( ssn, -7, 1) , 2 ) = 1 THEN '๋จ์'
-- WHEN ์กฐ๊ฑด์ THEN
-- WHEN THEN
-- :
ELSE '์ฌ์'
END gender
2) CASE ๊ตฌ๋ฌธ ํํ 2
, CASE MOD( SUBSTR( ssn, -7, 1) , 2 )
WHEN 1 THEN '๋จ์'
ELSE '์ฌ์'
END gender
FROM insa;
7. emp ์์ ํ๊ท PAY ๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฐ ์ฌ์๋ค๋ง์ ๊ธ์ฌํฉ์ ์ถ๋ ฅ.
( DECODE, CASE ์ฌ์ฉํด์ ํ์ด )
WITH
temp AS (
SELECT ename, sal+NVL(comm,0) pay
, (
SELECT AVG( sal+NVL(comm,0) )
FROM emp
) avg_pay
FROM emp
)
SELECT
--t.*
SUM( DECODE( SIGN( pay - avg_pay ), -1, null, t.pay ) )
,SUM( CASE
WHEN pay >= avg_pay THEN pay
-- ELSE null
END
)
, SUM(CASE SIGN( pay - avg_pay )
WHEN -1 THEN null
ELSE pay
END
)
FROM temp t;
--
SELECT SUM( sal + NVL( comm, 0 ) ) tot_pay
, COUNT( *)
, SUM( sal + NVL( comm, 0 ) ) / COUNT( *) avg_pay
, AVG( sal + NVL( comm, 0 ) ) avg_pay
FROM emp;
-- 2260.416666666666666666666666666666666667
SELECT SUM( sal + NVL( comm, 0 ) )
FROM emp -- ์ธ๋ผ์ธ๋ทฐ
WHERE sal + NVL( comm, 0 ) >= (SELECT AVG( sal + NVL( comm, 0 ) ) FROM emp);
-- ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ
-- ORA-00934: group function is not allowed here
-- WHERE sal + NVL( comm, 0 ) >= AVG( sal + NVL( comm, 0 ) );
WHERE sal + NVL( comm, 0 ) >= 2260.416666666666666666666666666666666667;
(๋ฌธ์ ) insa ํ
์ด๋ธ์์ ๋จ์ ์ฌ์์, ์ฌ์ ์ฌ์์ ์ถ๋ ฅ(์กฐํ)
SELECT '์ด์ฌ์์' , COUNT(*)
FROM insa
UNION ALL
SELECT '๋จ์์ฌ์์' , COUNT(*)
FROM insa
WHERE MOD( SUBSTR( ssn, -7, 1) , 2) = 1
UNION ALL
SELECT '์ฌ์์ฌ์์' ,COUNT(*)
FROM insa
WHERE MOD( SUBSTR( ssn, -7, 1) , 2) = 0;
-- DECODE ์ฌ์ฉ : MOD(), SUBSTR(), DECODE(), COUNT() ์๊ธฐ
SELECT COUNT(*) ์ด์ฌ์์
, COUNT( DECODE(MOD( SUBSTR( ssn, -7, 1) , 2), 1, 100) ) ๋จ์์ฌ์์
, COUNT( DECODE(MOD( SUBSTR( ssn, -7, 1) , 2), 0, 0) ) ์ฌ์์ฌ์์
FROM insa;
-- 1) COUNT( ) NULL ํฌํจ๋์ง ์๋๋ค. ***
-- 2) DECODE( A, B, C ) null
DECODE(MOD( SUBSTR( ssn, -7, 1) , 2), 1, 100)
(๋ฌธ์ ) CASE ํจ์ ์ฌ์ฉํด์ ์ฝ๋ฉ.
SELECT
COUNT(*) ์ด์ฌ์์
,COUNT(
CASE MOD( SUBSTR( ssn, -7, 1) , 2)
WHEN 1 THEN '๋จ์'
-- ELSE NULL
END
) ๋จ์์ฌ์์
,COUNT(
CASE MOD( SUBSTR( ssn, -7, 1) , 2)
WHEN 0 THEN '์ฌ์'
-- ELSE NULL
END
) ์ฌ์์ฌ์์
FROM insa;
(๋ฌธ์ ) emp ํ
์ด๋ธ์์ ๊ฐ ๋ถ์๋ณ ์ฌ์์ ์ถ๋ ฅ(์กฐํ) - DECODE ํจ์ ์ฌ์ฉ
SELECT COUNT(*)
FROM emp
UNION ALL
SELECT COUNT(*)
FROM emp
WHERE deptno =10
UNION ALL
SELECT COUNT(*)
FROM emp
WHERE deptno = 20
UNION ALL
SELECT COUNT(*)
FROM emp
WHERE deptno =30
UNION ALL
SELECT COUNT(*)
FROM emp
WHERE deptno =40;
-- DECODE
SELECT
COUNT(*) ์ด์ฌ์์
, COUNT(DECODE( deptno, 10, 'O' )) "10์ฌ์์"
, COUNT(DECODE( deptno, 20, 'O' )) "20์ฌ์์"
, COUNT(DECODE( deptno, 30, 'O' )) "30์ฌ์์"
, COUNT(DECODE( deptno, 40, 'O' )) "40์ฌ์์"
-- ๊ฐ ๋ถ์๋ณ ์ด ๊ธ์ฌํฉ ์ถ๋ ฅ
,SUM(DECODE( deptno, 10, sal + NVL(comm, 0) )) ๊ธ์ฌํฉ_10
,SUM(DECODE( deptno, 20, sal + NVL(comm, 0) )) ๊ธ์ฌํฉ_20
,SUM(DECODE( deptno, 30, sal + NVL(comm, 0) )) ๊ธ์ฌํฉ_30
,NVL( SUM(DECODE( deptno, 40, sal + NVL(comm, 0) )) , 0 ) ๊ธ์ฌํฉ_40
FROM emp;
]
-- ๊ฐ ๋ถ์๋ณ ์ด ๊ธ์ฌํฉ ์ถ๋ ฅ
SELECT
SUM(DECODE( deptno, 10, sal + NVL(comm, 0) )) ๊ธ์ฌํฉ_10
,SUM(DECODE( deptno, 20, sal + NVL(comm, 0) )) ๊ธ์ฌํฉ_20
,SUM(DECODE( deptno, 30, sal + NVL(comm, 0) )) ๊ธ์ฌํฉ_30
,NVL( SUM(DECODE( deptno, 40, sal + NVL(comm, 0) )) , 0 ) ๊ธ์ฌํฉ_40
FROM emp;
8. emp ์์ [์ฌ์์ด ์กด์ฌํ๋ ๋ถ์]์ ๋ถ์๋ฒํธ๋ง ์ถ๋ ฅ
SELECT deptno
FROM dept;
--
SELECT DISTINCT deptno
FROM emp;
-- ๋น์ ๊ณต์ --
SELECT deptno
FROM (
SELECT deptno --, COUNT(*) a
FROM emp
GROUP BY deptno
)
WHERE a IS NOT NULL;
--
SELECT deptno -- ์ด๋ ๊ฒ๋งํด๋ ๋์ด!
FROM emp
GROUP BY deptno
(๋ฌธ์ ) ์ฌ์์ด ์กด์ฌํ์ง ์๋ ๋ถ์๋ฒํธ๋ง ์ถ๋ ฅ.
SELECT deptno
FROM dept
MINUS
SELECT DISTINCT deptno
FROM emp;
-- JOIN(์กฐ์ธ) --
9. ํจ์ ์ค๋ช
(์ ๋ฆฌํด๋๊ธฐ)
9-1. NULLIF() ํจ์ ์ค๋ช
9-2. COALESCE() ํจ์ ์ค๋ช
9-3. DECODE() ํจ์ ์ค๋ช
9-4. LAST_DAY() ํจ์ ์ค๋ช
9-5. ADD_MONTHS() ํจ์ ์ค๋ช
9-6. MONTHS_BETWEEN() ํจ์ ์ค๋ช
9-7. NEXT_DAY() ํจ์ ์ค๋ช
9-8. EXTRACT() ํจ์ ์ค๋ช
ใฑ. ASCII() ํจ์ ์ค๋ช
ใด. CHR() ํจ์ ์ค๋ช
ใท. GREATEST() ํจ์ ์ค๋ช
ใน. LEAST() ํจ์ ์ค๋ช
ใ
. UPPER() ํจ์ ์ค๋ช
ใ
. LOWER() ํจ์ ์ค๋ช
ใ
. LENGTH() ํจ์ ์ค๋ช
ใ
. SUBSTR() ํจ์ ์ค๋ช
ใ
. INSTR() ํจ์ ์ค๋ช
X
-- SQL + PL
๊ฐ ์ฌ์์ pay๋ฅผ ๋ฐฑ๋ถ๋ฅ ๋ก ๊ณ์ฐํด์ 10% ๋น ๋ณํ๋(*)๋ก ์ฒ๋ฆฌํด์ ์ถ๋ ฅ
( ์์ซ์ ์ฒซ ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํด์ ์ถ๋ ฅ )
SELECT t.*
, t.pay / t.max_pay * 100 || '%' "percent"
, ROUND( t.pay / t.max_pay * 100/10 ) ๋ณ๊ฐฏ์
, RPAD( ' ', ROUND( t.pay / t.max_pay * 100 /10) + 1 , '*' )
FROM (
SELECT ename
, sal + NVL( comm, 0 ) pay
, ( SELECT MAX( sal + NVL( comm, 0 ) ) FROM emp ) max_pay
FROM emp
) t;
11. ์๋ ์ฝ๋ฉ์ DECODE()๋ฅผ ์ฌ์ฉํด์ ํํํ์ธ์.
ใฑ. [์๋ฐ]
if( A == B ){
return X;
}
DECODE( A, B, X )
ใด. [์๋ฐ]
if( A==B){
return S;
}else if( A == C){
return T;
}else{
return U;
}
DECODE( A, B, S, C, T, U )
ใท. [์๋ฐ]
if( A==B){
return XXX;
}else{
return YYY;
}
DECODE( A, B, XXX, YYY )
12. insaํ
์ด๋ธ์์ 1001, 1002 ์ฌ์์ ์ฃผ๋ฏผ๋ฒํธ์ ์/์ผ ๋ง 10์05์ผ๋ก ์์ ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑ
SELECT *
FROM insa;
77[1212]-1022432
80[1004]-1544236
UPDATE insa
SET ssn = SUBSTR( ssn, 0, 2) || '1005' || SUBSTR( ssn, -8)
WHERE num IN ( 1001, 1002);
COMMIT;
12-2. insaํ
์ด๋ธ์์ '2022.10.05'์ ๊ธฐ์ค์ผ๋ก ์๋์ ๊ฐ์ด ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ ์์ฑ.
๊ฒฐ๊ณผ)
์ฅ์ธ์ฒ 780506-1625148 ์์ผ ํ
๊น์๋
821011-2362514 ์์ผ ์
๋์ค๊ท 810810-1552147 ์์ผ ํ
๊น์ข
์ 751010-1122233 ์ค๋ ์์ผ
์ ๊ด์ 801010-2987897 ์ค๋ ์์ผ
์ ํ๊ตญ 760909-1333333 ์์ผ ํ
-- ORA-01861: literal does not match format string
SELECT name, ssn
, TO_DATE( SUBSTR( ssn, 3, 4) , 'MMDD' )
, TRUNC( SYSDATE )
, DECODE( SIGN( TO_DATE( SUBSTR( ssn, 3, 4) , 'MMDD' ) - TRUNC( SYSDATE ) )
, 0 , '์ค๋ ์์ผ'
, 1 , '์์ผ ์ '
, -1, '์์ผ ํ'
) a
, CASE SIGN( TO_DATE( SUBSTR( ssn, 3, 4) , 'MMDD' ) - TRUNC( SYSDATE ) )
WHEN 1 THEN '์์ผ ์ '
WHEN -1 THEN '์์ผ ํ'
ELSE '์ค๋ ์์ผ'
END b
FROM insa;
12-3. insaํ
์ด๋ธ์์ '2022.10.05'๊ธฐ์ค์ผ๋ก ์ด ๋ ์ด ์์ผ์ธ ์ฌ์์,์ง๋ ์ฌ์์, ์ ์ง๋ ์ฌ์์๋ฅผ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ ์์ฑ.
-- 1)
SELECT
COUNT( DECODE( s , 1 , 1 ) ) "์์ผ ์ ์ฌ์์"
, COUNT( DECODE( s , -1, 1 ) ) "์์ผ ํ ์ฌ์์"
, COUNT( DECODE( s , 0, 1 ) ) "์ค๋ ์์ผ ์ฌ์์"
FROM (
SELECT name, ssn
, SIGN( TO_DATE( SUBSTR( ssn, 3, 4) , 'MMDD' ) - TRUNC( SYSDATE ) ) s
FROM insa
) t;
--2)
SELECT s
, CASE s
WHEN 1 THEN '์์ผ ์ ์ฌ์์'
WHEN 0 THEN '์ค๋ ์์ผ ์ฌ์์'
WHEN -1 THEN '์์ผ ํ ์ฌ์์'
END "์ฌ์์"
, COUNT(*)
FROM (
SELECT name, ssn
, SIGN( TO_DATE( SUBSTR( ssn, 3, 4) , 'MMDD' ) - TRUNC( SYSDATE ) ) s
FROM insa
) t
GROUP BY s ; -- 1 , 0 , -1
13. emp ํ
์ด๋ธ์์
10๋ฒ ๋ถ์์๋ค์ ๊ธ์ฌ 15% ์ธ์ 1.15
20๋ฒ ๋ถ์์๋ค์ ๊ธ์ฌ 10% ์ธ์
30๋ฒ ๋ถ์์๋ค์ ๊ธ์ฌ 5% ์ธ์
40๋ฒ ๋ถ์์๋ค์ ๊ธ์ฌ 20% ์ธ์
ํ๋ ์ฟผ๋ฆฌ ์์ฑ.
-- ORA-00972: identifier is too long
SELECT deptno, ename, sal + NVL(comm, 0) pay
, DECODE( deptno, 10 , 15 , 20, 10, 30, 5, 40, 20) || '%' "์ธ์๋ฅ "
, (sal + NVL(comm, 0)) * DECODE( deptno, 10 , 15 , 20, 10, 30, 5, 40, 20) /100 "์ธ์์ก"
-- , (sal + NVL(comm, 0)) + (sal + NVL(comm, 0)) * DECODE( deptno, 10 , 15 , 20, 10, 30, 5, 40, 20) /100 "์ธ์๋ Pay"
-- , (sal + NVL(comm, 0))*(1 + DECODE(deptno, 10, 15, 20, 10, 30, 5, 40, 20) / 100) "์ธ์๋ Pay"
, (sal + NVL(comm, 0)) *DECODE( deptno, 10 , 1.15 , 20, 1.10, 30, 1.05, 40, 1.20) "์ธ์๋ Pay"
FROM emp
ORDER BY deptno ASC;
14. emp ํ
์ด๋ธ์์ ๊ฐ ๋ถ์์ ์ฌ์์๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ
SELECT COUNT(*)
, COUNT( DECODE(deptno, 10, 1) ) ๋ถ์10
, COUNT( DECODE(deptno, 20, 1) ) ๋ถ์20
, COUNT( DECODE(deptno, 30, 1) ) ๋ถ์30
, COUNT( DECODE(deptno, 40, 1) ) ๋ถ์40
FROM emp;
--
-- 1) ์ด์ฌ์์ , 2) ์ฌ์์ด ์กด์ฌํ์ง ์๋ ๋ถ์ ์ ๋ณด X ( 40 0 ) ์ถ๋ ฅ. - ์ ๊ณต์๋ค..
-- ORA-00904: "DEPTNO": invalid identifier
-- ์ปฌ๋ผ๊ฐฏ์, ์๋ฃํ ๋์ผ( ์ฃผ์์ฌํญ )
-- ์ฒซ ๋ฒ์งธ SELECT 0 deptno ์ปฌ๋ผ๋ช
๋๋ ๋ณ์นญ, COUNT(*)
SELECT 0 deptno, COUNT(*)
FROM emp
UNION ALL
SELECT deptno, COUNT(*)
FROM emp
GROUP BY deptno
ORDER BY deptno ASC;
-- ๋ต : OUTER JOIN ( ๋ฉด์ ์ค๊ธฐ )
-- TOP N ๋ฐฉ์ == ์์ N
SELECT 0 deptno, COUNT(*)
FROM emp
UNION ALL
SELECT deptno, COUNT(*)
FROM emp
GROUP BY deptno
ORDER BY deptno ASC;
-- 40 0 X
--INNER JOIN , OUTER JOIN
-- ORA-00918: column ambiguously defined
-- ์ปฌ๋ผ์ด ์ ๋งค๋ชจํธํ๊ฒ ์ ์ธ๋์๋ค.
-- ( ์กฐ์ธ ํ ๋ ๊ณตํต์ ์ธ ์ปฌ๋ผ๋ช
์ ๋ณ์นญ.์ปฌ๋ผ๋ช
)
-- ( ์๊ธฐ )
SELECT d.deptno, COUNT( e.deptno )
FROM emp e , dept d -- RIGHT OUTER JOIN
-- FROM [ dept d ], emp e LEFT [OUTER] JOIN
WHERE e.deptno(+) = d.deptno -- ์กฐ์ธ์กฐ๊ฑด
GROUP BY d.deptno
ORDER BY d.deptno ASC;
-- [ JOIN ] ์ํ
-- ๋ถ์๋ช
,์ฌ์๋ช
, ์ก, ์
์ฌ์ผ์ ์กฐํ(์ถ๋ ฅ)
-- dept : dname
-- emp : ename, job, hiredate
-- RDBMS dept ์์๊ด๊ณ emp
-- PK:deptno ์ฐธ์กฐ FK:deptno
-- ๋ถ๋ชจ์ PK ์ ์์์ FK ์กฐ์ธ์กฐ๊ฑด์ด๋๋ค.
SELECT deptno, ename, job,hiredate
FROM emp;
+
SELECT deptno, dname, loc
FROM dept;
--
--SELECT d.dname, e.ename, e.job, e.hiredate
-- ์กฐ์ธ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ
SELECT dname, ename, job, hiredate
FROM emp e , dept d
WHERE d.deptno = e.deptno; -- ์กฐ์ธ ์กฐ๊ฑด
-- ์กฐ์ธ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ ( JOIN ~ ON ๊ตฌ๋ฌธ )
SELECT dname, ename, job, hiredate
FROM emp e JOIN dept d ON d.deptno = e.deptno;
15. emp, salgrade ๋ ํ
์ด๋ธ์ ์ฐธ์กฐํด์ ์๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ ์ฟผ๋ฆฌ ์์ฑ.
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
-- (๋ด์ผ ์ํ)
SELECT ename, sal
, CASE
WHEN sal >= 700 AND sal <= 1200 THEN 1
WHEN sal BETWEEN 1201 AND 1400 THEN 2
WHEN sal BETWEEN 1401 AND 2000 THEN 3
WHEN sal BETWEEN 2001 AND 3000 THEN 4
WHEN sal BETWEEN 3001 AND 9999 THEN 5
END GRADE
FROM emp;
-- (๋ด์ผ ์ํ) JOIN
-- ์กฐ์ธ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ
SELECT ename, sal, losal || ' ~ ' || hisal, grade
FROM emp , salgrade
WHERE sal BETWEEN losal AND hisal; -- ์กฐ์ธ ์กฐ๊ฑด
-- ์กฐ์ธ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ
SELECT ename, sal, losal || ' ~ ' || hisal, grade
FROM emp JOIN salgrade ON sal BETWEEN losal AND hisal; -- ์กฐ์ธ ์กฐ๊ฑด
ENAME SAL GRADE
----- ----- ---------
SMITH 800 1
ALLEN 1900 3
WARD 1750 3
JONES 2975 4
MARTIN 2650 4
BLAKE 2850 4
CLARK 2450 4
KING 5000 5
TURNER 1500 3
JAMES 950 1
FORD 3000 4
MILLER 1300 2
SELECT *
FROM salgrade; -- ๊ธ์ฌ ๋ฑ๊ธ ํ
์ด๋ธ
[์กฐ์ธ๋ฌธ์ ] dname, ename, sal, grade ์กฐํ
dept : dname
emp : ename, sal
salgrade : grade
-- ์กฐ์ธ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ
SELECT dname, ename, sal, grade
FROM dept d, emp e, salgrade s
WHERE d.deptno = e.deptno AND e.sal BETWEEN s.losal AND s.hisal; -- ์กฐ์ธ ์กฐ๊ฑด
-- ์กฐ์ธ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ
SELECT dname, ename, sal, grade
FROM dept d JOIN emp e ON d.deptno = e.deptno
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;
16. emp ํ
์ด๋ธ์์ ๊ธ์ฌ๋ฅผ ๊ฐ์ฅ ๋ง์ด ๋ฐ๋ ์ฌ์์ empno, ename, pay ๋ฅผ ์ถ๋ ฅ.
SELECT empno, ename, sal
FROM emp
WHERE sal >= ALL ( SELECT sal FROM emp );
WHERE sal = ( SELECT MAX(sal) FROM emp );
16-2. emp ํ
์ด๋ธ์์ ๊ฐ ๋ถ์๋ณ ๊ธ์ฌ๋ฅผ ๊ฐ์ฅ ๋ง์ด ๋ฐ๋ ์ฌ์์ pay๋ฅผ ์ถ๋ ฅ
1) UNION ALL
2) GROUP BY
SELECT deptno, MAX(sal + NVL(comm, 0 )) max_pay
FROM emp
GROUP BY deptno
ORDER BY deptno ASC;
3) ์๊ด ์๋ธ์ฟผ๋ฆฌ
-- 596ํ, 3์ด์์ ์ค๋ฅ ๋ฐ์ ORA-00907: missing right parenthesis
SELECT deptno, ename, sal + NVL( comm,0 )
FROM emp a
WHERE sal + NVL( comm,0 ) = ( SELECT MAX( sal + NVL( comm,0 ) ) FROM emp b WHERE b.deptno = a.deptno ) ;
[๋ฌธ์ ] emp ํ
์ด๋ธ์์ pay๋ฅผ ๋ง์ด ๋ฐ๋ 3๋ช
์ ๋ณด ์กฐํ
( TOP - N ๋ฐฉ์ )
• top-N ๋ถ์์ ์ต๋๊ฐ์ด๋ ์ต์๊ฐ์ ๊ฐ์ง ์ปฌ๋ผ์ ์ง์ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ ๋ถ์๋ฐฉ๋ฒ์ด๋ค. • inline view์์ ORDER BY ์ ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ์์๋ก ์ ๋ ฌ๋ ๊ฐ๋ฅํ๋ค. • ROWNUM ์ปฌ๋ผ์ subquery์์ ๋ฐํ๋๋ ๊ฐ ํ์ ์์ฐจ์ ์ธ ๋ฒํธ๋ฅผ ๋ถ์ฌํ๋ pseudo ์ปฌ๋ผ์ด๋ค. • n๊ฐ์ < ๋๋ >=๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ฉฐ, ๋ฐํ๋ ํ์ ๊ฐ์๋ฅผ ์ง์ ํ๋ค. |
ใํ์ใ
SELECT ์ปฌ๋ผ๋ช
,..., ROWNUM
FROM (SELECT ์ปฌ๋ผ๋ช
,... from ํ
์ด๋ธ๋ช
ORDER BY top_n_์ปฌ๋ผ๋ช
)
WHERE ROWNUM <= n;
SELECT ROWNUM , t.*
FROM (
SELECT deptno, ename, job, sal + NVL(comm, 0) pay
FROM emp
ORDER BY pay DESC
) t
--WHERE ROWNUM <= 1;
WHERE ROWNUM <= 3;
WHERE ROWNUM BETWEEN 3 AND 5 ; X ์ค๊ฐ์ ์๋ฒ ํ์ ๊ฐ์ ธ์ฌ ์๋ ์๋ค. ( ์ฃผ์ )
[๋ฌธ์ ] emp ํ
์ด๋ธ์์ pay๋ฅผ ๋ง์ด ๋ฐ๋ 3๋ช
์ ๋ณด ์กฐํ ( RANK ๊ด๋ จ ํจ์ )
ROW_NUMBER ํจ์
- ์ด ํจ์๋ ๋ถ์(analytic) ํจ์๋ก์, ๋ถํ ๋ณ๋ก ์ ๋ ฌ๋ ๊ฒฐ๊ณผ์ ๋ํด ์์๋ฅผ ๋ถ์ฌํ๋ ๊ธฐ๋ฅ์ด๋ค.
- ๋ถํ ์ ์ ์ฒด ํ์ ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ธฐ๋ฅ์ผ๋ก GROUP BY ์ ์์ ๊ทธ๋ฃนํํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ ๊ฐ๋
์ด๋ค.
ใํ์ใ
ROW_NUMBER ()
OVER ([query_partition_clause] order_by_clause )
๋ถ์๋ณ๋ก ํํฐ์
๊ตฌ๋ถ - pay ์ ๋ ฌ + ์์
t.seq = 1๋ก ๋๋ฉด ๊ฐ ๋ถ์๋ณ 1๋ฑ ํธ๋ฆฌํ๊ฒ ๊ตฌํด์ฌ์์์!!
SELECT t.*
FROM (
SELECT deptno, ename, sal + NVL(comm,0) pay
, ROW_NUMBER() OVER( PARTITION BY deptno ORDER BY sal + NVL(comm,0) DESC) seq -- pay ์์ ๋งค๊ธฐ๊ธฐ
FROM emp
) t
WHERE t.seq = 1 ;
๋ถ์๋ณ ์์ ์ถ๋ ฅ
SELECT t.*
FROM (
SELECT deptno, ename, sal + NVL(comm,0) pay
, ROW_NUMBER() OVER( ORDER BY sal + NVL(comm,0) DESC) seq -- pay ์์ ๋งค๊ธฐ๊ธฐ
FROM emp
) t
WHERE t.seq BETWEEN 3 AND 5;
WHERE t.seq <= 3 ;
WHERE t.seq = 1 ;
'๐จโ๐ป Web Development > Oracle' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Day8] Oracle 8 - RANK, HAVING, ROLLUP, CUBE (0) | 2022.10.06 |
---|---|
[Oracle/Table] ์ค๋ผํด ํ ์ด๋ธ (0) | 2022.10.06 |
[Day6] Oracle 6 - ALL, correlated subquery, ๋ฌธ์ํจ์, ๋ ์งํจ์, COALESCE, DECODE (0) | 2022.10.05 |
[Day5] Oracle 5 - ์ค๋ผํด ์ฐ์ฐ์ & ํจ์ (0) | 2022.09.29 |
[Day4] Oracle 4 - Subquery, CONCAT, MOD, INSERT, REPLACE, NLS, Dual, SYSDATE, RR/YY, Session, Synonym (0) | 2022.09.28 |
์ต๊ทผ๋๊ธ