본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] 3일차 ⓑ UPPER() LOWER() INITCAP() , TO_DATE() 날짜 형식 변환해서 크기 비교, BETWEEN A and B, ANY 연산자

SELECT *
FROM EMP
WHERE JOB = 'SALESMAN';



SELECT *
FROM EMP
WHERE JOB = 'salesman';
--==>> 위와 달리 조회결과 없음

--○ UPPER(), LOWER() , INITCAP()
    -------     -----------                
SELECT 'OraCLe' "1" , UPPER('OraCLe') "2", LOWER('OraCLe') "3" , INITCAP('OraCLe') "4"
FROM DUAL;

--==>>>>OraCLe   ORACLE  	oracle		Oracle

-- UPPER() 모두 대문자로 변환하여 반환
-- LOWER() 모두 소문자로 변환하여 반환
-- INITCAP() 첫 글자만 대문자로 하고 나머지느 모두 소문다로 변환하여 반환

--'SalEsmAn'으로 조회하는 방법
SELECT *
FROM EMP
WHERE JOB = UPPER('SalEsmAn');
/*
7499	ALLEN	SALESMAN	7698	1981-02-20	1600	    300	    30
7521    	WARD	SALESMAN	7698	1981-02-22	1250    	500	    30
7654	MARTIN	SALESMAN	7698	1981-09-28	1250    	1400	    30
7844	TURNER	SALESMAN	7698	1981-09-08	1500	    0	    30
*/

INSERT INTO TBL_EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8000, '징징이', 'salseMAN', 7698, SYSDATE, 2000, 200, 30);

INSERT INTO TBL_EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8001, '진주', 'salseMan', 7698, SYSDATE, 2000, 200, 30);

INSERT INTO TBL_EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8002, '뚱이', 'salseman', 7698, SYSDATE, 2000, 200, 30);

INSERT INTO TBL_EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8003, '다람이', 'SALESman', 7698, SYSDATE, 2000, 200, 30);

--==>>1 행 이(가) 삽입되었습니다. *4
SELECT *
FROM TBL_EMP;
/*
                :
7934	MILLER	CLERK	    7782    	1982-01-23	1300		10
8000    	징징이	salseMAN	    7698	2021-03-26	2000	200	30
8001	    진주  	salseMan	    7698	2021-03-26	2000	200	30
8002	    뚱이	    salseman	    7698	2021-03-26	2000	200	30
8003	    다람이	SALESman	    7698	2021-03-26	2000	200	30
*/
-- ○ 커밋
COMMIT;
--==>>커밋 완료.

DELETE
FROM TBL_EMP
WHERE UPPER(JOB)='SALSEMAN'; --세일즈맨인데  살세맨이라고 저장해놔서 세 개 삭제하고 다시 넣음

INSERT INTO TBL_EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8000, '징징이', 'salesMAN', 7698, SYSDATE, 2000, 200, 30);

INSERT INTO TBL_EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8001, '진주', 'salesMan', 7698, SYSDATE, 2000, 200, 30);

INSERT INTO TBL_EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8002, '뚱이', 'saleSman', 7698, SYSDATE, 2000, 200, 30);


COMMIT;
-- ○TBL_EMP 테이블에서 대소문자를 구분하지 않고
-- SALESMAN 직종인 사원의 사원번호, 사원명, 직종, 입사일, 부서번호 항목을 조회한다.

SELECT EMPNO "사원번호", ENAME "사원명", JOB "직 종", HIREDATE "입사일" , DEPTNO "부서번호"
FROM TBL_EMP
WHERE UPPER(JOB) = 'SALESMAN';

SELECT EMPNO "사원번호", ENAME "사원명", JOB "직 종", HIREDATE "입사일" , DEPTNO "부서번호"
FROM TBL_EMP
WHERE JOB IN ('SALESMAN','SALESman','salesMan','saleSman','salesMAN');



SELECT EMPNO "사원번호", ENAME "사원명", JOB "직 종", HIREDATE "입사일" , DEPTNO "부서번호"
FROM TBL_EMP
WHERE UPPER(JOB) = UPPER('salesman');

-- 또는 WHERE LOWER(JOB) = LOWER('salesman');


--○ TBL_EMP 테이블에서 입사일이 1981년 9월 28일 입사한 직원의
-- 사원명, 직종명, 입사일 항목을 조회한다.
SELECT ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE HIREDATE = '1981-09-28';
--==>> MARTIN	SALESMAN	1981-09-28
--엄밀히 얘기하면 틀린 쿼리문이다. DATE 타입과 문자타입을 비교했기 때문이다. 
-- 오라클에서는 믿을만한 형변환이 아니므로 명시적으로 형변환을 해줘야 한다.


DESC TBL_EMP;
--==>>HIREDATE    DATE     

--○ TO_DATE() 투데이트메소드 변환함수 대표적인 TODATE는 
SELECT '2021-03-26' "1", TO_DATE('2021-03-26','YYYY-MM-DD') "2"

FROM DUAL;

--===>> 2021-03-26	2021-03-26


--[선생님풀이]
SELECT ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE HIREDATE = TO_DATE('1981-09-28','YYYY-MM-DD');
--==>>MARTIN	SALESMAN	1981-09-28
-- ※ TO_DATE 함수는 자동으로 유효성 검사를 해준다.
SELECT TO_DATE('2021-02-30','YYYY-MM-DD')
FROM DUAL;
--==>> 오류남


-- TBL_EMP 테이블에서 입사일이 1981년 9월 28일 이후(해당일 포함)로
-- 입사한 직원의 사원명, 직종명, 입사일 항목을 조회한다.

SELECT ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE HIREDATE >= TO_DATE('1981-09-28','YYYY-MM-DD');

/*
MARTIN	SALESMAN	1981-09-28
SCOTT	ANALYST	1987-07-13
KING	PRESIDENT	1981-11-17
ADAMS	CLERK	1987-07-13
JAMES	CLERK	1981-12-03
FORD	ANALYST	1981-12-03
MILLER	CLERK	1982-01-23
다람이	SALESman	2021-03-26
징징이	salesMAN	2021-03-26
진주	salesMan	2021-03-26
뚱이	saleSman	2021-03-26
*/








--※ 오라클에서는 날짜 데이터의 크기 비교가 가능하다.
-- 날짜 데이터에 대한 크기 비교 시 과거보다 미래를 더 큰 값으로 간주하여 처리된다. 

--1. 날짜도 크기 비교 가능하다 
--○ TBL_EMP 테이블에서 입사일이 1981년 4월 2일 부터 1981년 9월 28일 사이에 입사한
-- 직원들의 사원번호, 사원명, 직종명, 입사일 항목을 조회한다. (해당일 포함)
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE TO_DATE('1981-04-02','YYYY-MM-DD')<= HIREDATE AND HIREDATE <=TO_DATE('1981-09-28','YYYY-MM-DD');
/*
7566	JONES	MANAGER	1981-04-02
7654	MARTIN	SALESMAN	1981-09-28
7698	BLAKE	MANAGER	1981-05-01
7782	CLARK	MANAGER	1981-06-09
7844	TURNER	SALESMAN	1981-09-08
*/




SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE '1981-04-02'<= HIREDATE AND HIREDATE <= '1981-09-28' ;
/*
7566	JONES	MANAGER	1981-04-02
7654	MARTIN	SALESMAN	1981-09-28
7698	BLAKE	MANAGER	1981-05-01
7782	    CLARK	MANAGER	1981-06-09
7844	TURNER	SALESMAN	1981-09-08
*/ -- 똑같이 나오기는 한다. TO_DATE() 사용안하더라도

--○ BETWEEN ⓐ AND ⓑ

SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE HIREDATE BETWEEN TO_DATE('1981-04-02','YYYY-MM-DD')
AND TO_DATE('1981-09-28','YYYY-MM-DD');



--○ BETWEEN ⓐ AND ⓑ → 숫자를 대상으로 적용

SELECT EMPNO, ENAME, SAL
FROM TBL_EMP
WHERE SAL BETWEEN 1600 AND 3000;
/*
7499	ALLEN	1600
7566	JONES	2975
7698	BLAKE	2850
7782	    CLARK	2450
7788	SCOTT	3000
7902	    FORD	3000
8003	    다람이	2000
8000	    징징이	2000
8001	    진주	    2000
8002	    뚱이  	2000*/





--○ BETWEEN ⓐ AND ⓑ → 문자를 대상으로 적용
SELECT EMPNO, ENAME, JOB
FROM TBL_EMP
WHERE ENAME BETWEEN 'C' AND 'S'; --★★이름이 S면 나온다. 


/*
7566	JONES	MANAGER
7654	MARTIN	SALESMAN
7782    	CLARK	MANAGER
7839	KING	PRESIDENT
7900	    JAMES	CLERK
7902    	FORD	ANALYST
7934	MILLER	CLERK*/

/*
만약 WHERE ENAME BETWEEN 'C' AND 's'라고 했을 때
'ZOO' 라는 사람의 이름은 검색이 될 것이다, ABCDE......abcde....
와 같이 아스키코드의 순서로 검색을 하기 때문이다. 

문자형일 경우 아스키코드 순서를 따르기 때문에 대문자가 앞쪽에 위치하고
소문자가 뒤쪽에 위치한다. 또한 BETWEEN A AND B 는 쿼리문이 수행되는 시점에서
오라클 내부적으로는 부등호 연산자의 형태로 바뀌어 연산이 처리된다. 
*/
DELETE
FROM TBL_EMP
WHERE EMPNO BETWEEN 8000 AND 8003;

COMMIT;

--4개 행 이(가) 삭제되었습니다.

--커밋 완료. 아까 징징이 , 진주, 다람이, 뚱이 데이터 삭제
-- ○ ASCII()

SELECT ASCII('A') "1" , ASCII('B') "2"
FROM DUAL;
--==>>65	66


--TBL_EMP 테이블에서 직종이 SALESMAN 과 CLERK 인 사원의
-- 사원번호, 사원명, 직종명, 급여 항목을 조회한다. 

--[선생님풀이]

SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL"급여"
FROM TBL_EMP
WHERE JOB ='SALESMAN' OR JOB = 'CLERK';



SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL"급여"
FROM TBL_EMP
WHERE JOB IN ('SALESMAN', 'CLERK');



SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL"급여"
FROM TBL_EMP
WHERE JOB = ANY ('SALESMAN', 'CLERK');  --『=ALL』 이거랑도 같고 저거랑도 같을 때

-- ※ 위의 3가지 유형의 쿼리문은 모두 같은 결과를 반환한다.
-- 하지만, 맨 위의 쿼리문이 가장 빠르게 처리된다. 

-- 물론, 메모리에 대한 내용이 아니라 CPU에 대한 내용이므로
-- 이 부분까지 감안하여 무머리문의 내용을 구분하여 구성하는 일은 많지 않다 
-- → 『IN』 과 =ANY 는 같은 연산자 효과를 가진다.
        -- 모두 내부적으로는 OR 구조로 변경되어 연산처리된다. 
        
        














SELECT *
FROM TBL_EMP;







SELECT TABLE_NAME, TABLESPACE_NAME
FROM USER_TABLES;
/*
DEPT	        USERS
EMP	            USERS
BONUS	        USERS
SALGRAD E	    USERS
TBL_EXAMPLE1    USERS
TBL_EXAMPLE2	TBS_EDUA
EMPCOPY2	    USERS
TBL_DEPT        USERS
TBL_EMP	        USERS
*/