๐ ์ ์ฉํ ์ ๋ณด
Hash ํจ์


ํด์ฑ์ ํน์ง
- ๊ธฐ์ต ์ฅ์์ ๋ญ๋น๊ฐ ์ฌํ๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ธฐ์ต ๊ณต๊ฐ ์๊ตฌ
- ๊ฒ์ ๋ฐฉ๋ฒ ์ค์์ ์๋๊ฐ ๊ฐ์ฅ ๋น ๋ฅด๋ค
- ์ฝ์ , ์ญ์ ์์ ์ ๋น๋๊ฐ ๋ง์ ๋ ์ ๋ฆฌ

์ํธํ ํด์ ํน์ง
- ์ผ๋ฐฉํฅ์ฑ โ ์ํธํ๋ ๊ฐ์ ๋ค์ ์๋์ ๊ฐ์ผ๋ก ๋๋ ค ๋์ ์ ์์
- ๊ณ ์ ์ฑ โ ์๋ก ๋ค๋ฅธ ์ ๋ ฅ ๊ฐ์ ๋ํด ๋์ผํ ํด์ ๊ฐ์ด ์์ฑ๋ ํ๋ฅ ์ด ๋งค์ฐ ๋ฎ์
- ๋ฌด๊ฒฐ์ฑ โ ์ ๋ ฅ ๊ฐ์ ๋ํ ํด์ ๊ฐ์ด ์กฐ๊ธ์ด๋ผ๋ ๋ค๋ฅด๋ฉด, ์๋ณธ ๊ฐ์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๋ฏธ
- ๋ถ๋ณ์ฑ โ ์ ๋ ฅ ๊ฐ์ด ์กฐ๊ธ์ด๋ผ๋ ๋ณ๊ฒฝ๋๋ฉด, ํด์ ๊ฐ๋ ์ ํ ๋ค๋ฅธ ๊ฐ
Oracle DISTINCT ์ฐ์ฐ - (๊ตฌ๋ฒ์ ) Sort vs (10g ์ดํ) Hash

๐กํผ๋๋ฐฑ Tip
SHOW USER;
๐ Data Type Conversion

์คํ ๊ณํ (Execution Plan) ์กฐํ
SELECT * FROM EMP WHERE SAL = '3000โ;
โก SQL ์ ํ > ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ > ์ค๋ช
> ๊ณํ์ค๋ช
(Explain execution plan)

โข[์๋ฌ ๋ฐ์์] ๊ถํ์ด ์๋ ๊ฒฝ์ฐ DBA ๊ณ์ ์ผ๋ก SQL ์ํฌ์ํธ ์์ฑ
- ๋๊ตฌ(T) > SQL ์ํฌ์ํธ > mgrDinkDBMS ํด๋ฆญ
grant select_any_catalog to scott;
## ๊ถํ๋ถ์ฌ
- ๋๊ตฌ(T) > SQL ์ํฌ์ํธ > devDinkDBMS ํด๋ฆญ ## ์ ๊ท session ์์ฑ๋ถํฐ ์ ์ฉ
โฃ โก ์ฌ์คํ !! ์์์ ํ๋ณํ(Implicit Datatype Conversion)


๐ DECODE, CASE
DECODE
DECODE
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๊ฒฐ๊ณผ ์ฑ๋ฅ ํจ์จ์ฑ์ ๊ฐ์ ํ ์ ์๋ค.- ์กฐ๊ฑด์ ( IF ~ ELSE IF ~ELSE ) ์ฐ์ฐ์
- โ=โ ๋น๊ต ์ฐ์ฐ์๋ง ์ฌ์ฉ
- DECODE Syntax Diagram


โ
SELECT DEPTNO, ENAME,
DECODE(DEPTNO, 10, 'ACCOUNTING', 20, 'RESEARCH', 30, 'SALES', 'ETC')
FROM EMP
ORDER BY DEPTNO;

โก
SELECT COMM, DECODE(COMM, NULL, 0, COMM) FROM EMP;

โ DECODE๋ฅผ ํ์ฉํด NVLํจ์ ๊ธฐ๋ฅ ๊ตฌํ
โข - 1
SELECT GREATEST(3000,1500,2100,5000),LEAST(3000,1500,2100,5000) FROM DUAL;

โข - 2
SELECT DEPTNO, ENAME, SAL,
DECODE(GREATEST(SAL,4800),SAL,'HIGH',DECODE(GREATEST(SAL,3000),SAL,'MID','LOW'))
FROM EMP
ORDER BY DEPTNO;

- DECODE
์ ๋ค์ DECODE
์ GREATEST
๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ฒ์์ ๋ฐ๋ผ ์กฐ๊ฑด ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ตฌ๋ฌธ ํ์ฉ (DECODE์ NESTED ๊ตฌ์กฐ)
โ=โ ์ฐ์ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ decode๋ฅผ greatest ํจ์์ ์ฌ์ฉํ์ฌ ๋ฒ์ ์ฐ์ฐ ์ํ
CASE
SELECT DEPTNO,ENAME,
CASE DEPTNO WHEN '10' THEN 'ACCOUNTING' -- ์์์ (x), ์๋ฌ ์์ธ? ์์ ํ ์คํ
WHEN 20 THEN 'RESEARCH'
WHEN 30 THEN 'SALES'
ELSE 'ETC'
END AS DEPARTMENT
FROM EMP
ORDER BY DEPTNO;

์์
SELECT DEPTNO, ENAME,
CASE DEPTNO WHEN 10 THEN 'ACCOUNTING'
WHEN 20 THEN 'RESEARCH'
WHEN 30 THEN 'SALES'
ELSE 'ETC'
END AS DEPARTMENT
FROM EMP
ORDER BY DEPTNO;

โก
SELECT DEPTNO, ENAME, SAL, -- Searched case
CASE WHEN SAL >= 4800 THEN 'HIGH' -- ๋น๊ต ์ฐ์ฐ์
WHEN SAL BETWEEN 3000 AND 4799 THEN 'MID' -- SQL ์ฐ์ฐ์
WHEN SAL >= 1000 AND SAL <=2999 THEN 'LOW' -- ๋น๊ต & ๋
ผ๋ฆฌ ์ฐ์ฐ์
ELSE 'Passion pay'
END SAL_GRADE
FROM EMP
ORDER BY DEPTNO;

โ DECODE๋ โ=โ ์ฐ์ฐ๋ง ๊ฐ๋ฅํ ๊ฒ์ ๋นํด CASE๋ ๋ฒ์, ๋ ผ๋ฆฌ ๋ฑ ์์ ๋กญ๊ฒ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
โข
SELECT DEPTNO, ENAME, COMM,
CASE WHEN COMM >= 1000 THEN 'Great'
WHEN COMM >= 500 THEN 'Good'
WHEN COMM >= 0 THEN 'Bad'
ELSE 'Dreadful' -- ELSE์์ NULL Catch
END COMM_GRADE
FROM EMP
ORDER BY DEPTNO;
โ COMM
์ NULL
์ ๊ฐ์ง ์ปฌ๋ผ์ด๋ค. NULL
์ ์ผ๋ฐ ๋น๊ต์ฐ์ฐ์๋ก ๋น๊ตํ ์ ์๋ค.
โ NULL์ ๋ํ ์ฒ๋ฆฌ๋ else ๊ตฌ๋ฌธ์์ ์ฒ๋ฆฌ ๋๋ค.

โฃ-1
โ ์์ ๊ฐ๋ถํฐ ํฐ ๊ฐ ์กฐ๊ฑด ๋น๊ต โ ์ ๋๋ก ์ฒ๋ฆฌ๋์ง ๋ชปํ๋ค.
SELECT SAL,
CASE
WHEN SAL >= 1000 THEN 1
WHEN SAL >= 2000 THEN 2
WHEN SAL >= 3000 THEN 3
WHEN SAL >= 4000 THEN 4
WHEN SAL >= 5000 THEN 5
ELSE 0
END AS SAL_GRADE
FROM EMP
ORDER BY SAL;

โฃ-2
โ ํฐ ๊ฐ๋ถํฐ ์์ ๊ฐ ์กฐ๊ฑด ๋น๊ต โ ํญ์ ํฐ ๊ฐ๋ถํฐ ์์ ๊ฐ์ผ๋ก ์กฐ๊ฑด ์ฒ๋ฆฌ ํด์ผ ํ๋ค.
SELECT SAL, CASE
WHEN SAL >= 5000 THEN 5
WHEN SAL >= 4000 THEN 4
WHEN SAL >= 3000 THEN 3
WHEN SAL >= 2000 THEN 2
WHEN SAL >= 1000 THEN 1
ELSE 0
END "Sal Grade"
FROM EMP
ORDER BY SAL;

DECODE
, CASE
๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด,
Java ์ฝ๋ ๋ด์์ SQL๊ณผ If-case๋ฌธ์ ์ฒ๋ฆฌ๋ฅผ ํตํด ๊ตฌํํด์ผ ํ๋ค.
Java ์ฝ๋ ๋ด์์ SQL ์ฒ๋ฆฌ์ Java ์กฐ๊ฑด ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ณตํ๋ฉด ๋ถํ์ํ Overhead (Context Switch) ๊ฐ ์ฆ๊ฐ ํ๋ค.
๋ฐ๋ผ์, ๊ฐ๋ฅํ SQL๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ด ์ข๋ค!
๐ ROWNUM
ROWNUM์ ํน์ ๋ ์ฝ๋์ ๋ถ์ฌ๋๋ ๊ณ ์ ํ ๋ฒํธ๊ฐ ์๋๋ค!
ROWNUM์ ์ฟผ๋ฆฌ์ ์ํด ๋ฆฌํด ๋ ๊ฐ๊ฐ์ ROW(Result Set
)์ ๋ถ์ฌ๋๋ค.
โ ROWNUM์ Pseudo Column (๊ฐ์์ ์ปฌ๋ผ) ์ด๋ค. (์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค.)
โ
SELECT ROWNUM, ENAME, DEPTNO, SAL FROM EMP;
โก
SELECT ROWNUM, ENAME, DEPTNO, SAL FROM EMP ORDER BY DEPTNO, SAL;

โข
SELECT ROWNUM, ENAME, DEPTNO, SAL FROM EMP WHERE DEPTNO IN (10, 20) ORDER BY DEPTNO, SAL;

- ์คํ ์์ :
WHERE
>ROWNUM
>ORDER BY
โฃ SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM = 1; // O , 1 Row = 1
โค SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM = 3; // X

- 1 Row != 3 โ ํํฐ๋ง โ 2 Row๊ฐ 1 Row๊ฐ ๋์ด 1 Row != 3 ๋น๊ต๋ฅผ ๋ฐ๋ณต
โฅ SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM > 3; // X

โฆ SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM <= 3; // O

โง SELECT ENAME,DEPTNO,SAL FROM EMP WHERE ROWNUM < 3; // O

๐ ๋ ผ๋ฆฌ์ฐ์ฐ์ AND OR NOT
โก SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE DEPTNO = 10 OR SAL > 2000;
โข
SELECT ENAME, JOB SAL, DEPTNO FROM EMP WHERE SAL > 2000 OR SAL > 2000;

โฃ SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE DEPTNO = 10 AND SAL > 2000 OR JOB = 'CLERK';
โค SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE (DEPTNO = 10 AND SAL > 2000) OR JOB = 'CLERK';
โฅ SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE DEPTNO = 10 AND (SAL > 2000 OR JOB = 'CLERK');
โฆ SELECT ENAME,JOB,SAL FROM EMP WHERE JOB != 'CLERK';
โง SELECT ENAME,JOB,SAL FROM EMP WHERE JOB NOT IN('CLERK','MANAGER');
๐ ํจ์

USER DEFINED FUNCTION (PL/SQL)
โ PL/SQL์ ์ด์ฉํด SQL์์๋ ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ์ ๋ง๋ค์ด์ ๊ณตํต ๋ชจ๋์ ๋ง๋ค์ด ์ฌ ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์๋ค.
๋จ์ผํ ํจ์
๋ฌธ์ ํจ์


โก SELECT ENAME, substr(ENAME,1,3), substr(ENAME,4), substr(ENAME,-3,2) FROM EMP;

โข SELECT ENAME, instr(ENAME,'A'), instr(ENAME,'A',2), instr(ENAME,'A',1,2) FROM EMP; // ๋ฌธ์์ด ๋ด์์น

โฃ SELECT ENAME,rpad(ENAME,10,' '),rpad(ENAME,10), rpad(ENAME,10,''),lpad(ENAME,10,'+') FROM EMP;

SELECT length(rpad('X',1000,'Xโ)), rpad('X',1000,'X') FROM DUAL; // dummy data

โค SELECT ENAME, REPLACE(ENAME,'S','s') FROM EMP;

โฅ SELECT ENAME, concat(ENAME,JOB), ENAME||JOB FROM EMP;

// ์ ๋ค ๊ณต๋ฐฑ๋ฌธ์ ์์ ๊ธฐ โฆ SELECT ltrim(' ๋ํ๋ฏผ๊ตญ '), rtrim(' ๋ํ๋ฏผ๊ตญ '),trim(' ' from ' ๋ํ๋ฏผ๊ตญ '), trim('*' from '๋ํ๋ฏผ๊ตญ') FROM dual;

SELECT trim('์ฅ' from '์ฅ๋ฐ์ฅ'), ltrim('์ฅ๋ฐ์ฅ','์ฅ'), rtrim('์ฅ๋ฐ์ฅ','์ฅ') FROM dual;

// ๋ฌธ์์ด ๊ธธ์ด ๋ฆฌํด โง SELECT length('abcd'), substr('abcd',2,2), length('๋ํ๋ฏผ๊ตญ'), substr('๋ํ๋ฏผ๊ตญ',2,2) FROM dual;
- DBMS ๋ด๋ถ ์ ์ฅ์ : ์๋ฌธ์ 1 Byte , ํ๊ธ: 2~3 Bytes ํ ๋น , length: ๋ฌธ์์ด ํจ์

- SUBSTR() ์ฌ์ฉ์ ํ๊ธ์ด๋ ์๋ฌธ๊ณผ ์ฐจ์ด๊ฐ ์๋ค. (๊ฐ์ ๋ฌธ์์ด๋ก ์ทจ๊ธ)
โจ SELECT lengthb('abcd'),lengthb('๋ํ๋ฏผ๊ตญ'),substr('๋ํ๋ฏผ๊ตญ',2,2),substrb('๋ํ๋ฏผ๊ตญ',2,2) FROM dual;

- DBMS ์ฒด๊ณ๊ฐ
UNICODE ์บ๋ฆญํฐ ์
์ ์ฌ์ฉํ๋ฏ๋ก, ํ๊ธ์ ๊ธ์ ๋น 3Bytes๋ฅผ ํ ๋น๋์ด์๋ค.
- SUBSTRB๋ byte ๋จ์๋ก ์ฒ๋ฆฌํ๋ฏ๋ก, โ๋ํ๋ฏผ๊ตญโ ํ๊ธ์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
โฉ SELECT length('abcd'), vsize('abcd'), length('๋ํ๋ฏผ๊ตญ'), vsize('๋ํ๋ฏผ๊ตญ') FROM dual;
- VSIZE : ํ ๋น๋ Bytes์ ๋ฆฌํด

โช SELECT ASCII('Aโ), ASCII('a') FROM dual; -- 65, 97

โซ
SELECT CHR(65), CHR(97) FROM DUAL;

SELECT 'Hellow'||CHR(10)||'World' FROM DUAL; -- Line feed ?? โ run as script โ double-click cell

์ซ์ ํจ์ (1)


โก SELECT trunc(45.923,2), trunc(45.923,1), trunc(45.923,0), trunc(45.923), trunc(45.923,-1) FROM dual;

โข SELECT mod(100,3), mod(100,2) FROM dual;

โฃ SELECT ENAME,SAL,SAL0.053 as tax, round(SAL0.053,0) as rtax FROM EMP; // ๊ธ์ฌ์5.3%์ธ๊ธ,์๋จ์ ๋ฐ์ฌ๋ฆผ

โค SELECT CEIL(-45.594),CEIL(-45.294),CEIL(45.294), ROUND(-45.594),ROUND(-45.294),ROUND(45.594) FROM DUAL; // ์ ๋๊ฐ์ฐ์ฐ

โฅ SELECT FLOOR(45.245),FLOOR(-45.245),FLOOR(45.545),FLOOR(-45.545) FROM DUAL;

์ซ์ ํจ์ (2)
๐0403 ๊ณผ์
2. OR ์ฐ์ฐ์ ์ค๋ณต๋๋ ROW๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ์๋์ SQL์ ์คํํํ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ช . DEPTNO = 20 OR JOB = 'CLERK' ๋ฅผ ๋๋ค ๋ง์กฑํ๋ ROW๋ 2๋ฒ ์ถ๋ ฅ ๋๋๊ฐ ?
SELECT DEPTNO,JOB,ENAME FROM EMP WHERE DEPTNO = 20; // 5 Rows
SELECT DEPTNO,JOB,ENAME FROM EMP WHERE JOB = 'CLERK'; // 4 Rows
SELECT DEPTNO,JOB,ENAME FROM EMP WHERE DEPTNO = 20 OR JOB = 'CLERK'; // 7 Rows



3. ๋ถ์๋ณ ์ฐจ๋ฑ ๋ณด๋์ค๋ฅผ ๊ณ์ฐํ๋ SQL ์์ฑ
- 10๋ฒ ๋ถ์ ๊ธ์ฌ์ 0.3%,20๋ฒ๋ถ์ ๊ธ์ฌ์ 20%,30๋ฒ ๋ถ์ ๊ธ์ฌ์ 10%,๋๋จธ์ง ๋ชจ๋ ๋ถ์ 1%
- ๋ถ์ ๋ฒํธ, ์ด๋ฆ,์ง๋ฌด,๊ธ์ฌ,๋ณด๋์ค ์ถ๋ ฅ
- ๋ถ์๋ณ, ์ต๊ณ ๋ณด๋์ค ์์๋ก ์ ๋ ฌ
- ์์์ ๋ฐ์ฌ๋ฆผ
- ์ปฌ๋ผํค๋ฉ ๋ณ๊ฒฝ์ ์ปฌ๋ผ Alias ์ฌ์ฉ
SELECT DEPTNO, ENAME, JOB, SAL,
ROUND(SAL * DECODE(DEPTNO, 10, 0.003, 20, 0.2, 30, 0.1, 0.01)) AS "๋ณด๋์ค"
FROM EMP
ORDER BY DEPTNO, "๋ณด๋์ค" DESC;
4. DECODE ์ CASE์ด ์ฐจ์ด์ ์ ๋ฆฌํ ๋ฐํ
decode
ํจ์๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฐ์ ๋ฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก decode
ํจ์๋ ํ๋์ ๊ฐ์ ๋น๊ตํ๊ณ , ์ผ์นํ๋ ๊ฒฝ์ฐ(โ=โ)์๋ง ํด๋น ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค.์กฐ๊ฑด์ ( IF ~ ELSE IF ~ELSE ) ์ฐ์ฐ์
โ=โ ๋น๊ต ์ฐ์ฐ์๋ง ์ฌ์ฉ
๋ฐ๋ฉด์, ANSI/ISO ํ์คcase
ํจ์๋decode
์ฐ์ฐ์์ ๊ธฐ๋ฅ ํ์ฅํ ๊ฒ์ผ๋ก ๋น๊ต, ๋
ผ๋ฆฌ, SQL ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
SELECT CASE
WHEN age >= 65 THEN 'Senior'
WHEN age >= 18 THEN 'Adult'
ELSE 'Child'
END AS age_group
FROM employees;
5. CASE ๊ตฌ๋ฌธ์์ LIKE ์ฐ์ฐ์ ์ IN ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ์์์ SQL ์์ฑ
SELECT DEPTNO, ENAME, JOB,
CASE
WHEN JOB LIKE 'A%' THEN 'A'
WHEN JOB IN('CLERK', 'SALESMAN') THEN 'B'
ELSE 'C'
END AS "JOB_RANK"
FROM EMP;
6. ์คํํ ๊ฒฐ๊ณผ ์ค๋ช
SELECT DEPTNO, ENAME, DECODE(DEPTNO,10,'ACCOUNTING',20,'RESEARCH','ETC') FROM EMP ORDER BY DEPTNO;
SELECT DEPTNO, ENAME, DECODE(DEPTNO,10,'ACCOUNTING',20,'RESEARCH') FROM EMP ORDER BY DEPTNO;
7. ์ค์ฒฉ decode๋ฅผ ์ฌ์ฉํ ์๋์ ๊ฒฐ๊ณผ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ decode + || (ํฉ์ฑ์ฐ์ฐ์)๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ ํ์ญ์์
select deptno,job,decode(deptno, 10 ,decode(job,'CLERK','OK','NO'),'NOโ)
from emp
order by deptno,job;
๋ต
SELECT deptno,job,decode(deptno||JOB, '10CLERK' , 'OK', 'NO')
FROM emp
ORDER BY deptno,job;
Uploaded by N2T