본문 바로가기
국비 학원 가서 개발새발

국비학원 15일차) ORACLE 시작!!

by 휴일이 2022. 10. 19.

SELECT * FROM TAB; 어떤 테이블이 들어 있는지 정보

DESC 테이블; (테이블 구조) 칼럼목록과 자료형, NULL 허용 여부


SELECT * FROM EMP;
ㄴ EMP의 모든 열 정보 보여줘

DISTINCT 중복제거
SELECT DISTINCT JOB, DEPTNO FROM EMP;
EMP의 JOB,DEPTNO 열의 중복을 제거해줘



열이름 AS 별명이름
SELECT ENAME, SAL, SAL*12+COMM AS ANNSAL, COMM FROM EMP;
SAL*12에 COMM을 더한 열의 이름을 ANNSAL 이라고 해줘

연결연산자
칼럼명 || 칼럼명
SELECT LAST_NAME || SALARY AS GOOD
FROM EMPLOYEES;
LAST_NAME과 SALARY를 붙여서 출력해주는데 그 칼럼 이름은 GOOD 이라고 붙여줘 

칼럼명||사이에 추가할 단어||칼럼명
SELECT LAST_NAME || ' ' || JOB_ID AS GOOD
FROM EMPLOYEES;
LAST_NAME과 SALARY를 붙여서 출력해주는데 그 사이에 ' '(공백)추가해줘 그 칼럼 이름은 GOOD 이라고 붙여줘

인용 연산자 Q'[]'
컬럼 || Q'[이 안에 아무거나 넣을 수 있음]' || 컬럼
SELECT DEPARTMENT_NAME || Q'DEPARTMENT'S MANAGER ID:]' || MANAGER_ID AS MANAGER_ID
FROM DEPARTMENTS;

그냥 'DEPARTMENT'S MANAGER ID: ' 라고 치면
MANAGER <-이 단어가 이름이랑 겹쳐서 사용이 안 됨ㅠㅠ
그래서 Q'[]' 요 안에 넣어주면 마음대로 쓸 수 있다


ORDER BY 열이름
SELECT *
FROM EMP
ORDER BY SAL;
EMP의 모든 열 출력해, SAL을 오름차순 한 기준으로(기본정렬)

ORDER BY 열이름 DESC //내림차순

SELECT *
FROM EMP
ORDER BY DEPTNO ASC, SAL DESC;

EMP의 모든 열 출력해, 먼저 DEPTNO 기준으로 오름차순(ASC)하고,
그 다음 중복이면 SAL은 내림차순(DESC)해

-ORDER BY는 정렬이 꼭 필요한 경우라면 쓰지마셈, 성능 저하



SELECT 칼럼 FROM 테이블명 WHERE 조건문

SELECT *
FROM EMP
WHERE DEPTNO=30;

EMP의 모든 칼럼 중에 DEPTNO이 30인 행만 출력해줘


WHERE 조건식 AND 조건식

SELECT *
FROM EMP
WHERE DEPTNO = 30
AND JOB = 'SALESMAN';

EMP의 모든 칼럼중에 DEPTNO 30이고 JOB 'SALESMAN'인 행만 출력해줘


WHERE 조건식 OR 조건식

SELECT *
FROM EMP
WHERE DEPTNO = 30
OR JOB = 'SALESMAN';

EMP의 모든 칼럼중에 DEPTNO 30이거나 JOB 'SALESMAN'인 행만 출력해줘



연산자 + - * /

SELECT *
FROM EMP
WHERE SAL*12=36000;

EMP의 SAL*12가 36000인 행만 출력해줘


비교 연산자 > = <

SELECT *
FROM EMP
WHERE SAL >=3000;

EMP의 SAL이 3000이거나 더 큰 사람만 출력해줘


문자열도 기본정렬이 있기 때문에, 비교 연산자 가능!


SELECT *
FROM EMP
WHERE ENAME>='F';

EMP의 ENAME 첫 글자가 F거나 그 뒤쪽만 검색해줘

문자 여러개도 함께 비교 가능!

SELECT *
FROM EMP
WHERE ENAME>='FORZ';

EMP의 FORZ를 포함한 문자열보다 알파벳 순서로 앞에 있는 행을 출력해줘
'FIND'라면
'F'가 첫글자라 일단 포함안되니 패스
'O'가 두번째 글자, 'I'가 알파벳 순서가 더 빠름
ㄴ 조건식 해당, 출력!!


등가 비교 연산자 = != <> ^=
A=B : A와 B가 같으면 TRUE
그 외 : A와 B가 다르면 FALSE

SELECT *
FROM EMP
WHERE SAL != 3000;

EMP의 SAL이 3000이 아닌 값만 출력


논리 부정 연산자 NOT

SELECT *
FROM EMP
WHERE NOT SAL = 3000;

EMP의 SAL이 3000이 아닌 값만 출력 자바에서 !(조건식)


IN 연산자

SELECT *
FROM EMP
WHERE JOB IN('MANAGER','SALESMAN','CLERK');

EMP의 JOB이 MANAGER, SALESMAN, CLERK람면 출력해줘


SELECT *
FROM EMP
WHERE JOB NOT IN('MANAGER','SALESMAN','CLERK');
NOT IN이라면 반대값 반환 ㄴ 위의 세개가 아니라면 출력해줘


WHERE 칼럼명 BETWEEN 최소값 AND 최대값

SELECT *
FROM EMP
WHERE SAL BETWEEN 2000 AND 3000;

EMP의 SAL이 2000에서 3000 사이의 데이터만 출력해줘

SELECT *
FROM EMP
WHERE SAL NOT BETWEEN 2000 AND 3000
ORDER BY SAL ASC;
NOT BETWEEN 2000~3000사이의 값만 빼고 출력해줘
그리고 오름차순으로 출력해줘


LIKE 연산자와 와일드 카드 _ %

_ 어떤 값이든 상관 없이 한 개의 문자 데이터
% 길이와 상관 없이(문자 없어도 괜찮음) 모든 문자 데이터

SELECT *
FROM EMP
WHERE ENAME LIKE 'S%';
이름이 S로 시작하는 사람만 출력해줘

SELECT *
FROM EMP
WHERE ENAME LIKE '_L%';
이름 두번째 글자가 L인 사람만 출력해줘

SELECT *
FROM EMP
WHERE ENAME LIKE '%AM%';
이름에 AM이 포함 되어 있다면 출력해줘

<NOT LIKE>
SELECT *
FROM EMP
WHERE ENAME NOT LIKE '%AM%';
이름에 AM이 포함 안 되어 있는 사람만 출력해줘


LIKE와 와일드 카드를 활용한 SELECT문은
와일드 카드를 어떻게 사용하느냐에 따라
데잍터 조회해오는 시간 차이가 있음(성능 차이)
잘 써봅시다^^



IS NULL
NULL은 무조건 IS NULL로만 비교 가능

SELECT *
FROM EMP
WHERE COMM IS NULL;
COMM이 NULL값인 행만 출력해줘

SELECT *
FROM EMP
WHERE COMM IS NOT NULL;
COMM이 NULL값이 아닌 행만 출력해줘 (IS NOT NULL)


UNION 집합 연산자
데이터 조회한 결과를 하나의 집합으로 다루기

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20;

EMPNO, ENAME, SAL, DEPTNO 출력해줘, DEPTNO은 10이어야 해
EMPNO, ENAME, SAL, DEPTNO 출력해줘, DEPTNO은 20이어야 해
두개 합쳐서 출력해!!

주의)
1.SELECT문이 출력하려는 칼럼 개수가 같음
2.SELECT문이 출력하려는 칼럼 자료형이 같음
3.칼럼의 순서도 일치해야 함


참고로 위의 구문과 출력값 똑같음
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10 OR DEPTNO = 20;


1. UNION을 사용하여 출력
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

2. UNION ALL을 사용하여 출력
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION ALL
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;


UNION은 데이터 중복 제거한 상태로 결과값 출력
UNION ALL은 중복 데이터도 모두 출력(복사출력?)


MINUS 차집합
두 SELECT문의 결과 값이 같은 데이터는 체외하고
첫 번째 데이터 출력

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
MINUS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;
EMPNO, ENAME, SAL, DEPTNO 칼럼들 출력해줘
DEPTNO이 10인 결과 제외하고!


INTERSECT 교집합
두 SELECT문의 결과 값이 같은 데이터만 출력

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
INTERSECT
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;
EMPNO, ENAME, SAL, DEPTNO 칼럼들 출력해줘
DEPTNO이 10인 행만!



SELECT (COUNT) (DISTINCT)
FROM
WHERE (LIKE) (BETWEEN) (AND,OR) (IN NULL) (IN())
ORDER BY




<문자 함수>

UPPER(문자열) 전부 대문자 변환
LOWER(문자열) 전부 소문자 변환
INITCAP(문자열) 첫글자는 대문자, 나머지는 소문자
- 검색할 때 유용함, 전부 대문자로 바꾼 후에 검색하면 대소문자 나뉘어도 포함 문자 한번에 검색가능!

SELECT ENAME, UPPER(ENAME), LOWER(ENAME), INITCAP(ENAME)
FROM EMP;
이름,대문자이름,소문자이름,대소문자 이름 출력해줘

SELECT *
FROM EMP
WHERE UPPER(ENAME) LIKE UPPER('%smith%');
이름을 대문자로 변환해줘, 그리고 거기에서 이름에 smith가 포함 된 행을 가져와줘


LENGTH(칼럼) 문자열 길이 구하기
SELECT ENAME,LENGTH(ENAME)
FROM EMP
WHERE LENGTH(ENAME)>=5;
이름과 이름길이를 보여줘, 근데 이름 길이가 5이상인 결과만 보여줘

LENGTHB(칼럼) 문자열 바이트 수 구하기
SELECT LENGTH('한글'), LENGTHB('한글')
FROM DUAL;
'한글'의 문자열 길이와 문자열의 바이트 수를 출력해줘 (2, 4)
-한글은 한 문자당 2BYTE 랍니다


SUBSTR 문자열 추출
SUBSTR(문자열, 시작위치)
SUBSTR(문자열, 시작위치, 추출길이)

SELECT JOB, SUBSTR(JOB, 1, 2), SUBSTR(JOB, 3, 2), SUBSTR(JOB, 5)
FROM EMP;
직업, 직업 첫번째글자부터 2개, 직업 세번째 글자부터 두개, 직업 다섯번째글자 부터 출력해줘

-LENGTH(칼럼) -5 -4 -3 -2 -1 ...이렇게 반대로 계산
SELECT JOB, SUBSTR(JOB, -LENGTH(JOB), 2)
FROM EMP;
직업, 직업의 -LENGTH(처음시작), 부터 2글자 출력해줘


INSTR 문자열 위치 찾기
INSTR(문자열,위치 찾으려는 부분문자) 까지 2개는 필수!!
INSTR(문자열,위치 찾으려는 부분문자,
몇번째 글자부터 찾을 건지 숫자(시작위치),시작위치에서 몇번째에 있는 문자를 찾을 건지(등수?))

SELECT
INSTR('HELLO, ORACLE!', 'L') AS INSTR_1,
INSTR('HELLO, ORACLE!', 'L', 5) AS INSTR_2,
INSTR('HELLO, ORACLE!', 'L', 2, 2) AS INSTR_3
FROM DUAL;

'HELLO, ORACLE!' 에서
1.L이 어디 있는지 알려줘, 맨 처음 찾은 L이 몇번째 글자인지 알려줘
2.5번째부터 검색해서, 처음 찾은 L이 몇번째 글자인지 알려줘
3.2번째 글자부터 검색할 건데, 처음 L 말고 2번째 L은 몇번째에 있는지 알려줘

SELECT *
FROM EMP
WHERE INSTR(ENAME, 'S')>0; //WHERE ENAME LIKE '%S%'
이름에 S가 있는 행을 구해줘



REPLACE 특정 문자를 다른 문자로 바꾸기
REPLACE(문자열 또는 칼럼,찾는 문자,대체할 문자)
대체할 문자를 지정하지 않으면 찾는 문자가 삭제되어 출력

SELECT '010-1234-5678' AS REPLACE_BEFOR,
REPLACE('010-1234-5678', '-', ' ') AS REPLACE_1,
REPLACE('010-1234-5678', '-') AS REPLACE_2
FROM DUAL;

'010-1234-5678' 에서
1. '-'를 ' '로 바꿔서 출력해줘 별명은 REPLACE_1
2. '-'를 삭제하고 출력해줘 별명은 REPLACE_2



LPAD, RPAD 데이터 빈 공간 채우기
LPAD 왼쪽 RPAD 오른쪽
?PAD(문자열 또는 칼럼이름,데이터 자릿수, 채울 문자) 채울 문자를 안 쓰면 공백으로 채움

SELECT 'ORACLE',
LPAD('ORACLE', 10, '#') AS LPAD_1,
RPAD('ORACLE', 10, '*') AS RPAD_1,
LPAD('ORACLE', 10) AS LPAD_2,
RPAD('ORACLE', 10) AS RPAD_2
FROM DUAL;

'ORACLE'을 출력할 건데
1.총 10칸을 두고 ORACLE 왼쪽에 '#'로 채울 거야
2.총 10칸을 두고 ORACLE 오른쪽에 '*'로 채울 거야
3.총 10칸을 두고 ORACLE 왼쪽을 공백으로 채울 거야
4.총 10칸을 두고 ORACLE 오른쪽을 공백으로 채울 거야


CONACT 두 문자열 데이터를 합치다

SELECT
CONCAT(EMPNO, ENAME),
CONCAT(EMPNO, CONCAT(' : ', ENAME))
FROM EMP;

1. EMPNO과 ENAME을 같이 출력해줘
2. EMPNO과 ' : ' ENAME 이렇게 붙여서 출력해줘



TRIM, LTRIM, RTRIM 특정 문자 지우기
TRIM(삭제 옵션, 삭제 문자 FROM 원본 문자열)

TRIM의 삭제옵션
LEADING 왼쪽 지우기
TRAINING 오른쪽 지우기
BOTH 양쪽 지우기(기본, 안써도 됨)

SELECT
'[' || TRIM(' * *ORACLE* * ')|| ']' AS TRIM,
'[' || TRIM(LEADING FROM ' * *ORACLE* * ')|| ']' AS TRIM_LEADING,
'[' || TRIM(TRAILING FROM' * *ORACLE* * ')|| ']' AS TRIM_TRAILING,
'[' || TRIM(BOTH FROM' * *ORACLE* * ')|| ']' AS TRIM_BOTH
FROM DUAL;

- 삭제할 문자 지정 안 했을 때
1.[* *ORACLE* *] (기본) 양 쪽 다 제거
2.[* *ORACLE* * ] 왼쪽만 제거
3.[ * *ORACLE* *] 오른쪽만 제거
4.[* *ORACLE* *] 양쪽 다 제거


SELECT
'[' || TRIM('*' FROM '* *ORACLE* *')|| ']' AS TRIM,
'[' || TRIM(LEADING '*' FROM '* *ORACLE* *')|| ']' AS TRIM_LEADING,
'[' || TRIM(TRAILING '*' FROM '* *ORACLE* *')|| ']' AS TRIM_TRAILING,
'[' || TRIM(BOTH '*' FROM'* *ORACLE* *')|| ']' AS TRIM_BOTH
FROM DUAL;

-삭제할 문자 지정 했을 때
1.[ *ORACLE* ] (기본) 양 쪽 다 제거 TRIM
2.[ *ORACLE* *] 왼쪽만 제거 LEADING FROM
3.[* *ORACLE* ] 오른쪽만 제거 TRAILING FROM
4.[ *ORACLE* ] 양쪽 다 제거 BOTH FROM


LTRIM, RTRIM(문자열, 삭제할 문자 집합(여러개 지정 가능)) - 문자 지정 안 하면 공백지워짐

SELECT
'[' || TRIM(' _ORACLE_ ')|| ']' AS TRIM,
'[' || LTRIM(' _ORACLE_ ')|| ']' AS LTRIM,
'[' || LTRIM('<_ORACLE_>','_<')|| ']' AS LTRIM_2,
'[' || RTRIM(' _ORACLE_ ')|| ']' AS RTRIM,
'[' || RTRIM('<_ORACLE_>','>_')|| ']' AS RTRIM_2
FROM DUAL;

1.[_ORACLE_] (기본) 공백 제거 TRIM
2.[_ORACLE_ ] (기본)왼쪽 제거 LTRIM
3.[ORACLE_>] 왼쪽 제거(문자열) LTRIM
4.[ _ORACLE_] (기본) 오른쪽 제거 RTRIM
5.[<_ORACLE] 오른쪽 제거(문자열) RTRIM



숫자 데이터 연산하고 수치 조정하는 함수
ROUND 반올림
TRUNC 절사(버림)
CEIL 이거보다 큰데 그중에 가장 작아
FLOOR 이거보다 작은데 그 중에 제일 커
MOD 나누고 나머지



반올림 ROUND
ROUNT(숫자, 
SELECT
ROUND(1234.5678) AS ROUND,
ROUND(1234.5678, 0) AS ROUND_0,
ROUND(1234.5678, 1) AS ROUND_1,
ROUND(1234.5678, 2) AS ROUND_2,
ROUND(1234.5678, -1) AS ROUND_MINUS1,
ROUND(1234.5678, -2) AS ROUND_MINUS2
FROM DUAL;
1.  다 버리고 반올림해줘 - 1235
2. 소수점 0개 남기고 반올림 해줘(위와 같음) - 1235
3. 소수점 1개 남기고 반올림 해줘 - 1234.6
4. 소수점 2개 남기고 반올림 해줘 - 1234.57
5. 소수점 -1(1의 자리)버리고 반올림해줘 - 1230
6. 소수점 -2(10의 자리)버리고 반올림해줘 - 1200


절사(버림) TRUNC
TRUNC(숫자, 버릴위치) 위치 지정 안 하면 소수점 첫째자리에서 버림

SELECT
TRUNC(1234.5678) AS TRUNC,
TRUNC(1234.5678, 0) AS TRUNC,
TRUNC(1234.5678, 1) AS TRUNC,
TRUNC(1234.5678, 2) AS TRUNC,
TRUNC(1234.5678, -1) AS TRUNC,
TRUNC(1234.5678, -2) AS TRUNC
FROM DUAL;
1.소수점 다 버리고 버려줘 - 1234
2.소수점 0개 남기고 버려줘(위와 같음) - 1234
3.소수점 1개 남기고 버려줘 - 1234.5
4.소수점 2개 남기고 버려줘 - 1234.56
5.소수점 -1(1의 자리) 버려줘 - 1230
6. 소수점 -2(10의 자리) 버려줘 - 1200



가까운 수 찾기 CEIL, FLOOR
CEIL(숫자) 숫자에 가장 가까운 제일 큰 정수
FLOOR(숫자) 숫자에 가장 가까운 제일 작은 정수

SELECT
CEIL(3.14), //4
FLOOR(3.14), //3
CEIL(-3.14), //-3
FLOOR(-3.14) //-4
FROM DUAL;


나머지 구하기 MOD (JAVA의 %)

SELECT
MOD(15,6), //3
MOD(10,2), //0
MOD(11,2) //1
FROM DUAL;



<날짜 함수>
날짜+숫자 : 날짜에 숫자를 더한 날짜
날짜-숫자 : 날짜에 숫자를 뺀 날짜
날짜-날짜 : 두 날짜의 일수 차이
----
날짜+날짜 : 이런 건 없음

참고)))
SYSDATE - 내 컴퓨터 날짜

SELECT
SYSDATE AS NOW,
SYSDATE+1 AS YESTERDAY,
SYSDATE-1 AS TOMORROW
FROM DUAL;

1.오늘
2.내일(오늘+1)
3.어제(오늘-1)



ADD_MONTHS 몇개 월 이후 날짜
ADD_MONTH(날짜, 더할 개월 수)

SELECT
ADD_MONTHS(SYSDATE, 3)
FROM DUAL;
오늘 날짜에서 3개월 후는 언제?


SELECT EMPNO, ENAME, HIREDATE, SYSDATE
FROM EMP
WHERE ADD_MONTHS(HIREDATE, 240)<SYSDATE;
HIREDATE에 20년 더한 게 지금 날짜보다 작은 행만 보여줘



MONTHS_BETWEEN 두 날짜간의 개월 수 차이
MONTHS_BETWEEN(날짜1, 날짜2)


SELECT
MONTHS_BETWEEN(HIREDATE, SYSDATE),
MONTHS_BETWEEN(SYSDAYE, HIREDATE),
TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE))
FROM EMP;

1.HIREDATE(예전)와 SYSDATE(지금)간의 날짜 차이는? 값 -
2.SYSDATE(지금)과 HIREDATE(예전)간의 날짜 차이는? 값 +
3.SYSDATE(지금)과 HIREDATE(예전)간의 날짜 차이 구하고 소수점 다 버려줘



돌아오는 요일 NEXT_DAY
NEXT_DAY(날짜, 요일)

달의 마지막 날짜 LAST_DAY
LAST_DAY(날짜)

SELECT
SYSDATE,
NEXT_DAY(SYSDATE, '월요일'),
LAST_DAY(SYSDATE)
FROM EMP;

1.지금 날짜
2.돌아오는 월요일
3.이 달의 마지막 날


날짜 반올림 ROUND
ROUND(날짜, 반올림 기준 포맷)
날짜 절사(버림) TRUNC
TRUNC(날짜, 버림 기준 포맷)
ㄴ 이건 그냥 이런 게 있고 사용할 수 있다~정도로 알아두자
ㄴ 날짜 데이터 포맷이 너무 많다... 사용할 때 검색하자




오라클에서는 문자(로 된 숫자)->숫자로 자동 형변환 된다
EMPNO + '500' 하면?
앞에는 숫자, 500은 문자 데이터지만
자동 형변환이 되어 EMPNO에 숫자 500을 더한 값이 됨
그 외에는 명시적 형변환 필요


<명시적 형변환>
TO_CHAR : 숫자나 날짜를 문자로
TO_NUMBER : 문자를 숫자로
TO_DATE : 문자를 날짜로


TO_CHAR(날짜, 출력되길 원하는 문자 형태)
SELECT
TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS')
FROM DUAL;
지금 날짜를 'YYYY/MM/DD HH24:MI:SS' 형태로 변환해줘

SELECT *
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'DAY')='일요일';
HIRE_DAY의 날이 일요일인 사람의 정보만 출력해줘


NLS_DATE_LANGUAGE = 출력하고 싶은 언어'
ㄴ 추가하면 날짜를 그 나라의 언어로 출력해준다

SELECT
TO_CHAR(SYSDATE, 'MON', 'NLS_DATE_LANGUAGE = KOREAN') AS KOR
FROM DUAL;
지금 무슨 달인지 한국어로 알려줘

TO_CHAR(SYSDATE, 'HH:MI:SS P.M.') AS KOR ->요건 시간 출력
ㄴ 지금 시간,분,초 오후로 알려줘


TO_NUMBER 문자를 숫자로 변환
TO_NUMBER(문자열, 인식 될 숫자 형태)

SELECT
TO_NUMBER('1,300','999,999') - TO_NUMBER('1,200','999,999') //100
FROM DUAL;
1,300과 1,200을 999,999 숫자 형태로 변환한 다음 뺄셈을 해줘


TO_DATE 문자를 날짜형 데이터로 형변환

TO_DATE('2005/01/01','YYYY/MM/DD')
2005/01/01을 2005년 01월 01일인 날짜로 형변환 해줘

SELECT *
FROM EMPLOYEES
WHERE
JOB_ID LIKE 'SA%'
AND SALARY>=10000
AND (HIRE_DATE BETWEEN TO_DATE('2005/01/01','YYYY/MM/DD') AND TO_DATE('2005/12/31','YYYY/MM/DD'));
1.JOB_ID가 'SA'로 시작하고
2.SALARY가 10000이상인
3.2005년 입사자를 검색해줘 (2005/01/01~2005/12/31)



NULL 처리

NVL(NULL여부 검사할 데이터나 칼럼,NULL일 경우 반환할 데이터)

SELECT
NVL(COMM,0),
SAL+NVL(COMM,0)
FROM EMP;

1.COMM이 NULL이라면 0으로 출력해줘
2.SAL+COMM 할 건데, COMM에 NULL값이 있다면 0이라고 출력해줘


NVL2(NULL여부 검사할 데이터,NULL이 아닐 경우 반환할 데이터OR계산식, NULL일 경우 반환할 데이터OR계산식)

SELECT
NVL2(COMM,'O','X'),
NVL2(COMM, SAL*12+COMM, SAL*12) AS ANNSAL
FROM EMP;

1.COMM이 NULL이라면 X, 아니라면 O를 출력해줘
2.COMM이 NULL이라면 SAL*12 하고, 아니라면 SAL*12+COMM 해줘



상황에 따라 다른 데이터 반환 DECODE, CASE

DECODE -> 기준이 있는 조건문
DECODE(검사할 데이터,조건1,조건1이 만족하면 반환할 결과,조건2,조건2가 만족하면 반환할 결과,조건 전부 불일치 할 경우 반환할 결과)//마지막 안 쓰면 NULL반환

SELECT EMPNO, ENAME, JOB, SAL,
DECODE(JOB,
'MANAGER', SAL*1.1,
'SALESMAN', SAL*1.05,
'ANALYST', SAL,
SAL*1.03) AS UPSAL
FROM EMP;

칼럼 UPSAL을 출력해줘, UPSAL의 내용은?
JOB에서 값이
'MANAGER'라면 SAL*1.1 하고
'SALESMAN'라면 SAL*1.05 하고
'ANALYST'라면 SAL 하고,
전부 다 속하지 않는다면?
SAL*1.03 해줘


CASE -> 기준이 없어도 되는 조건문
CASE 검사 대상,혹은 연산이나 함수의 결과(안써도 됨)
WHEN 조건1 THEN 조건1이 맞으면 반환할 결과
WHEN 조건2 THEN 조건2이 맞으면 반환할 결과
ELSE 일치하는 조건이 없으면 반환할 결과
END


SELECT EMPNO, ENAME, JOB, SAL,
CASE JOB
WHEN 'MANAGER' THEN SAL*10
WHEN 'SALESMAN' THEN SAL*1.5
ELSE SAL*2
END
FROM EMP;

JOB을 기준으로
'MANAGER'라면 SAL*10
'SALESMAN'라면 SAL*1.5
해당 사항 없으면 SAL*2 해줘


SELECT EMPNO, ENAME, COMM,
CASE
WHEN COMM IS NULL THEN '해당사항 없음'
WHEN COMM = 0 THEN '수당 없음'
WHEN COMM > 0 THEN '수당 : ' || COMM
END AS COMM_TXT
FROM EMP;

COMM이 NULL이라면 '해당사항 없음'
COMM이 0이라면 '수당 없음'
COMM이 0보다 크면 ' 수당 : COMM '
이 칼럼 명은 COMM_TEXT 으로 해줘

728x90