SELECT USER
FROM DUAL;
--==>> SCOTT
--○ NVL2()
--> 첫 번째 파라미터 값이 NULL 이 아닌 경우, 두 번째 파라미터 값을 반환하고,
-- 첫 번째 파라미터 값이 NULL 인 경우, 세 번째 파라미터 값을 반환한다.
SELECT NVL2(NULL, '청기올려', '백기올려')"결과확인"
FROM DUAL;
--==>>백기올려
SELECT NVL2(20, '청기올려', '백기올려')"결과확인"
FROM DUAL;
--==>>청기올려
SELECT ENAME, COMM, NVL2(COMM, '청기올려','백기올려') "결과확인"
FROM TBL_EMP;
--==>>
/*
SMITH 백기올려
ALLEN 300 청기올려
WARD 500 청기올려
JONES 백기올려
MARTIN 1400 청기올려
BLAKE 백기올려
CLARK 백기올려
SCOTT 백기올려
KING 백기올려
TURNER 0 청기올려
ADAMS 백기올려
JAMES 백기올려
FORD 백기올려
MILLER 백기올려
*/
--○ TBL_EMP 테이블에서 모든 사원들의
-- 사원명, 사원번호, 급여, 커미션, 연봉 항목을 조회한다.
-- 단, 급여(SAL)는 매월 지급한다.
-- 또한, 수당(COMM)은 매년 지급한다.
SELECT ENAME "사원명", EMPNO "사원번호", SAL "급여", COMM "커미션"
, NVL2(COMM, SAL * 12 + COMM, SAL*12) "연봉" -- 널인지 아닌지 확인하는 건 커미션
FROM TBL_EMP;
--==>>
/*
SMITH 7369 800 9600
ALLEN 7499 1600 300 19500
WARD 7521 1250 500 15500
JONES 7566 2975 35700
MARTIN 7654 1250 1400 16400
BLAKE 7698 2850 34200
CLARK 7782 2450 29400
SCOTT 7788 3000 36000
KING 7839 5000 60000
TURNER 7844 1500 0 18000
ADAMS 7876 1100 13200
JAMES 7900 950 11400
FORD 7902 3000 36000
MILLER 7934 1300 15600
*/
--○ COALESCE()
--> 맨 앞에 있는 매개변수부터 차례로 NULL 인지 아닌지 확인하여
-- NULL 이 아닐 경우 적용(반환, 처리)하고,
-- NULL 인 경우에는 그 다음 매개변수 값으로 적용(반환, 처리)한다.
-- NVL() 이나 NVL2() 와 비교하여...
-- 모~~ 든 경우의 수를 고려할 수 있는 특징을 갖고 있다.
SELECT NULL "기본확인"
, COALESCE(NULL, NULL, NULL, 10) "결과확인" -- 차례로 확인후 널이아니네를 반환하는거
, COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, 150) "결과확인2"
, COALESCE(NULL, NULL, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, 150) "결과확인3"
FROM DUAL;
--==>> 10 150 10
--○ 실습 환경 조성을 위한 데이터 추가 입력
INSERT INTO TBL_EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, DEPTNO)
VALUES(8000, '이동건', 'SALESMAN', 7839, SYSDATE, 10);
INSERT INTO TBL_EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, COMM, DEPTNO)
VALUES(8001, '김주형', 'SALESMAN', 7839, SYSDATE, 100, 10);
--○확인
SELECT *
FROM TBL_EMP;
--==>>
/*
8000 이동건 SALESMAN 7839 25/06/30 10 -- 급여, 커미션 O
8001 김주형 SALESMAN 7839 25/06/30 100 10 -- 커미션 100
*/
--○ 커밋
COMMIT;
--==>> 커밋 완료.
--○ TBL_EMP 테이블에서 모든 사원들의
-- 사원명, 사원번호, 급여, 커미션, 연봉 항목을 조회한다.
-- 단, 급여(SAL)는 매월 지급한다.
-- 또한, 수당(COMM)은 매년 지급한다.
SELECT ENAME "사원명", EMPNO "사원번호", SAL "급여", COMM "커미션"
, SAL * 12 + NVL(COMM, 0) "연봉"
FROM TBL_EMP;
SELECT ENAME "사원명", EMPNO "사원번호", SAL "급여", COMM "커미션"
, COALESCE((SAL * 12 + COMM), (SAL*12), COMM, 0) "연봉"
-- 급여+커미션 조건1(기본수식) / 급여*12 조건2(커미션없는 사람),
-- 커미션만 있는사람(조건3), 아무것도 없는사람(조건4=NULL)
FROM TBL_EMP;
/*
SMITH 7369 800 9600
ALLEN 7499 1600 300 19500
WARD 7521 1250 500 15500
JONES 7566 2975 35700
MARTIN 7654 1250 1400 16400
BLAKE 7698 2850 34200
CLARK 7782 2450 29400
SCOTT 7788 3000 36000
KING 7839 5000 60000
TURNER 7844 1500 0 18000
ADAMS 7876 1100 13200
JAMES 7900 950 11400
FORD 7902 3000 36000
MILLER 7934 1300 15600
이동건 8000 0
김주형 8001 100 100
*/
--------------------------------------------------------------------------------
--==>>
--○
--※ 날짜와 시간에 대한 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==>> Session이(가) 변경되었습니다.
SELECT *
FROM TBL_EMP;
DESC TBL_EMP;
SELECT SYSDATE
FROM DUAL;
--==>> 25/06/30
--==>> 2025-06-30 09:49:42
--○ 현재 날짜 및 시간을 반환하는 함수
SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP
FROM DUAL;
--==>
/*
2025-06-30 10:02:49
2025-06-30 10:02:49
25/06/30 10:02:49.000000000
*/
--※ 날짜와 시간에 대한 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--==>Session이(가) 변경되었습니다.
-- 변경 이후 다시 조회
SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP
FROM DUAL;
--==>
/*
2025-06-30
2025-06-30
25/06/30 10:04:55.000000000
*/
--○ 컬럼과 컬럼의 연결(결합)
-- 문자 타앱과 문자 타입의 연결
-- [+] 연산자를 통한 결합 수행은 불가능~!!! [||]
SELECT 1 + 1
FROM DUAL;
--==> 2
/*SELECT '김주형', '이동건'
FORM DAUL;*/
SELECT '김주형' + '이동건'
FORM DAUL;
--==> 에러 발생
/*
ORA-00923: FROM keyword not found where expected
00923. 00000 - "FROM keyword not found where expected"
*Cause:
*Action:
184행, 30열에서 오류 발생
*/
SELECT "김주형"||"이동건"
FORM DAUL;
SELECT ENAME, JOB
FROM TBL_EMP;
--==>
/*
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
이동건 SALESMAN
김주형 SALESMAN
*/
SELECT ENAME || JOB "결과확인"
FROM TBL_EMP;
--==>>
/*
SMITHCLERK
ALLENSALESMAN
WARDSALESMAN
JONESMANAGER
MARTINSALESMAN
BLAKEMANAGER
CLARKMANAGER
SCOTTANALYST
KINGPRESIDENT
TURNERSALESMAN
ADAMSCLERK
JAMESCLERK
FORDANALYST
MILLERCLERK
이동건SALESMAN
김주형SALESMAN
*/
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;
--==>>
/*
7369SMITH
7499ALLEN
7521WARD
7566JONES
7654MARTIN
7698BLAKE
7782CLARK
7788SCOTT
7839KING
7844TURNER
7876ADAMS
7900JAMES
7902FORD
7934MILLER
8000이동건
8001김주형
*/
-- 문자타입 날짜타입 문자타입 숫자타입 문자타입
-- --------- ------- ------- --- ------------
SELECT '규석이는', SYSDATE, '에 연봉', 500, '억을 원한다.'
FROM DUAL;
--==>>규석이는 2025-06-30 에 연봉 500 억을 원한다.
-- 문자타입 날짜타입 문자타입 숫자타입 문자타입
-- --------- ------- ------- --- ------------
SELECT '규석이는'|| SYSDATE || '에 연봉' || 500 || '억을 원한다.' "결과확인"
FROM DUAL;
--==>> 규석이는2025-06-30에 연봉500억을 원한다.
--※ 오라클에서는 문자 타입의 형태로 타입을 변환하는 별도의 과정 없이
-- 위에서 처리한 내용처럼 [||] 만 삽입해주면 간단히 컬럼과 컬럼을
-- (서로 다른 종류의 데이터) 결합하는 것이 가능하다.
-- 이와 비교하여 MS-SQL에서는 모든 데이터를 문자타입으로 CONVERT 해야 한다.
SELECT *
FROM TBL_EMP;
-- 실습 진행 전에 이동건 사원과 김주형 사원 제거
SELECT *
FROM TBL_EMP
WHERE EMPNO=8000 OR EMPNO=8001;
--==>>
/*
8000 이동건 SALESMAN 7839 2025-06-30 10
8001 김주형 SALESMAN 7839 2025-06-30 100 10
*/
DELETE
FROM TBL_EMP
WHERE EMPNO=8000 OR EMPNO=8001;
/*
2개 행 이(가) 삭제되었습니다.
*/
SELECT *
FROM TBL_EMP;
--==>> 원하는 데이터가 제데로 제거되었음을 확인
--커밋
COMMIT;
--==>>커밋 완료.
--○ TBL_EMP 테이블의 데이터를 활용하여
-- 모든 직원들의 데이터에 대해
-- 다음과 같은 결과를 얻을 수 있도록 쿼리문을 구성한다.
-- SMITH 의 현재 연봉은 9600인데, 희망 연봉은 19200이다.
-- ALLEN 의 현재 연봉은 19500인데, 희망 연봉은 39000이다.
-- 현재연봉은 앞에 수식으로 얻어낸 결과
DESC TBL_EMP;
-- 방식1
SELECT ENAME || '의 현재 연봉은' || NVL(SAL * 12 + COMM, SAL *12) -- 커미션이 NULL도 있으므로
|| '인데 희망 연봉은' || NVL(SAL * 12 + COMM, SAL *12) *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이다.
*/
-- 방식 2
SELECT ENAME || '의 현재 연봉은' || NVL2(COMM, SAL * 12 + COMM, SAL*12)
|| '인데 희망 연봉은' || NVL2(COMM, SAL * 12 + COMM, SAL*12)*2 || '이다'
FROM TBL_EMP;
-- 방식 3
SELECT ENAME || '의 현재 연봉은' || COALESCE(SAL * 12 + COMM, SAL *12, COMM, 0) -- 커미션이 NULL도 있으므로
|| '인데 희망 연봉은' || 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이다.
*/
SELECT *
FROM TBL_EMP;
-- SMITH's 입사일은 1980-12-17 이다. 그리고 급여는 800 이다.
-- ALLEN's 입사일은 1982-02-20 이다. 그리고 급여는 1600 이다.
-- DATE sal
DESC TBL_EMP;
SELECT ENAME || '''s 입사일은 ' || HIREDATE
|| ' 이다. 그리고 급여는 ' || SAL || ' 이다.'
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 이다
*/
--○ UPPER(), LOWER(), INITCAP()
SELECT 'oRaCLe' "1", UPPER('oRaCLe') "2", LOWER('oRaCLe') "3"
, INITCAP('oRaCLe') "4"
FROM DUAL;
--==>>oRaCLe ORACLE oracle Oracle
--> UPPER() 는 모두 대문자로 변환하여 반환
-- LOWER()는 모두 소문자로 변환하여 반환
-- INITCAP()은 첫 글자만 대문자로 하고 나머지는 모두 소문자로 변환하여 반환
SELECT *
FROM TBL_EMP
WHERE JOB = 'saleman';
--==>> 조회결과없음
--※ 실습 환경 구성을 위한 추가 데이터 입력
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);
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;
--==>>
/*
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 7698 2025-06-30 2000 200 30
8001 조경진 SaLesMan 7698 2025-06-30 2000 200 30
8002 이채원 salesman 7698 2025-06-30 2000 200 30
8003 이유빈 SALESMan 7698 2025-06-30 2000 200 30
*/
--○ 커밋
COMMIT;
--==>> 커밋 완료.
--○TBL_EMP 테이블에서 대소문자 구분없이 세일즈맨 직종인 사원의
-- 사원번호, 사원명, 직종, 입사일, 부서번호 항목을 조회한다.
-- (※ 세일즈맨 : SALESMAN, saLesMAN , SaLesMan, salesman , SALESMan)
INSERT INTO TBL_EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8001, '조경진', 'SaLesMan', 7698 , SYSDATE, 2000 , 200, 30);
SELECT *
FROM TBL_EMP;
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종", HIREDATE "입사일" , DEPTNO "부서번호"
FROM TBL_EMP
WHERE JOB = 세일즈맨 ;
-- SALESMAN, saLesMAN , SaLesMan, salesman , SALESMan
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종", HIREDATE "입사일" , DEPTNO "부서번호"
FROM TBL_EMP
WHERE JOB = 'SALESMAN' OR JOB = 'saLesMAN' OR JOB = 'SaLesMan' OR JOB = 'salesman' OR JOB = 'SALESMan';
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종", HIREDATE "입사일" , DEPTNO "부서번호"
FROM TBL_EMP
WHERE JOB IN('SALESMAN', 'saLesMAN','SaLesMan','salesman','SALESMan');
/*
7499 ALLEN SALESMAN 1981-02-20 30
7521 WARD SALESMAN 1981-02-22 30
7654 MARTIN SALESMAN 1981-09-28 30
7844 TURNER SALESMAN 1981-09-08 30
8000 최규석 saLesMAN 2025-06-30 30
8001 조경진 SaLesMan 2025-06-30 30
8002 이채원 salesman 2025-06-30 30
8003 이유빈 SALESMan 2025-06-30 30
*/
-- 관찰
SELECT JOB "직종", UPPER(JOB) "직종확인1", LOWER(JOB) "직종확인2"
, INITCAP(JOB) "직종확인3"
FROM TBL_EMP;
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종", HIREDATE "입사일" , DEPTNO "부서번호"
FROM TBL_EMP
WHERE UPPER(JOB) = 'SALESMAN';
--==>>
/*
7499 ALLEN SALESMAN 1981-02-20 30
7521 WARD SALESMAN 1981-02-22 30
7654 MARTIN SALESMAN 1981-09-28 30
7844 TURNER SALESMAN 1981-09-08 30
8000 최규석 saLesMAN 2025-06-30 30
8001 조경진 SaLesMan 2025-06-30 30
8002 이채원 salesman 2025-06-30 30
8003 이유빈 SALESMan 2025-06-30 30
*/
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종", HIREDATE "입사일" , DEPTNO "부서번호"
FROM TBL_EMP
WHERE LOWER(JOB) = 'salesman';
/*
7499 ALLEN SALESMAN 1981-02-20 30
7521 WARD SALESMAN 1981-02-22 30
7654 MARTIN SALESMAN 1981-09-28 30
7844 TURNER SALESMAN 1981-09-08 30
8000 최규석 saLesMAN 2025-06-30 30
8001 조경진 SaLesMan 2025-06-30 30
8002 이채원 salesman 2025-06-30 30
8003 이유빈 SALESMan 2025-06-30 30
*/
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종", HIREDATE "입사일" , DEPTNO "부서번호"
FROM TBL_EMP
WHERE INITCAP(JOB) = 'Salesman';
/*
7499 ALLEN SALESMAN 1981-02-20 30
7521 WARD SALESMAN 1981-02-22 30
7654 MARTIN SALESMAN 1981-09-28 30
7844 TURNER SALESMAN 1981-09-08 30
8000 최규석 saLesMAN 2025-06-30 30
8001 조경진 SaLesMan 2025-06-30 30
8002 이채원 salesman 2025-06-30 30
8003 이유빈 SALESMan 2025-06-30 30
*/
--○ TBL_EMP 테이블에서 입사일이 1981년 9월 28일 입사한 직원읜
-- 사원명, 직종명, 입사일 항목을 조회한다.
SELECT 사원명, 직종명, 입사일
FROM TBL_EMP
WHERE 입사일이 1981년 9월 28일;
SELECT ENAME "사원명", JOB "직종", HIREDATE "입사일"
FROM TBL_EMP
WHERE HIREDATE ='1981-09-28';
-- 날짜타입 - 문자타입이라 잘못됐으나 오라클이 자동변환해준것으로 믿으면 안됨
--==> MARTIN SALESMAN 1981-09-28
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)
*/
--○ TO_DATE()
SELECT 2025-06-30 "COL1"
,'2025-06-30' "COL2"
,TO_DATE('2025-06-30' ,'YYYY-MM-DD') "COL3"
FROM DUAL;
--==> 1989 2025-06-30 2025-06-30
SELECT TO_DATE('2025-06-31', 'YYYY-MM-DD') "RESULT"
FROM DUAL;
--==>> 에러발생
/*
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
*/
SELECT TO_DATE('2025-13-05', 'YYYY-MM-DD') "RESULT"
FROM DUAL;
--==>> 에러발생
/*
ORA-01843: not a valid month
01843. 00000 - "not a valid month"
*Cause:
*Action:
*/
SELECT TO_DATE('2025-02-29', 'YYYY-MM-DD') "RESULT"
FROM DUAL;
/*
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
*/
SELECT ENAME "사원명", JOB "직종", HIREDATE "입사일"
FROM TBL_EMP
WHERE HIREDATE = TO_DATE('1981-09-28','YYYY-MM-DD');
--==> MARTIN SALESMAN 1981-09-28
--○ TBL_EMP 테이블에서 입사일이 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 >= 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 2025-06-30
조경진 SaLesMan 2025-06-30
이채원 salesman 2025-06-30
이유빈 SALESMan 2025-06-30
*/
--○ TBL_EMP 테이블에서 입사일이 1981년 4월 2일 부터
-- 1981년 9월 28일 사이에 입사한 직원들의
-- 입사한 직원의 사원번호 사원명, 직종명, 입사일 항목을 조회한다.(해당일 포함)
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종", HIREDATE "입사일"
FROM TBL_EMP
WHERE 입사일이 1981년 4월 2일 부터
--1981년 9월 28일 사이;
SELECT EMPNO "사원번호" ENAME "사원명", JOB "직종", HIREDATE "입사일"
FROM TBL_EMP
WHERE 입사일이 1981년 4월 2일 <= 입사일 <= 1981년 9월 28일;
SELECT EMPNO "사원번호" ENAME "사원명", JOB "직종", HIREDATE "입사일"
FROM TBL_EMP
WHERE 입사일 >=1981년 4월 2일
입사일<= 1981년 9월 28일;
SELECT EMPNO "사원번호", 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');
/*
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
*/
--○ BETWEEN A) AND B)
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');
/*
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
*/
--○ BETWEEN A) AND B) 숫자를 대상으로 적용
SELECT EMPNO , ENAME , JOB, SAL
FROM TBL_EMP
WHERE SAL BETWEEN 1600 AND 3000;
/*
7499 ALLEN SALESMAN 1600
7566 JONES MANAGER 2975
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7788 SCOTT ANALYST 3000
7902 FORD ANALYST 3000
8000 최규석 saLesMAN 2000
8001 조경진 SaLesMan 2000
8002 이채원 salesman 2000
8003 이유빈 SALESMan 2000
*/
--○ BETWEEN A) AND B) 문자를 대상으로 적용
SELECT EMPNO , ENAME , JOB, SAL
FROM TBL_EMP
WHERE ENAME BETWEEN 'C' AND 'S';
--A AND B
--●--------------●
--==>>
/*
7566 JONES MANAGER 2975
7654 MARTIN SALESMAN 1250
7782 CLARK MANAGER 2450
7839 KING PRESIDENT 5000
7900 JAMES CLERK 950
7902 FORD ANALYST 3000
7934 MILLER CLERK 1300
*/
--※ BETWEEN A) AND B) 는 날짜형, 숫자형, 문자형 데이터 무두를 대상으로 사용할 수 있다.
-- 단, 문자형일 경우 아스키코드 순서를 따르기 때문에(사전식 배열)
-- 대문자가 앞쪽에 위치하고, 소문자가 뒤쪽에 위치하며
-- BETWEEN A) AND B)는 쿼리문이 수행되는 시점에서
-- 오라클 내부적으로 부등호 연산자의 형태로 바뀌어 처리된다.
-- 사원명 s가 있다면 s는 나옴.
SELECT EMPNO , ENAME , JOB, SAL
FROM TBL_EMP
WHERE ENAME BETWEEN 'C' AND 's';
/*
7369 SMITH CLERK 800
7521 WARD SALESMAN 1250
7566 JONES MANAGER 2975
7654 MARTIN SALESMAN 1250
7782 CLARK MANAGER 2450
7788 SCOTT ANALYST 3000
7839 KING PRESIDENT 5000
7844 TURNER SALESMAN 1500
7900 JAMES CLERK 950
7902 FORD ANALYST 3000
7934 MILLER CLERK 1300
*/
--○ ASCII()
SELECT ASCII('A') "RESULT1", ASCII('B') "RESULT2"
,ASCII('a') "RESULT3", ASCII('b') "RESULT4"
FROM DUAL;
--==>>65 66 97 98
--○
--※
SELECT *
FROM TBL_EMP
WHERE EMPNO BETWEEN 8000 AND 8003;
/*
8000 최규석 saLesMAN 7698 2025-06-30 2000 200 30
8001 조경진 SaLesMan 7698 2025-06-30 2000 200 30
8002 이채원 salesman 7698 2025-06-30 2000 200 30
8003 이유빈 SALESMan 7698 2025-06-30 2000 200 30
*/
DELETE
FROM TBL_EMP
WHERE EMPNO BETWEEN 8000 AND 8003;
--==>> 4개 행 이(가) 삭제되었습니다.
COMMIT;
--==>> 커밋 완료.
--○ TBL_EMP 테이블에서 직종이 SALESMAN 과 CLERK 인 사원의
-- 사원번호, 사원명, 직종명, 급여 항목을 조회한다.
SELECT EMPNO "사원번호" ENAME "사원명", JOB "직종", SAL "급여"
FROM TBL_EMP
WHERE 직종이 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');
/*
7369 SMITH CLERK 800
7499 ALLEN SALESMAN 1600
7521 WARD SALESMAN 1250
7654 MARTIN SALESMAN 1250
7844 TURNER SALESMAN 1500
7876 ADAMS CLERK 1100
7900 JAMES CLERK 950
7934 MILLER CLERK 1300
*/
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종", SAL "급여"
FROM TBL_EMP
WHERE JOB = ANY('SALESMAN', 'CLERK'); -- cf.[=ALL]
/*
7369 SMITH CLERK 800
7499 ALLEN SALESMAN 1600
7521 WARD SALESMAN 1250
7654 MARTIN SALESMAN 1250
7844 TURNER SALESMAN 1500
7876 ADAMS CLERK 1100
7900 JAMES CLERK 950
7934 MILLER CLERK 1300
*/
--※ 위의 3가지 유형의 쿼리문은 모두 같은 결과를 반환한다.
-- 하지만, 맨 위의 쿼리문이 가장 빠르게 처리된다.
-- 물론, 메모리에 대한 내용이 아니라 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)
*/
--○ 데이터 입력
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1001, '김주형', '0004183234567', TO_DATE('2011-01-03', 'YYYY-MM-DD'), 3000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1002, '이유빈', '0406274234567', TO_DATE('2017-11-05', 'YYYY-MM-DD'), 2000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1003, '유한', '0004173234567', TO_DATE('2011-01-03', 'YYYY-MM-DD'), 3000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1004, '이상이', '8512161234567', TO_DATE('1998-08-16', 'YYYY-MM-DD'), 2000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1005, '아이유', '9302022234567', TO_DATE('2010-07-13', 'YYYY-MM-DD'), 3000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1006, '이이경', '7506171234567', TO_DATE('1997-03-10', 'YYYY-MM-DD'), 4000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1007, '미노이', '9704252234567', TO_DATE('2007-12-10', 'YYYY-MM-DD'), 2000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1008, '선우선', '7905082234567', TO_DATE('1998-08-16', 'YYYY-MM-DD'), 2000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1009, '선동열', '7012181234567', TO_DATE('1990-10-10', 'YYYY-MM-DD'), 3000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1010, '남희석', '7502201234567', TO_DATE('1998-08-16', 'YYYY-MM-DD'), 1000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1011, '선우용녀', '7005132234567', TO_DATE('1998-08-16', 'YYYY-MM-DD'), 1000);
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1012, '남궁선', '0502204234567', TO_DATE('2015-08-14', 'YYYY-MM-DD'), 1000);
--==>> 1 행 이(가) 삽입되었습니다. * 12
--○확인
SELECT *
FROM TBL_SAWON;
--==>>
/*
1001 김주형 0004183234567 2011-01-03 3000
1002 이유빈 0406274234567 2017-11-05 2000
1003 유한 0004173234567 2011-01-03 3000
1004 이상이 8512161234567 1998-08-16 2000
1005 아이유 9302022234567 2010-07-13 3000
1006 이이경 7506171234567 1997-03-10 4000
1007 미노이 9704252234567 2007-12-10 2000
1008 선우선 7905082234567 1998-08-16 2000
1009 선동열 7012181234567 1990-10-10 3000
1010 남희석 7502201234567 1998-08-16 1000
1011 선우용녀 7005132234567 1998-08-16 1000
1012 남궁선 0502204234567 2015-08-14 1000
*/
--○ 커밋
COMMIT;
--==>> 커밋 완료.
--○ TBL_SAWON 테이블에서 김주형 사원의 정보를 모두 조회한다.
SELECT *
FROM TBL_SAWON
WHERE SANAME= '김주형';
--==>> 1001 김주형 0004183234567 11/01/03 3000
SELECT *
FROM TBL_SAWON
WHERE SANAME LIKE '김주형';
--==>> 1001 김주형 0004183234567 11/01/03 3000
--※ LIKE : 동사 → 좋아하다.
-- 부사 → ~와 같이, ~ 처럼 CHECK~!!
--※ WILD CARD(CHARACTER) → [%]
-- [LIKE] 와 함께 사용되는 [%]는 모든 글자를 의미한다.
-- [LIKE] 와 함께 사용되는 [_]는 아무 글자 한 개를 의미한다.
--○ TBL_SAWON 테이블에서 성씨가 [김] 씨인 사원의
-- 사원명, 주민번호, 급여 항목을 조회한다.
SELECT 사원명, 주민번호, 급여
FROM TBL_SAWON
WHERE 성씨가 [김] 씨;
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME = '김';
--==>> 조회 결과 없음.
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '김__';
--==>> 김주형 0004183234567 3000
--○ 데이터 추가 입력
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1013, '김훈', '8502071234557', TO_DATE('1999-10-10', 'YYYY-MM-DD'), 2000);
--==>> 1 행 이(가) 삽입되었습니다.
SELECT *
FROM TBL_SAWON;
/*
1013 김훈 8502071234557 99/10/10 2000
1001 김주형 0004183234567 11/01/03 3000
1002 이유빈 0406274234567 17/11/05 2000
1003 유한 0004173234567 11/01/03 3000
1004 이상이 8512161234567 98/08/16 2000
1005 아이유 9302022234567 10/07/13 3000
1006 이이경 7506171234567 97/03/10 4000
1007 미노이 9704252234567 07/12/10 2000
1008 선우선 7905082234567 98/08/16 2000
1009 선동열 7012181234567 90/10/10 3000
1010 남희석 7502201234567 98/08/16 1000
1011 선우용녀 7005132234567 98/08/16 1000
1012 남궁선 0502204234567 15/08/14 1000
*/
--커밋
COMMIT;
--==>> 커밋 완료.
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE'김__';
--==>> 김주형 0004183234567 3000
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE'김_';
--==>> 김훈 8502071234557 2000
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE'김%';
--==>>
/*
김훈 8502071234557 2000
김주형 0004183234567 3000
*/
--○ TBL_SAWON 테이블에서 이름의 마지막 글자가 [이]로
-- 끝나는 사원의 사원명, 주민번호 ,입사일, 급여 항목을 조회한다.
SELECT *
FROM TBL_SAWON;
SELECT 사원명, 주민번호 ,입사일, 급여
FROM TBL_SAWON
WHERE 이름의 마지막 글자가 [이];
SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE'__이';
--==>>
/*
이상이 8512161234567 98/08/16 2000
미노이 9704252234567 07/12/10 2000
*/
SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이';
--==>>
/*
이상이 8512161234567 98/08/16 2000
미노이 9704252234567 07/12/10 2000
*/
--○ TBL_SAWON 테이블에서 이름의 두 번째 글자가 [이]인 사원의
-- 사원명, 주민번호 ,입사일, 급여 항목을 조회한다.
SELECT *
FROM TBL_SAWON;
SELECT 사원명, 주민번호 ,입사일, 급여
FROM TBL_SAWON
WHERE 이름의 두 번째 글자가 [이];
SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '_이';
--==>> 조회 결과 없음
SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '_이%';
--==>>
/*
아이유 9302022234567 10/07/13 3000
이이경 7506171234567 97/03/10 4000
*/
--○ TBL_SAWON 테이블에서 이름의 [이]라는 글자가
-- 하나라도 포함되어 있으면 그 사원의
-- 사원명, 주민번호, 입사일, 급여 항목을 조회한다.
SELECT *
FROM TBL_SAWON;
SELECT 사원명, 주민번호, 입사일, 급여
FROM TBL_SAWON
WHERE 이름의 [이]라는 글자가 하나라도 포함;
SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이%';
--==>>
/*
이유빈 0406274234567 17/11/05 2000
이상이 8512161234567 98/08/16 2000
아이유 9302022234567 10/07/13 3000
이이경 7506171234567 97/03/10 4000
미노이 9704252234567 07/12/10 2000
*/
--○ TBL_SAWON 테이블에서 이름의 [이]라는 글자가
-- 연속으로 두 번 포함되어 있으면 그 사원의
-- 사원명, 주민번호, 입사일, 급여 항목을 조회한다.
SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이이%';
--==>> 이이경 7506171234567 97/03/10 4000
--○ TBL_SAWON 테이블에서 이름의 [이]라는 글자가
-- 연속적이지 않더라도 두 번 포함되어 있으면 그 사원의
-- 사원명, 주민번호, 입사일, 급여 항목을 조회한다.
SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이%이%';
--==>>
/*
이상이 8512161234567 98/08/16 2000
이이경 7506171234567 97/03/10 4000
*/
--○ TBL_SAWON 테이블에서 성씨가 [선]씨인 사원의
--○ TBL_SAWON 테이블에서 성씨가 [남]씨인 사원의
-- 사원명, 주민번호, 입사일, 급여 항목을 조회한다. >> 이건 안됨.
--※ 테이터베이스 설계 시 성과 이름을 분리해서 처리해야 함.
-- 업무 계획이 있다면(지금 당장은 아니더라도...)
-- 테이블에서 성 컬럼과 이름 컬럼을 분리하여 구성해야 한다.
--○ TBL_SAWON 테이블에서 남자직원들의 사원명, 주민번호, 급여 항목을 조회한다.
SELECT 사원명, 주민번호, 급여
FROM TBL_SAWON;
WHERE 남자직원들;
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON;
WHERE 성별이 남성;
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON;
WHERE 주민번호7번째 자리1개가 1;
주민번호7번째 자리1개가 3;
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE JUBUN LIKE '______1%'
OR JUBUN LIKE '______3%'; -- 앞 자리 확인되면 뒷자리 확인은 필요없으므로
--==>>
/*
김훈 8502071234557 2000
김주형 0004183234567 3000
유한 0004173234567 3000
이상이 8512161234567 2000
이이경 7506171234567 4000
선동열 7012181234567 3000
남희석 7502201234567 1000
*/
--○ 실습 테이블 생성
-- 테이블명 : TBL_WATCH
CREATE TABLE TBL_WATCH
( WATCH_NAME VARCHAR2(20)
, BIGO VARCHAR2(100)
);
-- 컴마를 앞에 찍는 습관을 들여야 함.
--○ 데이터 입력
INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
VALUES('금시계','순금 99.99% 함유된 최고급 시계');
INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
VALUES('은시계','고객 만족도 99.99점을 획득한 시계');
--==>> 1 행 이(가) 삽입되었습니다.
--○확인
SELECT *
FROM TBL_WATCH;
/*
금시계 순금 99.99% 함유된 최고급 시계
은시계 고객 만족도 99.99점을 획득한 시계
*/
--○ 커밋
COMMIT;
--==>> 커밋 완료.
--○ TBL_WATCH 테이블의 BIGO(비고) 컬럼에
-- [99.99%] 라는 글자가 들어있는 행(레코드)을 조회한다.
-- WHERE SANAME LIKE '이%';
SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '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% 함유된 최고급 시계
*/
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 로 정한 문자의 다음 한 글자는 와일드카드에서 탈출시키도록 처리하는 구문
-- [ESCAPE '\']
-- 일반적으로 키워드 아닌, 연산자 아닌, 사용 빈도가 낮은 특수문자(특수기호)를 사용
--------------------------------------------------------------------------------
댓글 영역