[Oracle]/SQL (Program source)

[Oracle] 20231019 [프로그램소스] - 20231019_01_scott

Jelly-fish 2023. 10. 19. 17:49

 

 

20231019_01_scott.sql

 WHERE 조건

IS NOT NULL - NULL 이 아닌 지를 확인 할 때는 != 와 같은 연산자를 사용하지 않는다.

NVL(문자열, 문자열이 null일 경우 대체할 값)

NVL2(문자열, 문자열이 x 값일 경우, x일 때 대체할 값)

COALESCE(값1, 값2, 값3) - 값1부터 값3까지 맨 처음으로 발견한 null 이 아닌 값을 반환

문자열1 || 문자열 2 || 문자열3 || ... - 문자 결합 연산자 (문자열 개수 상관 없음)

UPPER(영문 문자열) - 문자열을 모두 대문자로 변환

LOWER(영문 문자열) - 문자열을 모두 소문자로 변환

문자열1 LIKE 문자열2 - 문자열1과 문자열2 가 같은지를 비교 가능. 와일드 카드를 사용할 수 있음

WILD CARD - 『 _ 』 : 한 자릿수 아무 글자, 『%』 : 글자 수 제한 없이 아무 글자

COMMIT (Transaction Control Language) : 트랜잭션 영구 저장

ROLLBACK (Transaction Control Language) : 커밋되지 않은 데이터를 롤백.

 

*단, DDL (Data Define Language) 인 CREATE, DROP, ALTER, TRUNCATE 명령어를 사용하면 자동 커밋(AUTO COMMIT)

SELECT USER
FROM DUAL;
--==>> SCOTT


--○ TBL_EMP 테이블에서 20번 부서에 근무하지 않는 직원들의
--     사원명, 직종명 부서번호 항목을 조회한다.


SELECT 사원명, 직종명, 부서번호
FROM TBL_EMP
WHERE 20번 부서에 근무하지 않는;


SELECT ENAME "사원명", JOB "직종명", DEPTNO "부서번호"
FROM TBL_EMP
WHERE 20번 부서에 근무하지 않는;


SELECT ENAME "사원명", JOB "직종명", DEPTNO "부서번호"
FROM TBL_EMP
WHERE 부서번호가 20이 아니다;


SELECT ENAME "사원명", JOB "직종명", DEPTNO "부서번호"
FROM TBL_EMP
WHERE DEPTNO가 20이 아니다;


SELECT ENAME, JOB, DEPTNO
FROM TBL_EMP
WHERE DEPTNO != 20;
--==>>
/*
ALLEN	SALESMAN	30
WARD	SALESMAN	30
MARTIN	SALESMAN	30
BLAKE	MANAGER	    30
CLARK	MANAGER	    10
KING	PRESIDENT	10
TURNER	SALESMAN	30
JAMES	CLERK	    30
MILLER	CLERK	    10
*/



SELECT ENAME, JOB, DEPTNO
FROM TBL_EMP
WHERE DEPTNO <> 20;
--==>>
/*
ALLEN	SALESMAN	30
WARD	SALESMAN	30
MARTIN	SALESMAN	30
BLAKE	MANAGER	    30
CLARK	MANAGER	    10
KING	PRESIDENT	10
TURNER	SALESMAN	30
JAMES	CLERK	    30
MILLER	CLERK	    10
*/


SELECT ENAME, JOB, DEPTNO
FROM TBL_EMP
WHERE DEPTNO ^= 20;
--==>>
/*
ALLEN	SALESMAN	30
WARD	SALESMAN	30
MARTIN	SALESMAN	30
BLAKE	MANAGER	    30
CLARK	MANAGER	    10
KING	PRESIDENT	10
TURNER	SALESMAN	30
JAMES	CLERK	    30
MILLER	CLERK	    10
*/



--○ TBL_EMP 테이블에서 커미션이 NULL 이 아닌 직원들의
--   사원명, 직종명, 급여, 커미션 항목을 조회한다.


SELECT ENAME, JOB, SAL, COMM
FROM TBL_EMP
WHERE COMM IS NOT NULL;
--==>>
/*
ALLEN	SALESMAN	1600	300
WARD	SALESMAN	1250	500
MARTIN	SALESMAN	1250	1400
TURNER	SALESMAN	1500	0
*/

SELECT 사원명, 직종명, 급여, 커미션
FROM TBL_EMP
WHERE 커미션이 NULL 이 아닌;


SELECT ENAME "사원명", JOB "직종명", SAL "급여", COMM "커미션"
FROM TBL_EMP
WHERE COMM이 NULL 이 아닌;


SELECT ENAME "사원명", JOB "직종명", SAL "급여", COMM "커미션"
FROM TBL_EMP
--WHERE COMM != NULL;
--WHERE COMM <> NULL;
WHERE COMM ^= NULL;
--==>> 조회 결과 없음


SELECT ENAME "사원명", JOB "직종명", SAL "급여", COMM "커미션"
FROM TBL_EMP
WHERE COMM IS NULL;     -- && AND      || OR       ! NOT


SELECT ENAME "사원명", JOB "직종명", SAL "급여", COMM "커미션"
FROM TBL_EMP
WHERE COMM IS NOT NULL;
--==>>
/*
ALLEN	SALESMAN	1600	 300
WARD	SALESMAN	1250	 500
MARTIN	SALESMAN	1250	1400
TURNER	SALESMAN	1500	   0
*/


SELECT ENAME "사원명", JOB "직종명", SAL "급여", COMM "커미션"
FROM TBL_EMP
WHERE NOT COMM IS NULL;
--==>>
/*
ALLEN	SALESMAN	1600	 300
WARD	SALESMAN	1250	 500
MARTIN	SALESMAN	1250	1400
TURNER	SALESMAN	1500	   0
*/


--○ TBL_EMP 테이블에서 모든 사원들의
--   사원번호, 사원명, 급여, 커미션, 연봉 항목을 조회한다.
--   단, 급여(SAL)는 매월 지급한다.
--   또한, 수당(COMM)은 연 1회 지급하며, 연봉 내역에 포함된다.



SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "커미션", (SAL * 12) + COMM "연봉"
FROM TBL_EMP;



-- NULL 처리와 관련된 함수
--○ NVL()

SELECT NULL "COL1", NVL(NULL, 10) "COL2", NVL(5, 10) "COL3"
FROM DUAL;
--==>> (null)   10      5
-- 첫 번째 파라미터 값이 NULL 이면, 두 번째 파라미터 값을 반환한다.
-- 첫 번째 파라미터 값이 NULL 이 아니면, 그 값을 그대로 반환한다.

SELECT ENAME "사원명", COMM "수당"
FROM TBL_EMP;


SELECT ENAME "사원명", NVL(COMM, 0) "수당"
FROM TBL_EMP;


SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", NVL(COMM, 0) "수당", SAL * 12 + NVL(COMM, 0) "연봉"
FROM TBL_EMP;
--==>>
/*
7369	SMITH	800	       0	     9600
7499	ALLEN	1600	 300	    19500
7521	WARD	1250	 500	    15500
7566	JONES	2975	   0	    35700
7654	MARTIN	1250	1400	    16400
7698	BLAKE	2850	   0	    34200
7782	CLARK	2450	   0	    29400
7788	SCOTT	3000	   0	    36000
7839	KING	5000	   0	    60000
7844	TURNER	1500	   0	    18000
7876	ADAMS	1100	   0	    13200
7900	JAMES	950	       0	    11400
7902	FORD	3000	   0	    36000
7934	MILLER	1300	   0	    15600
*/


-- CASE WHEN 연습
SELECT EMPNO "사원번호", SAL "급여", CASE WHEN (COMM IS NULL) THEN 0
                                     ELSE COMM
                                     END AS "수당"
                                     
FROM TBL_EMP;



-- A
SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "수당"
        , (SAL*12) + NVL(COMM, 0) "연봉"

FROM TBL_EMP;


-- B

SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "수당"
        , NVL(SAL * 12 + COMM, SAL * 12)"연봉"

FROM TBL_EMP;



--○ NVL2()
--> 첫 번째 파라미터 값이 NULL 이 아닌 경우, 두 번째 파라미터 값을 반환하고
--  첫 번째 파라미터 값이 NULL 인 경우, 세 번째 파라미터 값을 반환한다.


SELECT ENAME "사원명", NVL2(COMM, '청기올려', '백기올려') "수당 확인"
FROM TBL_EMP;



SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "수당"
        , SAL * 12 + NVL2(COMM, COMM, 0) "연봉"
FROM TBL_EMP;


-- A
SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "수당"
        , NVL2(COMM, SAL * 12 + COMM, SAL * 12) "연봉"
FROM TBL_EMP;



-- B
SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "수당"
        , SAL * 12 + NVL2(COMM, COMM, 0) "연봉"
FROM TBL_EMP;


--○ COALESCE()
--> 매개변수 제한이 없는 형태로 인지하고 활용한다.
-- 맨 앞에 있는 매개변수부터 차례로 NULL 인지 아닌지 확인하여
-- NULL이 아닐 경우 그 값을 반환하고,
-- NULL 인 경우에는 그 다음 매개변수의 값을 반환한다.
-- NVL() 이나 NVL2() 와 비교했을 때
-- 모 ~~~ 든 경우의 수를 고려할 수 있다는 특징을 갖는다.


SELECT NULL "COL1"
    , COALESCE(NULL, NULL, NULL, 40) "COL2"
    , COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100) "COL3"
    , COALESCE(NULL, NULL, NULL, 30, NULL, NULL, NULL, 60) "COL4"
    , COALESCE(10, NULL, NULL, NULL, NULL, 50) "COL5"
FROM DUAL;
--==>> 	(null)      40  	100 	30  	10


--○ 실습을 위한 데이터 추가 입력
 
INSERT INTO TBL_EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, DEPTNO)
VALUES(8000, '현우기', 'SALESMAN', 7369, SYSDATE, 10);
--==>> 1 행 이(가) 삽입되었습니다.


INSERT INTO TBL_EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, DEPTNO, COMM)
VALUES(8001, '다서니', 'SALESMAN', 7369, SYSDATE, 10, 10);
--==>> 1 행 이(가) 삽입되었습니다.


--○ 확인
SELECT *
FROM TBL_EMP;
--==>>
/*
                :
8000	현우기	SALESMAN	7369	2023-10-19	(null)  (null)		10
8001	다서니	SALESMAN	7369	2023-10-19	(null) 	    10	    10
*/

--○ 커밋
COMMIT;
--==>> 커밋 완료.


--○ TBL_EMP 테이블에서 모든 사원들의
--   사원번호, 사원명, 급여, 커미션, 연봉 항목을 조회한다.
--   단, 급여(SAL)는 매월 지급한다.
--   또한, 수당(COMM)은 연 1회 지급하며, 연봉 내역에 포함된다.


SELECT EMPNO "사원번호", ENAME "사원명", NVL(SAL, 0) "급여", NVL(COMM, 0) "수당"
        , NVL(SAL, 0) * 12 + NVL(COMM, 0) "연봉" 
FROM TBL_EMP;

SELECT EMPNO "사원번호", ENAME "사원명", NVL(SAL, 0) "급여", NVL(COMM, 0) "수당"
        , COALESCE(SAL * 12 + COMM, SAL * 12, COMM, 0) "연봉" 
FROM TBL_EMP;
--==>> 

/*
7369	SMITH	800	0	9600
7499	ALLEN	1600	300	19500
7521	WARD	1250	500	15500
7566	JONES	2975	0	35700
7654	MARTIN	1250	1400	16400
7698	BLAKE	2850	0	34200
7782	CLARK	2450	0	29400
7788	SCOTT	3000	0	36000
7839	KING	5000	0	60000
7844	TURNER	1500	0	18000
7876	ADAMS	1100	0	13200
7900	JAMES	950	0	11400
7902	FORD	3000	0	36000
7934	MILLER	1300	0	15600
8000	현우기	0	0	0
8001	다서니	0	10	10
*/

--※ 날짜에 대한 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH:MI:SS';
--==>> Session이(가) 변경되었습니다.


--○ 컬럼과 컬럼의 연결(결합)

SELECT 1, 2
FROM DUAL;



SELECT 1 + 2
FROM DUAL;


SELECT '혜성이', '수환이'
FROM DUAL;

SELECT '혜성이' + '수환이'
FROM DUAL;
--==>> 에러 발생
--      (ORA-01722: invalid number)


-- 컬럼과 컬럼의 결합
SELECT '혜성이' || '수환이'
FROM DUAL;
--==>> 혜성이수환이


SELECT ENAME, JOB
FROM TBL_EMP;


SELECT ENAME || JOB
FROM TBL_EMP;
--==>>
/*
SMITHCLERK
ALLENSALESMAN
WARDSALESMAN
JONESMANAGER
MARTINSALESMAN
BLAKEMANAGER
CLARKMANAGER
SCOTTANALYST
KINGPRESIDENT
TURNERSALESMAN
ADAMSCLERK
JAMESCLERK
FORDANALYST
MILLERCLERK
현우기SALESMAN
다서니SALESMAN
*/

SELECT '지민이는', SYSDATE, '에 연봉 ', 500, '억을 원한다.'
FROM DUAL;
--==>> 지민이는	2023-10-19 10:40:57	에 연봉 	500	    억을 원한다.
--     -------- ------------------- -------     ---     ------------
--     문자타입 날짜타입            문자타입  숫자타입    문자타입


--○ 현재 날짜 및 시간을 반환하는 함수
SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP
FROM DUAL;
--==>> 2023-10-19 10:42:56	2023-10-19 10:42:56	23/10/19 10:42:56.000000000


SELECT '지민이는' || SYSDATE || '에 연봉 ' || 500 || '억을 원한다.'
FROM DUAL;
--==>> 지민이는 2023-10-19 10:44:31에 연봉 500억을 원한다.

--※ 오라클에서는 문자 타입의 형태로 형(TYPE) 을 변환하는 별도의 과정 없이
--   『||』 만 삽입해 주면 간단히 컬럼과 컬럼(서로 다른 종류의 데이터)을
--   결합하는 것이 가능하다.
--    cf) MSSQL 에서는 모든 데이터를 문자열로 CONVERT 해야 한다.



--※ 날짜 관련 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--==>> Session이(가) 변경되었습니다.


--○ TBL_EMP 테이블의 데이터를 활용하여
--   다음과 같은 결과를 얻을 수 있도록 쿼리문을 구성한다.
--  『SMITH의 현재 연봉은 9600인데 희망 연봉은 19200이다.
--    ALLEN의 현재 연봉은 19500인데 희망 연봉은 39000이다.
--                     :
--                     :
--    다서니의 현재 연봉은 10인데 희망 연봉은 20이다.』
--   단, 레코드마다 위와 같은 내용이 한 컬럼에 모두 조회될 수 있도록 처리한다.
SELECT *
FROM TBL_EMP;


SELECT ENAME || '의 현재 연봉은 '
        || COALESCE(SAL * 12 + COMM, SAL * 12, COMM, 0)
        || '인데 희망 연봉은 '
        || COALESCE(SAL * 12 + COMM, SAL * 12, COMM, 0) * 2
        || '이다.'
FROM TBL_EMP;



SELECT ENAME || '의 현재 연봉은 '
        || COALESCE(SAL*12+COMM, SAL*12, COMM, 0)
        || '인데 희망 연봉은 '
        || (COALESCE(SAL*12+COMM, SAL*12, COMM, 0)) * 2
        || '이다.'
FROM TBL_EMP;
--==>>
/*
SMITH의 현재 연봉은 9600인데 희망 연봉은 19200이다.
ALLEN의 현재 연봉은 19500인데 희망 연봉은 39000이다.
WARD의 현재 연봉은 15500인데 희망 연봉은 31000이다.
JONES의 현재 연봉은 35700인데 희망 연봉은 71400이다.
MARTIN의 현재 연봉은 16400인데 희망 연봉은 32800이다.
BLAKE의 현재 연봉은 34200인데 희망 연봉은 68400이다.
CLARK의 현재 연봉은 29400인데 희망 연봉은 58800이다.
SCOTT의 현재 연봉은 36000인데 희망 연봉은 72000이다.
KING의 현재 연봉은 60000인데 희망 연봉은 120000이다.
TURNER의 현재 연봉은 18000인데 희망 연봉은 36000이다.
ADAMS의 현재 연봉은 13200인데 희망 연봉은 26400이다.
JAMES의 현재 연봉은 11400인데 희망 연봉은 22800이다.
FORD의 현재 연봉은 36000인데 희망 연봉은 72000이다.
MILLER의 현재 연봉은 15600인데 희망 연봉은 31200이다.
현우기의 현재 연봉은 0인데 희망 연봉은 0이다.
다서니의 현재 연봉은 10인데 희망 연봉은 20이다.
*/


--○ TBL_EMP 테이블의 데이터를 활용하여
--   다음과 같은 결과를 얻을 수 있도록 쿼리문을 구성한다.
--   『SMITH's 입사일은 1980-12-17이다. 그리고 급여는 800이다.
--     ALLEN's 입사일은 1981-02-20이다. 그리고 급여는 1600이다.
--                          :
--     다서니's 입사일은 2023-10-19이다. 그리고 급여는 0이다.』
--    단, 레코드마다 위와 같은 내용이 한 컬럼에 모두 조회될 수 있도록 처리한다.


SELECT *
FROM TBL_EMP;


SELECT ENAME    || '''s 입사일은 '  ||  HIREDATE     || '이다.'
                || '그리고 급여는 ' ||  NVL(SAL, 0)  || '이다.'
FROM TBL_EMP;

--※ 문자열을 나타내는 홑따옴표 사이에서(시작과 끝)
--   홑따옴표 두 개가 홑따옴표 하나(어퍼스트로피)를 의미한다.
--   즉, 홑따옴표 하나(『'』)는 문자열의 시작을 나타내고,  
--   홑따옴표 두 개(『''』)는 문자열 영역 안에서 어퍼스트로피를 나타내며
--   다시 마지막에 등장하는 홑따옴표 하나(『'』)는 문자열 영역의 종료를 의미하게 되는 것이다.

--==>>
/*
SMITH's 입사일은 1980-12-17이다.그리고 급여는 800이다.
ALLEN's 입사일은 1981-02-20이다.그리고 급여는 1600이다.
WARD's 입사일은 1981-02-22이다.그리고 급여는 1250이다.
JONES's 입사일은 1981-04-02이다.그리고 급여는 2975이다.
MARTIN's 입사일은 1981-09-28이다.그리고 급여는 1250이다.
BLAKE's 입사일은 1981-05-01이다.그리고 급여는 2850이다.
CLARK's 입사일은 1981-06-09이다.그리고 급여는 2450이다.
SCOTT's 입사일은 1987-07-13이다.그리고 급여는 3000이다.
KING's 입사일은 1981-11-17이다.그리고 급여는 5000이다.
TURNER's 입사일은 1981-09-08이다.그리고 급여는 1500이다.
ADAMS's 입사일은 1987-07-13이다.그리고 급여는 1100이다.
JAMES's 입사일은 1981-12-03이다.그리고 급여는 950이다.
FORD's 입사일은 1981-12-03이다.그리고 급여는 3000이다.
MILLER's 입사일은 1982-01-23이다.그리고 급여는 1300이다.
현우기's 입사일은 2023-10-19이다.그리고 급여는 0이다.
다서니's 입사일은 2023-10-19이다.그리고 급여는 0이다.
*/

SELECT *
FROM TBL_EMP
WHERE JOB = '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
8000	현우기	SALESMAN	7369	2023-10-19			        10
8001	다서니	SALESMAN	7369	2023-10-19		      10    10
*/



SELECT *
FROM TBL_EMP
WHERE JOB = 'salesman';
--==>> 조회 결과 없음

SELECT *
FROM TBL_EMP
WHERE JOB = 'SalEsman';
--==>> 조회 결과 없음


--○ UPPER(), LOWER(), INITCAP()

SELECT 'oRaCLe' "COL1"
    , UPPER('oRaCLe') "COL2"
    , LOWER('oRaCLe') "COL3"
    , INITCAP('oRaCLe') "COL4"
FROM DUAL;
--==>> oRaCLe	ORACLE	oracle	Oracle
-- UPPER() 는 모두 대문자로 변환
-- LOWER() 는 모두 소문자로 변환
-- INITCAP() 은 첫 글자만 대문자로 하고 나머지는 모두 소문자로 변환하여 반환


--※ 실습을 위한 추가 데이터 입력
INSERT INTO TBL_EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, DEPTNO, COMM)
VALUES(8002, '임하성', 'salesman', 7369, SYSDATE, 20, 100);
--==>> 1 행 이(가) 삽입되었습니다.




--○ 확인
SELECT *
FROM TBL_EMP;
--==>>
/*
7369	SMITH	CLERK	    7902	1980-12-17	 800		  20
7499	ALLEN	SALESMAN	7698	1981-02-20	1600	     300	    30
7521	WARD	SALESMAN	7698	1981-02-22	1250	     500	    30
7566	JONES	MANAGER	    7839	1981-04-02	2975		  20
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	    1400	    30
7698	BLAKE	MANAGER	    7839	1981-05-01	2850		  30
7782	CLARK	MANAGER	    7839	1981-06-09	2450		  10
7788	SCOTT	ANALYST	    7566	1987-07-13	3000		  20
7839	KING	PRESIDENT		    1981-11-17	5000		  10
7844	TURNER	SALESMAN	7698	1981-09-08	1500	       0	    30
7876	ADAMS	CLERK	    7788	1987-07-13	1100		  20
7900	JAMES	CLERK	    7698	1981-12-03	950		      30
7902	FORD	ANALYST	    7566	1981-12-03	3000		  20
7934	MILLER	CLERK	    7782	1982-01-23	1300		  10
8000	현우기	SALESMAN	7369	2023-10-19			      10
8001	다서니	SALESMAN	7369	2023-10-19		          10	    10
8002	임하성	salesman	    7369	2023-10-19		         100	    20
*/


--○ 커밋
COMMIT;
--==>> 커밋 완료.



--○ TBL_EMP 테이블을 대상으로 영업사원(세일즈맨)의
--   사원번호, 사원명, 직종명을 조회한다.
--   또한, 검색값이 'sALesmaAn' 인 조건으로 검색을 수행하더라도
--   해당 사원들을 조회할 수 있도록 쿼리문을 구성한다.



SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명"
FROM TBL_EMP
WHERE UPPER(JOB) = UPPER('sALeSmAN');
-- 1차적으로 모든 JOB COLUMN 항목의 값들을 대문자로 변경한다.
-- 그 후에, 입력된 값 'sALeSmAN'을 대문자로 변환하여 서로 비교한다.


SELECT *
FROM TBL_EMP;
-- 실행 결과, salesman 항목 또한 대문자로 영구적으로 변하지 않았음을 알 수 있다.
-- 검색할 때만 대문자로 변경해서 비교한 것.


SELECT 사원번호, 사원명, 직종명
FROM TBL_EMP
WHERE 직종이 'sALeSmAN';

SELECT EMPNO, ENAME, JOB
FROM TBL_EMP
WHERE 직종이 'sALeSmAN';

SELECT EMPNO, ENAME, JOB
FROM TBL_EMP
WHERE JOB = 'sALeSmAN';
--==>> 조회 결과 없음


SELECT EMPNO, ENAME, JOB
FROM TBL_EMP
WHERE JOB = UPPER('sALeSmAN');
--SELECT EMPNO, ENAME, JOB
--FROM TBL_EMP
--WHERE JOB = 'SALESMAN';
--==>> 
/*
7499	ALLEN	SALESMAN
7521	WARD	SALESMAN
7654	MARTIN	SALESMAN
7844	TURNER	SALESMAN
8000	현우기	SALESMAN
8001	다서니	SALESMAN
*/

SELECT EMPNO, ENAME, JOB
FROM TBL_EMP
WHERE JOB = LOWER('sALeSmAN');
--==>> 
/*
8002	임하성	salesman
*/

SELECT EMPNO, ENAME, JOB
FROM TBL_EMP
WHERE JOB = UPPER('sALeSmAN')
   OR JOB = LOWER('sALeSmAN');
--==>>
/*
7499	ALLEN	SALESMAN
7521	WARD	SALESMAN
7654	MARTIN	SALESMAN
7844	TURNER	SALESMAN
8000	현우기	SALESMAN
8001	다서니	SALESMAN
8002	임하성	salesman
*/


SELECT EMPNO, ENAME, JOB
FROM TBL_EMP
WHERE UPPER(JOB) = UPPER('sALeSmAN');
--==>>
/*
[찾을 때, JOB을 모두 대문자로 변환한 후에 검색했기 때문에]
[모든 항목들이 제대로 나온 것을 확인할 수 있다]
7499	ALLEN	SALESMAN
7521	WARD	SALESMAN
7654	MARTIN	SALESMAN
7844	TURNER	SALESMAN
8000	현우기	SALESMAN
8001	다서니	SALESMAN
8002	임하성	salesman
*/


SELECT EMPNO, ENAME, JOB
FROM TBL_EMP
WHERE LOWER(JOB) = LOWER('sALeSmAN');

--==>>
/*
[양쪽의 변환 타입이 모두 동일할 경우, 무조건 제대로 나온다.]
7499	ALLEN	SALESMAN
7521	WARD	SALESMAN
7654	MARTIN	SALESMAN
7844	TURNER	SALESMAN
8000	현우기	SALESMAN
8001	다서니	SALESMAN
8002	임하성	salesman
*/


SELECT EMPNO, ENAME, JOB
FROM TBL_EMP
WHERE INITCAP(JOB) = INITCAP('sALeSmAN');
--==>>
/*
[검색 키워드 = 찾으려는 문자열을 동일한 타입으로 변경해 주기만 하면]
[한 줄만으로도 대소문자 상관 없이 검색이 가능하다.]
7499	ALLEN	SALESMAN
7521	WARD	SALESMAN
7654	MARTIN	SALESMAN
7844	TURNER	SALESMAN
8000	현우기	SALESMAN
8001	다서니	SALESMAN
8002	임하성	salesman
*/



--○ TBL_EMP 테이블에서 입사일이 1981년 9월 28일 입사한 직원의
--   사원명, 직종명, 입사일 항목을 조회한다.




SELECT ENAME, JOB, HIREDATE
FROM TBL_EMP
WHERE HIREDATE = to_date('28-9-1981','dd-mm-yyyy');
--WHERE HIREDATE = '1981-09-28';


SELECT 사원명, 직종명, 입사일 
FROM TBL_EMP
WHERE 입사일이 1981년 9월 28일;


SELECT ENAME, JOB, HIREDATE 
FROM TBL_EMP
WHERE 입사일이 1981년 9월 28일;


SELECT ENAME, JOB, HIREDATE 
FROM TBL_EMP
WHERE HIREDATE = 1981년 9월 28일;



SELECT ENAME, JOB, HIREDATE 
FROM TBL_EMP
WHERE HIREDATE = '1981-09-28';
--==>> MARTIN	SALESMAN	1981-09-28
-- HIREDATE는 날짜타입이므로, 문자타입에 해당하는 데이터를 찾으라는 명령을
-- 하고 있는 것이므로, 잘못된 전달이라고 볼 수 있다.
-- 오라클이 문자 타입을 날짜 타입으로 자동으로 형변환 시켜주기 때문에 가능한 것이다.
-- 자바는 자동형변환 규칙이 있었다. (작은 데이터 타입 → 큰 데이터 타입)
-- 오라클은 자동으로 종종 형변환을 해 주긴 하지만,
-- 데이터베이스를 운용하는 과정에서 절대로 형변환을 믿어서는 안 된다.


DESC TBL_EMP;
-- 꼭 데이터 타입을 일치 시켜서 처리해 주어야 한다.


-- 날짜 타입으로 변환해 주는 메소드이다.
--○ TO_DATE()

SELECT ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE HIREDATE = TO_DATE('1981-09-28', 'YYYY-MM-DD');
--                        ----------
--              ① 산술 연산을 수행하는 숫자 타입이 된다.
--                      --------------
--                       ② 문자 타입(')
--              -------------------------------------
--                ③ TO_DATE() 메소드를 통해 날짜 타입

--==>> MARTIN	SALESMAN	1981-09-28



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


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


SELECT 사원명, 직종명, 입사일 
FROM TBL_EMP
WHERE 입사일이 1981년 9월 28일 이후;


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


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	2023-10-19
다서니	SALESMAN	2023-10-19
임하성	salesman	    2023-10-19
*/


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


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

-- 3항 연산 불가능.
-- 무조건 자바처럼 2항, 2항으로 끊어서 연산한다.

SELECT 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');



SELECT 사원명, 직종명, 입사일
FROM TBL_EMP
WHERE 입사일이 1981년 4월 2일 부터 1981년 9월 28일 사이;



SELECT ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE 1981년 4월 2일 <= 입사일 <= 1981년 9월 28일;



SELECT ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE 입사일 >= 1981년 4월 2일
      입사일 <= 1981년 9월 28일;


SELECT ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE 입사일 >= 1981년 4월 2일
      AND
      입사일 <= 1981년 9월 28일;



SELECT ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE HIREDATE >= TO_DATE('1981-04-02', 'YYYY-MM-DD')
      AND
      HIREDATE <= TO_DATE('1981-09-28', 'YYYY-MM-DD');
--==>>
/*
JONES	MANAGER	    1981-04-02
MARTIN	SALESMAN	1981-09-28
BLAKE	MANAGER	    1981-05-01
CLARK	MANAGER	    1981-06-09
TURNER	SALESMAN	1981-09-08
*/


--○ BETWEEN ⓐ AND ⓑ 

SELECT 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');

--==>> 
/*
JONES	MANAGER	    1981-04-02
MARTIN	SALESMAN	1981-09-28
BLAKE	MANAGER	    1981-05-01
CLARK	MANAGER	    1981-06-09
TURNER	SALESMAN	1981-09-08
*/



--○ TBL_EMP 테이블에서 급여(SAL)가 2450 에서 3000 까지의 직원들을 모두 조회한다.


SELECT *
FROM TBL_EMP
WHERE SAL BETWEEN 2450
              AND 3000;
--==>>
/*
7566	JONES	MANAGER	7839	1981-04-02	2975		20
7698	BLAKE	MANAGER	7839	1981-05-01	2850		30
7782	CLARK	MANAGER	7839	1981-06-09	2450		10
7788	SCOTT	ANALYST	7566	1987-07-13	3000		20
7902	FORD	ANALYST	7566	1981-12-03	3000		20
*/

SELECT *
FROM TBL_EMP
WHERE SAL BETWEEN 2450 AND 3000;


--○ TBL_EMP 테이블에서 직원들의 이름이
--   'C'로 시작하는 이름부터 'S'로 시작하는 이름인 경우
--   모든 항목을 조회한다.


SELECT *
FROM TBL_EMP
WHERE ENAME BETWEEN 'C' AND 'S';
--==>>
/*
7566	JONES	MANAGER	    7839	1981-04-02	2975		20
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	  1400	    30
7782	CLARK	MANAGER	    7839	1981-06-09	2450		10
7839	KING	PRESIDENT		    1981-11-17	5000		10
7900	JAMES	CLERK	    7698	1981-12-03	950		    30
7902	FORD	ANALYST 	7566	1981-12-03	3000		20
7934	MILLER	CLERK	    7782	1982-01-23	1300		10
*/

-- 문자를 BETWEEN을 쓰게되면...
-- 사전식 배열을 기반으로 찾기 때문에.... 
-- S 뒤에 다른 이름 알파벳들이 더해지므로 나오지 않는 것.
-- S 한 글자인 이름인 사람이 있었다면 그 이름은 나왔을 것이다.

-- ★ ★ 그런데... 소문자 s를 하게 되면 s로 시작하는 이름들이 모두 나온다!
-- 알파벳 대문자보다 더 뒤에 있는 것이 소문자 s이기 때문에.
SELECT *
FROM TBL_EMP
WHERE ENAME BETWEEN 'C' AND 's';    -- 사전식 배열 기준
--==>>
/*
7369	SMITH	CLERK	    7902	1980-12-17	800		20
7521	WARD	SALESMAN	7698	1981-02-22	1250	    500	30
7566	JONES	MANAGER	    7839	1981-04-02	2975		    20
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	1   400	30
7782	CLARK	MANAGER	    7839	1981-06-09	2450		10
7788	SCOTT	ANALYST	    7566	1987-07-13	3000		20
7839	KING	PRESIDENT		    1981-11-17	5000		10
7844	TURNER	SALESMAN	7698	1981-09-08	1500	0	30
7900	JAMES	CLERK	    7698	1981-12-03	950		30
7902	FORD	ANALYST 	7566	1981-12-03	3000		20
7934	MILLER	CLERK	    7782	1982-01-23	1300		10
*/
-- 문자타입을 BETWEEN으로 처리할 때는, 끝 값을 알파벳 소문자로 처리하도록 하자.

--※ 『BETWWEN ⓐ AND ⓑ』 는 날짜형, 숫자형, 문자형 데이터 모두에 적용된다.
--   단, 문자형일 경우 아스키코드 순서를 따르기 때문에(사전식 배열)
--   대문자가 앞쪽에 위치하고, 소문자가 뒤쪽에 위치한다.
--   또한, 『BETWEEN ⓐ AND ⓑ』는 해당 구문이 수행되는 시점에서
--   오라클 내부적으로는 부등호 연산자의 형태로 바뀌어 연산 처리된다.

-- 날짜들끼리 비교할 떄 부등호로 비교했었다...
-- 결과적으로 BETWEEN도 오라클 내부적으로 부등호의 형식으로 변경되는 것이다.


--○ ASCII()
--   매개변수로 넘겨받은 해당 문자의 아스키 코드 값을 반환한다.

SELECT ASCII('A') "COL1"
     , ASCII('B') "COL2"
     , ASCII('a') "COL3"
     , ASCII('b') "COL4"
FROM DUAL;
--==>> 65	66	 97	  98

SELECT ENAME, JOB, SAL
FROM TBL_EMP
WHERE JOB = 'SALESMAN'
   OR JOB = 'CLERK';
--==>>
/*
SMITH	CLERK	800
ALLEN	SALESMAN	1600
WARD	SALESMAN	1250
MARTIN	SALESMAN	1250
TURNER	SALESMAN	1500
ADAMS	CLERK	1100
JAMES	CLERK	950
MILLER	CLERK	1300
현우기	SALESMAN	
다서니	SALESMAN	
*/


SELECT ENAME, JOB, SAL
FROM TBL_EMP
WHERE JOB IN ('SALESMAN', 'CLERK');

-- [IN] -> [= ANY] : 아무거나와 같은 것을 의미 ('SALESMAN', 'CLERK') 중 아무거나.

SELECT ENAME, JOB, SAL
FROM TBL_EMP
WHERE JOB = ANY ('SALESMAN', 'CLERK');


--※ 위의 3가지 유형의 쿼리문은 모두 같은 결과를 반환한다.
--   하지만, 맨 위의 쿼리문(OR)이 가장 빠르게 처리된다. (정말 얼마 안되지만...)
--   물론 메모리에 대한 내용이 아니라 CPU 에 대한 내용이므로
--   이 부분까지 감안하여 쿼리문을 구성하게 되는 경우는 많지 않다.
--   → 『IN』 과 『=ANY』는 위 상황에서 모두 같은 연산자 효과를 가진다.
--   이들 모두는 내부적으로 『OR』구조로 변경되어 연산 처리된다.


--------------------------------------------------------------------------------




--○ 추가 실습 테이블 구성(TBL_SAWON)
CREATE TABLE TBL_SAWON
( SANO      NUMBER(4)
, SANAME    VARCHAR2(30)
, JUBUN     CHAR(13)
, HIREDATE  DATE        DEFAULT SYSDATE
, SAL       NUMBER(10)
);
--==>> Table TBL_SAWON이(가) 생성되었습니다.


SELECT *
FROM TBL_SAWON;
--==>> 조회 결과 없음

DESC TBL_SAWON;
--==>>
/*
이름       널? 유형           
-------- -- ------------ 
SANO        NUMBER(4)    
SANAME      VARCHAR2(30) 
JUBUN       CHAR(13)     
HIREDATE    DATE         
SAL         NUMBER(10)   
*/




--○ 생성된 테이블에 데이터 입력(TBL_SAWON)
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1001, '강혜성', '9710171234567', TO_DATE('2005-01-03', 'YYYY-MM-DD'), 3000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1002, '박가영', '9511182234567', TO_DATE('1999-11-23', 'YYYY-MM-DD'), 4000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1003, '박나영', '9902082234567', TO_DATE('2006-08-10', 'YYYY-MM-DD'), 4000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1004, '최혜인', '9708112234567', TO_DATE('2010-05-06', 'YYYY-MM-DD'), 5000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1005, '아이유', '0502034234567', TO_DATE('2015-10-19', 'YYYY-MM-DD'), 1000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1006, '이하이', '0609304234567', TO_DATE('2012-06-17', 'YYYY-MM-DD'), 1000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1007, '인순이', '6510102234567', TO_DATE('1999-08-22', 'YYYY-MM-DD'), 2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1008, '선동열', '6909101234567', TO_DATE('1998-01-10', 'YYYY-MM-DD'), 2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1009, '이이경', '0505053234567', TO_DATE('2011-05-06', 'YYYY-MM-DD'), 1500);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1010, '선우용녀', '6611112234567', TO_DATE('2000-01-16', 'YYYY-MM-DD'), 1300);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1011, '이윤수', '9501061234567', TO_DATE('2009-09-19', 'YYYY-MM-DD'), 4000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1012, '선우선', '0606064234567', TO_DATE('2011-11-11', 'YYYY-MM-DD'), 2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1013, '남진', '6511111234567', TO_DATE('1999-11-11', 'YYYY-MM-DD'), 2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1014, '이주형', '9904171234567', TO_DATE('2009-11-11', 'YYYY-MM-DD'), 2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1015, '남궁민', '0202023234567', TO_DATE('2010-10-10', 'YYYY-MM-DD'), 2300);
--==>> 1 행 이(가) 삽입되었습니다. * 15


--○ 확인
SELECT *
FROM TBL_SAWON;
--==>>
/*
1001	강혜성	9710171234567	2005-01-03	3000
1002	박가영	9511182234567	1999-11-23	4000
1003	박나영	9902082234567	2006-08-10	4000
1004	최혜인	9708112234567	2010-05-06	5000
1005	아이유	0502034234567	2015-10-19	1000
1006	이하이	0609304234567	2012-06-17	1000
1007	인순이	6510102234567	1999-08-22	2000
1008	선동열	6909101234567	1998-01-10	2000
1009	이이경	0505053234567	2011-05-06	1500
1010	선우용녀	6611112234567	2000-01-16	1300
1011	이윤수	9501061234567	2009-09-19	4000
1012	선우선	0606064234567	2011-11-11	2000
1013	남진	6511111234567	1999-11-11	2000
1014	이주형	9904171234567	2009-11-11	2000
1015	남궁민	0202023234567	2010-10-10	2300
*/


--○ 커밋
COMMIT;
--==>> 커밋 완료.


--○ TBL_SAWON 테이블에서 '이주형' 사원의 데이터를 조회한다.
SELECT *
FROM TBL_SAWON
WHERE SANAME = '이주형';
--==>> 1014	이주형	9904171234567	2009-11-11	2000


-- 문자열을 비교할 때, EQUAL도 되고 LIKE도 가능하다.
SELECT *
FROM TBL_SAWON
WHERE SANAME LIKE '이주형';
--==>> 1014	이주형	9904171234567	2009-11-11	2000

--※ LIKE : 동사 → 좋아하다
--          부사 → ~와 같이, ~처럼

-- LIKE를 쓰면 와일드 캐릭터를 쓸 수 있는 장점이 있다. 
-- (아무데나 끼워 넣을 수 있는 카드를 와일드 카드라고 한다.)

--※ WILD CARD(CHARACTER) → 『%』
--   『LIKE』 와 함께 사용되는 『%』는 모든 글자를 의미하고
--   『LIKE』 와 함께 사용되는 『_』는 아무 글자 한 개를 의미한다.

--○ TBL_SAWON 테이블에서 성씨가 『강』씨인 사원의
--   사원명, 주민번호, 급여 항목을 조회한다.


SELECT 사원명, 주민번호, 급여
FROM TBL_SAWON
WHERE 성씨가 '강';

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE 성씨가 '강';

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME = '강';
--==>> 조회 결과 없음

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME = '강__';
--==>> 조회 결과 없음

-- LIKE와 함께 쓰인 _(언더바)가 아무 글자 한 글자를 의미하게 되므로
-- 강__을 찾게 된다. -> 혜성님이 나온다!
-- 강_ 언더바가 하나이면, 강풀... 처럼 이름이 한 글자인 사람을 찾게 된다.
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '강__';
--==>> 강혜성	9710171234567	3000


-- %를 쓰게 되면, 글자 수와 글자 종류에 상관없이 찾는다!
-- 즉, 이름이 한 글자인 사람도, 두 글자인 사람도, 세 글자인 사람도
-- 성씨가 강씨인 사람 모두가 출력이된다.
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '강%';
--==>> 강혜성	9710171234567	3000


--○ TBL_SAWON 테이블에서 성씨가 『이』씨인 사원의
--   사원명, 주민번호, 급여 항목을 조회한다.



SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이%';
--==>>
/*
이하이	0609304234567	1000
이이경	0505053234567	1500
이윤수	9501061234567	4000
이주형	9904171234567	2000
*/


SELECT 사원명, 주민번호, 급여
FROM TBL_SAWON
WHERE 성씨가 '이';

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME = '이';

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이__';

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이%';
--==>>
/*
이하이	0609304234567	1000
이이경	0505053234567	1500
이윤수	9501061234567	4000
이주형	9904171234567	2000
*/

--○ TBL_SAWON 테이블에서 사원의 이름이 『영』으로 끝나는 사원의
--   사원명, 주민번호, 급여 항목을 조회한다.

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%영';
--==>>
/*
박가영	9511182234567	4000
박나영	9902082234567	4000
*/


SELECT 사원명, 주민번호, 급여
FROM TBL_SAWON
WHERE 사원의 이름이 '영'으로 끝나는 사원;

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME이 이름이 '영'으로 끝나는 사원;

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '__영';

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%영';

--○ TBL_SAWON 테이블에서 사원의 이름에 '이'라는 글자가
--   하나라도 포함되어 있다면 그 사원의
--   사원번호, 사원명, 급여 항목을 조회한다.

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE   SANAME LIKE '%이%';

SELECT 사원번호, 사원명, 급여
FROM TBL_SAWON
WHERE 사원의 이름에 '이'라는 글자가 하나라도 포함;

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이%';
--==>>
/*
1005	아이유	1000
1006	이하이	1000
1007	인순이	2000
1009	이이경	1500
1011	이윤수	4000
1014	이주형	2000
*/



--○ TBL_SAWON 테이블에서 사원의 이름에 '이'라는 글자가
--   두 번 들어있는 사원의 사원번호, 사원명, 급여 항목을 조회한다.

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이%이%';

SELECT 사워번호, 사원명, 급여
FROM TBL_SAWON
WHERE 사원의 이름에 '이'라는 글자가 두 번 포함;

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME 에 '이'라는 글자가 두 번 포함;

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이%이%';
--==>>
/*
1006	이하이	1000
1009	이이경	1500
*/


--○ TBL_SAWON 테이블에서 사원의 이름에 '이'라는 글자가
--   연속으로 두 번 들어있는 사원의
--   사원번호, 사원명, 급여 항목을 조회한다.

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이이%';
--==>> 1009	이이경	1500


--○ TBL_SAWON 테이블에서 사원의 이름이 두 번째 글자가 '혜'인 사원의
--   사원번호, 사원명, 급여 항목을 조회한다.

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '_혜%';
--==>>
/*
1001	강혜성	3000
1004	최혜인	5000
*/


SELECT 사원번호, 사원명, 급여
FROM TBL_SAWON
WHERE 이름의 두 번째 글자가 '혜';

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME의 두 번째 글자가 '혜';


SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%혜%'; -- NG!! 맨 앞 글자가 혜여도 선택된다.


SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '_혜%'; -- 두 번째 글자만 '혜'이도록 처리한 것!!
--==>>
/*
1001	강혜성	3000
1004	최혜인	5000
*/


--○ TBL_SAWON 테이블에서 성씨가 '선'씨인 사원의
--   사원번호, 사원명, 주민번호, 급여 항목을 조회한다.

-- 성과, 이름을 입력받는 컬럼을 하나로 한다면, 누가 선우씨이고 선씨인지
-- 알 수가 없으므로 ... 성과 이름을 분리해서 작업해야 할 일이 생길 것 같은 상황이면
-- 성과 이름 컬럼을 분리해서 입력받도록 하자.
SELECT SANO, SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '선%';



--※ 데이터베이스 설계 과정에서
--   성과 이름을 분리하여 처리할 업무 계획이 있다면
--   (지금 당장은 아니더라도..)
--   테이블에서 성 컬럼과 이름 컬럼을 분리하여 구성해야 한다.


--○ TBL_SAWON 테이블에서 여직원들의
--   사원명, 주민번호, 급여 항목을 조회한다.


SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE JUBUN LIKE '______2%' OR
      JUBUN LIKE '______4%';
--==>> 
/*
박가영	9511182234567	4000
박나영	9902082234567	4000
최혜인	9708112234567	5000
아이유	0502034234567	1000
이하이	0609304234567	1000
인순이	6510102234567	2000
선우용녀	6611112234567	1300
선우선	0606064234567	2000
*/

DESC TBL_SAWON;
--==>>
/*
이름       널? 유형           
-------- -- ------------ 
SANO        NUMBER(4)    
SANAME      VARCHAR2(30) 
JUBUN       CHAR(13)     
HIREDATE    DATE         
SAL         NUMBER(10)   
*/


SELECT 사원명, 주민번호, 급여
FROM TBL_SAWON
WHERE 성별이 여성;

SELECT SANAME "사원명", JUBUN "주민번호", SAL "급여"
FROM TBL_SAWON
WHERE 주민번호 7번째 자리 1개가 2
      주민번호 7번째 자리 1개가 4;


SELECT SANAME "사원명", JUBUN "주민번호", SAL "급여"
FROM TBL_SAWON
WHERE 주민번호 7번째 자리 1개가 2
   OR 주민번호 7번째 자리 1개가 4;

SELECT SANAME "사원명", JUBUN "주민번호", SAL "급여"
FROM TBL_SAWON
WHERE JUBUN 7번째 자리 1개가 2
   OR JUBUN 7번째 자리 1개가 4;


SELECT SANAME "사원명", JUBUN "주민번호", SAL "급여"
FROM TBL_SAWON
WHERE JUBUN LIKE '______2'
   OR JUBUN LIKE '______4'; -- 이렇게 하면 주민번호가 7자리로 끝나는 항목을 찾기 때문에 Ⅹ!
   
   
SELECT SANAME "사원명", JUBUN "주민번호", SAL "급여"
FROM TBL_SAWON
WHERE JUBUN LIKE IN ('______2______', '______4______');
    -- 이렇게 작성해야만, 주민번호가 총 13자리임을 확인하는 구조이므로
                                   -- 이 방식으로 처리하는 것이 더 확실하다!
                                   -- ______2% 이런 형식으로 하면, 7번째 숫자만 확인하고 나서 그 뒤의 값을 생각하지 않는다는 것.
--==>>
/*
박가영	9511182234567	4000
박나영	9902082234567	4000
최혜인	9708112234567	5000
아이유	0502034234567	1000
이하이	0609304234567	1000
인순이	6510102234567	2000
선우용녀	6611112234567	1300
선우선	0606064234567	2000
*/



--○ 실습 테이블 생성(TBL_WATCH)
CREATE TABLE TBL_WATCH
( WATCH_NAME    VARCHAR2(20)
, BIGO          VARCHAR2(100)
);
--==>> Table TBL_WATCH이(가) 생성되었습니다.


--○ 데이터 입력
INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
VALUES('금시계', '순금 99.99% 함유된 최고급 시계');

INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
VALUES('은시계', '고객만족도 99.99점을 획득한 최고의 시계');

--==>> 1 행 이(가) 삽입되었습니다. * 2

--○ 확인

SELECT *
FROM TBL_WATCH;

--○ 커밋
COMMIT;
--==>> 커밋 완료.


--○ TBL_WATCH 테이블의 BIGO(비고) 컬럼에
--   『99.99%』라는 글자가 포함된(들어있는) 행(레코드)의
--   데이터를 조회한다.

SELECT *
FROM TBL_WATCH
WHERE 비고 컬럼에 '99.99%' 라는 글자 포함;


SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99%%';
--==>>
/*
금시계	순금 99.99% 함유된 최고급 시계
은시계	고객만족도 99.99점을 획득한 최고의 시계
*/

SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99%';
--==>>
/*
[%가 계속 와일드 카드로 인식되는 오류]
금시계	순금 99.99% 함유된 최고급 시계
은시계	고객만족도 99.99점을 획득한 최고의 시계
*/


-- ESCAPE
SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99\%%' ESCAPE '\';
--==>> 금시계	순금 99.99% 함유된 최고급 시계



SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99$%%' ESCAPE '$';
--==>> 금시계	순금 99.99% 함유된 최고급 시계


SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99@%%' ESCAPE '@';
--==>> 금시계	순금 99.99% 함유된 최고급 시계

--※ ESCAPE 로 정한 문자의 다음 한 글자를 와일드 카드에서 탈출시켜라...
--   일반적으로 사용 빈도가 낮은 특수문자(특수기호)를 사용한다.


--------------------------------------------------------------------------------


--■■■ COMMIT / ROLLBACK ■■■--

SELECT *
FROM TBL_DEPT;
--==>>
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
*/


-- 메모리상에 저장된 상태, 하드디스크에는 저장되어 있지 않다.
-- 저장하지 않고 닫아버리면 기록이 날라간다.
-- 테이블에 데이터를 입력하는 구문을 입력했다 하더라도
-- 50번 부서 변수는 실제 하드디스크 상에 기록되어 있는 것이 아니라
-- 메모리 상에 저장된 상태일 뿐이다.
--○ 데이터 입력
INSERT INTO TBL_DEPT VALUES(50, '개발부', '서울');
--==>> 1 행 이(가) 삽입되었습니다.



SELECT *
FROM TBL_DEPT;
--==>>
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	개발부	서울
*/


-- 50번 개발부 서울...
-- 이 데이터는 TBL_DEPT 테이블이 저장되어 있는
-- 하드디스크상에 물리적으로 적용되어 저장된 것이 아니다.
-- 메모리(RAM) 상에 입력된 것이다.


-- 실제 메모리 상에 임시로 올라가 있는 것을 없앤다는 의미로 ROLLBACK을 하는 것이다.
--○ 롤백
ROLLBACK;
--==>> 롤백 완료.



-- 메모리에 있던 50번 개발부 서울 데이터가 사라졌음을 확인할 수 있다.
-- 메모리 상태에 있던 것을 하드디스크에 저장하지 않고 ROLLBACK해버렸기 때문.
--○ 다시 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
*/
--> 50번 개발부 서울...에 대한 데이터가 소실되었음을 확인(존재하지 않음)



--○ 다시 데이터 입력
INSERT INTO TBL_DEPT VALUES(50, '개발부', '서울');
--==>> 1 행 이(가) 삽입되었습니다.


--○ 다시 확인
SELECT *
FROM TBL_DEPT;
--==>>
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/

-- 50번 개발부 서울...
-- 이 데이터는 TBL_DEPT 테이블이 저장되어 있는 하드디스크상에 저장된 것이 아니라
-- 메모리(RAM) 상에 입력된 것이다.
-- 이를... 실제 하드디스크상에 물리적으로 저장된 상황을 확정하기 위해서는
-- COMMIT 을 수행해야 한다.

--○ 커밋
COMMIT;
--==>> 커밋 완료.


--○ 커밋 이후 다시 확인

SELECT *
FROM TBL_DEPT;
--==>>
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/
-- COMMIT 하기 이전에 보여주는 내용은
-- 하드디스크 상의 데이터와, 메모리에 있는 데이터를 동시에 보여주는 것이고
-- COMMIT 후에는 하드 디스크상의 확정된 데이터들만 보여주는 것.

--○ 롤백
ROLLBACK;
--==>> 롤백 완료.

-- 이미 위에서 COMMIT을 해버렸기 때문에, 메모리 상에 있던 데이터들을
-- 하드디스크 쪽으로 위치가 옮겨가면서 확정된 데이터가 되어버렸다.

--○ 롤백 이후 다시 확인
SELECT *
FROM TBL_DEPT;
--==>>
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/
--> 롤백(ROLLBACK)을 수행했음에도 불구하고
--  50번 개발부 서울... 의 행 데이터는 소실되지 않았음을 확인


-- DML 구문 (데이터 조작 구문) : INSERT, UPDATE, DELETE, MERGE(병합)
--                                추가    변경    삭제



--※ COMMIT 을 실행한 이후로 DML(INSERT, UPDATE, DELETE) 구문을 통해
--   변경된 데이터를 취소할 수 있는 거일 뿐...
--   DML 명령을 사용한 후 COMMIT  을 수행하고나서 ROLLBACK 을 실행해봐야
--   아무 소용이 없다.


-- UPDATE 쓴 후에, WHERE부터 쓸 것. 절대 SET먼저 쓰지 마!! 제발!
-- 확인을 한 다음에 COMMIT해야 한다. SELECT 구문으로 제대로 처리된 것 확인한 후에 COMMIT!
-- 묶어서 COMMIT하거나 AUTO COMMIT을 하면 큰일 나
-- CREATE, ALTER : AUTO COMMIT이므로... 굉장히 신중해야 한다.
-- 하나의 테이블 작성한 후, INSERT한 후에 다른 테이블 만들면... INSERT한 데이터가 그대로 COMMIT되어 저장된다... 유의하자!
-- WHERE 절이 없으면 어떤 일? : 

--○ 데이터 수정(UPDATE → TBL_DEPT)

UPDATE TBL_DEPT
SET DNAME = '연구부', LOC = '경기'
WHERE DEPTNO = 50;

SELECT *
FROM TBL_DEPT;