-- 테이블 목록 확인
select * from tab;

-- 테이블 구조 확인
-- desc 테이블명;
-- : 테이블의 컬럼이름, 데이터 타입, 길이, NULL값 허용 유무 등과 같은 특정 데이터 정보를 알려줌.
desc dept;
-- DEPT 테이블 : 부서정보
-- DEPTNO NOT NULL NUMBER(2)     → 부서번호
-- DNAME           VARCHAR2(14)  → 부서명
-- LOC             VARCHAR2(13)  → 부서지역

desc emp;
-- EMP 테이블 : 사원정보
-- EMPNO    NOT NULL NUMBER(4)     → 사원번호
-- ENAME             VARCHAR2(10)  → 사원명
-- JOB               VARCHAR2(9)   → 담당업무 
-- MGR               NUMBER(4)     → 상사사원번호
-- HIREDATE          DATE          → 입사일
-- SAL               NUMBER(7,2)   → 급여
-- COMM              NUMBER(7,2)   → 커미션
-- DEPTNO            NUMBER(2)     → 부서번호

/*
# 오라클 자료형
→ NUMBER : 숫자
  > NUMBER ( precision, scale )
    : precision은 소수점을 포함한 전체 자릿수를 의미하며, scale은 소수점 이하 자릿수를 지정.
    Ex) 정수 - NUMBER(5)
        실수 - NUMBER(10,2) → 10 : 소수점을 포함한 전체 자릿수
                             2  : 소수점 이하 자릿수
→ VARCHAR2 : 가변길이의 문자열 저장
  > VARCHAR2 ( 가변형 ) → 최대 10글자까지 가능, 저장되는 문자수 만큼 사용.
  
→ CHAR : 고정길이의 문자 데이터 저장.
  > CHAR( 고정형 ) 
  Ex) CHAR(10) → 10글자확정.
  
→ DATE : 날짜 및 시간
*/

/*
# SELECT
→ 데이터를 조회하기 위한 SQL 명령어.

# 형식
- SELECT [DISTINCT] {*, column, ....}
  FROM table_name;
  > SELECT 문은 반드시 SELECT와 FROM이라는 2개의 키워드로 구성되어야한다.
    SELECT 절 뒤에는 출력하고자 하는 컬럼이름을 기술.
    특정 컬럼 이름 대신 *을 기술할 수 있는데, *은 테이블 내의 모든 컬럼을 출력하고자 하는 경우에 사용.
    FROM 절 다음에는 조회하려고하는 테이블 이름 기술.
*/

-- DEPT 테이블의 전체목록
select * from DEPT;

-- 특정 데이터만 보기
-- : DEPT 테이블의 부서번호, 부서이름 조회.
SELECT DEPTNO,DNAME  
FROM DEPT;

SELECT * fROM EMP;

-- 산술 연산 → NULL 값은 연산 불가능이라 NULL 결과값.
SELECT SAL + comm from emp;
SELECT SAL - 100 FROM Emp;
SELECT SAL * 12 FROM Emp;
SELECT SAL / 20 FROM Emp;

/*
# NULL
→ 행의 특정 열의 데이터 값이 없는 경우, 해당 값이 null이거나 NULL 을 포함한다고 함.
→ 모든 데이터 유형은 null을 포함가능.
→ 0 ( zero ) 도 아니고, 빈 공간도 아님.
  미확정, 알 수 없는 값을 의미.
  ? 혹은 무한의 의미이므로 연산,할당,비교가 불가능.
*/

SELECT ENAME, SAL, JOB, COMM, SAL*12, SAL*12+COMM FROM EMP;

/*
# NVL 함수
→ 컬럼의 값이 NULL인 경우 지정한 값으로 출력되고, NULL이 아니면 원래 값을 그대로 출력.
→ NVL( 컬럼명, 지정값 )
*/

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

/*
# alias
→ 열 머리글의 이름을 변경할 때 사용.
→ 컬럼 이름 대신 별칭을 출력하고자 하면, 컬럼을 기술한 바로 뒤에 AS 키워드를 사용한 후 별칭을 기술.
*/

SELECT ename, sal*12+NVL(comm, 0) AS AnnsaL
FROM EMP;

-- 원하는 문자대로 ""
SELECT ename, sal*12+NVL(comm, 0) AS "AnnsaL"
FROM EMP;
-- 한글 ""
SELECT ename, sal*12+NVL(comm, 0) AS "연봉"
FROM EMP;

/*
# 연결 연산자 → ||
→ 여러개의 컬럼을 연결할 때 사용.
→ literal 값은 SELECT 리스트에 포함된 문자, 숫자 또는 날짜.
  숫자 literal 은 그냥 사용해도 되지만, 문자 및 날짜 literal은 외따옴표(' ')로 작성. 
*/

SELECT ename || ' is a ' || job FROM EMP;

SELECT ename || ' 은(는) ' || job || ' 이다' AS "업무" FROM EMP;

/*
# DISTINCT
→ 기본적으로 쿼리 결과에는 중복 행을 포함한 모든 행이 표시됨.
  이 때 중복 행을 제거하려면 SELECT 키워드 바로 뒤에 DISTINCT 키워드 사용.
*/
SELECT deptno
FROM EMP;

SELECT DISTINCT deptno FROM EMP;

/* quiz */
-- emp 테이블에서 사원의 이름, 급여, 입사일자만 출력
SELECT ENAME, SAL, HIREDATE  FROM EMP;

-- 부서정보 테이블의 deptno는 부서번호, dname은 부서명으로 별칭을 부여해서 출력.
SELECT DEPTNO AS "부서번호", DNAME AS "부서명"
FROM DEPT;    
    
-- 사원정보 테이블의 담당업무가 중복되지 않고, 한번씩 나열되도록 출력.
SELECT DISTINCT JOB FROM EMP;

/*
# WHERE 조건
→ 원하는 행만 검색할 때에는 행을 제한하는 조건을 SELECT 문에 WHERE 절을 추가.
→ 형식
  SELECT * [ column,...] 
  FROM table_name
  WHERE 조건식;
→ >,<,>=,<=,=,!=
*/

-- 부서번호 10인 항목
SELECT * FROM EMP WHERE (DEPTNO=10);

-- 이름이 ford 인 사원의 사원번호, 사원이름, 급여 확인
-- > SQL문에서 문자열이나 날짜는 반드시 외따옴표 안에 작성해야 한다.
--   테이블 내에 저장된 값은 대소문자를 구분.
SELECT EMPNO, ENAME, SAL FROM EMP WHERE (ENAME='FORD');

-- 1982년 1월1일 이전에 입사한 사원
SELECT * FROM EMP WHERE (HIREDATE < '82/01/01');

/*
# 논리 연산자
→ and, or, not
*/
-- 부서번호가 10번이면서, 직급이 MANAGER 인 사람.
SELECT * FROM EMP WHERE (DEPTNO=10) AND (JOB='MANAGER');

-- 부서번호가 10번이거나, 직급이 MANAGER 인 사람.
SELECT * FROM EMP WHERE (DEPTNO=10) OR (JOB='MANAGER');

-- 부서번호가 10번이 아닌 직원
SELECT * FROM EMP WHERE (DEPTNO!=10);
SELECT * FROM EMP WHERE NOT (DEPTNO=10);

-- 2000~4000 사이의 급여를 받는 직원
SELECT * FROM EMP WHERE (SAL>=2000) AND (SAL<=4000);

-- BETWEEN
-- → 특정 범위의 값 확인
-- → column_name BETWEEN a AND b;
SELECT * FROM EMP WHERE SAL BETWEEN 2000 AND 4000;
SELECT * FROM EMP WHERE HIREDATE BETWEEN '81/01/01' AND '82/01/01';

/*
# in 연산자
→ 테이블 값을 확인.
→ column_name IN(a,b,c ...)
*/

-- 커미션이 300 이거나, 500인 직원
SELECT * FROM EMP WHERE comm IN(300,500);

/*
# LIKE 연산자와 와일드 카드
→ 검색하는 값을 정확히 모를때에 검색이 가능.
→ column_name LIKE pattern
  → % : 0개 이상의 문자
    _ : 입이의 단일문자
*/

-- emp 테이블에서 이름이 M으로 시작하는 모든 직원,
SELECT * FROM EMP WHERE ENAME LIKE 'M%';

-- emp 테이블에서 이름에 0이 들어있는/ 모든 직원
SELECT * FROM EMP WHERE ENAME LIKE '%0%';

-- emp 테이블에서 이름이 K로 시작하면서 4글자인 모든 직원,
SELECT * FROM EMP WHERE ENAME LIKE 'K___';

-- emp 테이블에서 이름에 A가 들어가지 않는 모든직원 
SELECT * FROM EMP WHERE ename NOT LIKE '%A%';

-- emp 테이블에서 Column의 값이 null인 모든 직원
SELECT * FROM EMP WHERE comm IS null;

/*
# ORDER BY
→ 데이터를 정렬할 때 사용.
→ 정렬방식을 지정하지 않으면, 기본적으로 오름차순 정렬.
→ DESC, ASC
*/

-- emp 테이블의 급여를 기준으로 오름차순 정렬
SELECT * FROM EMP ORDER BY SAL ASC;

-- emp 테이블의 급여를 기준으로 내림차순 정렬
SELECT * FROM EMP ORDER BY SAL DESC;

-- emp 테이블의 급여를 기준으로 내림차순 정렬하고, 급여가 같으면 이름을 기준으로 내림차순 정렬
SELECT * FROM EMP ORDER BY SAL DESC, ENAME DESC;

/* quiz */ SELECT * FROM EMP;
-- emp 테이블에서 급여가 3000이상인 사원의 사원번호, 이름, 직급, 급여를 출력.
SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE (SAL>=3000);
-- emp 테이블에서 직급이 MANAGER인사원의 사원번호,이름,직급,급여,부서번호를 출력.
SELECT EMPNO,ENAME,JOB,SAL,DEPTNO FROM EMP WHERE (JOB='MANAGER');
-- emp 테이블에서 사원번호가 7902,7782,7566 인 사원의 사원번호, 이름, 직급, 급여, 입사일자를 출력.
SELECT EMPNO,ENAME,JOB,SAL,HIREDATE FROM EMP WHERE EMPNO IN(7902,7782,7566);
-- emp 테이블에서 직급이 MANAGER, CLERK이 아닌 사원의 사원번호, 이름, 직급, 급여, 부서번호 출력.
SELECT EMPNO,ENAME,JOB,SAL,DEPTNO FROM EMP WHERE (JOB!='MANAGER') AND (JOB!='CLERK');
SELECT EMPNO,ENAME,JOB,SAL,DEPTNO FROM EMP WHERE JOB NOT IN ('MANAGER', 'CLERK');
-- emp 테이블을 부서번호로 오름차순 정렬한 후,
-- 부서번호가 같으면 급여가 많은순으로 정렬하여 사원번호, 이름, 직급, 부서번호, 급여를 출력.
SELECT EMPNO,ENAME,JOB,DEPTNO,SAL FROM EMP ORDER BY DEPTNO ASC, SAL DESC;