📚Study Note/ORACLE
[ ORACLE ] 3일차 ⓐ(시간반환함수, 데이터합치기 ||, 문자열 안에 ''_어퍼두개) NVL() NVL2() COALESCE()
칠칠라
2021. 3. 26. 11:19
SELECT USER
FROM DUAL;
--==>>SCOTT
-- ○ 현재 날짜 및 시간을 반환하는 함수
SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP
FROM DUAL;
--==>>21/03/26
--21/03/26 21/03/26
--09:09:56.000000000
-- ※ 날짜와 시간에 대한 세션 환경 설정 변경
--어제해도 오늘 되돌아와있음.
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==>>Session이(가) 변경되었습니다.
SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP
FROM DUAL;
--=>>2021-03-26 09:12:52
--2021-03-26 09:12:52
--21/03/26 09:12:52.000000000
-- ※ 날짜와 시간에 대한 세션 환경 설정 다시 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--=>>Session이(가) 변경되었습니다.
SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP
FROM DUAL;
--==>>2021-03-26
--2021-03-26
--21/03/26 09:15:07.000000000
--세션변경하면 앞에 두 개는 바뀜. LOCAL은 안바뀜
-- ○ 컬럼과 컬럼의 연결(결합)
-- 문자 타입과 문자 타입의 연결
-- 『+』 연산자를 통한 결합 수행은 불가능 → 『||』
--오라클에서는 문자열 결합 연산자로 활용된다.
SELECT 1+1
FROM DUAL;
---===>>2
--SELECT '스펀지밥' + ' 그리고 징징이'
--FROM DUAL;
--===>> "invalid number"
SELECT '스펀지밥','징징이'
FROM DUAL;
--==>>스펀지밥 징징이
SELECT '스펀지밥' || ' 그리고 징징이'
FROM DUAL;
--==>>스펀지밥 그리고 징징이
DESC TBL_EMP;
이름 널? 유형
-------- -- ------------
EMPNO NUMBER(4) → 숫자타입
ENAME VARCHAR2(10) → 문자타입
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SELECT EMPNO, ENAME
FROM TBL_EMP;
SELECT EMPNO || ENAME
FROM TBL_EMP;
/*
7369SMITH
7499ALLEN
7521WARD
7566JONES
7654MARTIN
7698BLAKE
7782CLARK
7788SCOTT
7839KING
7844TURNER
7876ADAMS
7900JAMES
7902FORD
7934MILLER
8000정주니
8001유리미*/ --각기 다른 데이터 타입도 연결이 가능하다.
-- 문자 날짜 문자 숫자 문자 <타입>
SELECT '스폰지밥은', SYSDATE, '에 연봉 ', 500, '억을 원한다.'
FROM DUAL;
--==>>스폰지밥은 2021-03-26 에 연봉 500 억을 원한다.
SELECT '스폰지밥은 '|| SYSDATE || '에 연봉 '|| 500 || '억을 원한다.'
FROM DUAL;
--==>>스폰지밥은 2021-03-26에 연봉 500억을 원한다.
--오라클은 내부적으로 캐스팅하지않아도 자동으로 형변환을 해준다는 게 된다.
--위의 경우 여러컬럼에, 아래는 하나의 컬럼에 나온다.
-- ※ 오라클에서는 문자 타입의 형태로 형 변환하는 별도의 과 정 없이
-- 위에서 처리한 내용처럼 || 만 삽입해주면 간단하게 컬럼과 컬럼을
-- (서로 다른 종류의 데이터) 결합하는 것이 가능하다.
-- MS-SQL 에서는 모든 데이터를 문자 타입으로 CONVERT 해야 한다.
-- 실습을 위해 만들었던 데이터를 삭제하고 아래 실습을 진행한다.
DELETE
FROM TBL_EMP
WHERE EMPNO=8000 OR EMPNO=8001; -- IN (8000,8001); 도 된다.
--==>>2개 행 이(가) 삭제되었습니다.
--DELETE *
--FROM TBL_EMP
--WHERE EMPNO IN (8000,8001);
SELECT *
FROM TBL_EMP;
COMMIT;
--==>>커밋 완료.
-- ○TBL_EMP 테이블의 데이터를 활용하여 모든 직원들의 데이터에 대해서
-- 다음과 같은 결과를 얻을 수 있도록 쿼리문을 구성한다.
-- SMITH 의 현재 연봉은 9600 인데 희망 연봉은 19200 이다.
-- ALLEN 의 현재 연봉은 19500 인데 희망 연봉은 39000이다.
SELECT *
FROM TBL_EMP;
SELECT ENAME || ' 의 현재 연봉은 ' || (SAL*12+NVL(COMM,0)) || ' 인데 희망 연봉은 ' || 2*(SAL*12+NVL(COMM,0)) || ' 이다.'
FROM TBL_EMP;
/*
SMITH 의 현재 연봉은 9600 인데 희망 연봉은 19200 이다.
ALLEN 의 현재 연봉은 19500 인데 희망 연봉은 39000 이다.
WARD 의 현재 연봉은 15500 인데 희망 연봉은 31000 이다.
:
:
*/
--[선생님풀이 1]
SELECT ENAME || ' 의 현재 연봉은 ' || NVL(SAL*12+COMM,SAL*12) || ' 인데 희망 연봉은 ' || 2*NVL(SAL*12+COMM,SAL*12) || ' 이다.'
FROM TBL_EMP;
--[선생님 풀이2]
SELECT ENAME || ' 의 현재 연봉은 ' || NVL2(COMM,SAL*12+COMM,SAL*12) || ' 인데 희망 연봉은 ' || 2*NVL2(COMM,SAL*12+COMM,SAL*12) || ' 이다.'
FROM TBL_EMP;
--[선생님 풀이3] ○ 다시보기
SELECT ENAME || ' 의 현재 연봉은 ' ||COALESCE(SAL*12+COMM,SAL*12,COMM,0) || ' 인데 희망 연봉은 ' || 2*COALESCE(SAL*12+COMM,SAL*12,COMM,0) || ' 이다.'
FROM TBL_EMP;
--[실습]
-- SMITH's 입사일은 1980-12-17 이다. 그리고 급여는 800 이다.
-- ALLEN's 입사일은 1981-02-20 이다. 그리고 급여는 1600 이다.
SELECT *
FROM TBL_EMP;
SELECT ENAME || '''s 입사일은 ' || HIREDATE ||' 이다. 그리고 급여는 '|| SAL || ' 이다.'
FROM TBL_EMP;
--※ 문자열을 나타내는 홑따옴표 사이에서(시작과 끈)
--홑따옴표 두 개가 혼따옴표 하나(어퍼스트로피)를 의미한다.
--홑따옴표 ' 하나는 문자열의 시작을 나타내고
--홑따옴표 '' 두 개는 문자열 영역 안에서 어프스트로피를 나타내며
--다시 등장하는 홑따옴표 ' 하나가 문자열 영역의 종료를 의미하게 되는 것이다.
--==================================================================