학원에서 학습한 내용을 개인정리한 글입니다.
맥북 m2을 사용하고 있어서 아래 링크를 참고하여 DB 세팅 완료
Oracle, Docker, Oracle SQL Developer 다운로드 받음!
귀여워서 디비버도 다운받았지만 학원에서 하는 동안은 안할것같다 아마도..
Docker 실행 후 application 내에서 열리지않아서 백그라운드 종료 후 이 페이지대로 따라했다. 이후 이슈는 발생하지 않았다.

ALTER SESSION SET "_ORACLE_SCRIPT" = TRUE;
CREATE USER 사용자명 IDENTIFIED BY 비밀번호 DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
GRANT CONNECT TO NAME;
CREATE TABLE TEST(
TEST_NAME VARCHAR2(20),
TEST_AGE NUMBER
);
GRANT RESOURCE TO NAME;

Temi: Null값은 보통 언제 사용하는지? 일부러 넣는 경우가 있는지? 아예 지양하는 편이라면 다른 값을 넣는 편인지?
Teacher : 디비 규칙에서도 지양으로 뜨긴하는데, 없는값은 없다고 널값을 아예 테이블을 갈라버림.
SELECT EMP_NAME as NAME
--부서가 d5인 사원의 전체 칼럼 조회하기
SELECT * FROM EMPLOYEE WHERE DEPT_CODE = 'D5';
SELECT LENGTH('오늘은 월요일') FROM DUAL; --7글자
SELECT INSTR('ㅇㅇ교육', 'ㅇㅇ'), INSTR('ㅇㅇ교육', '교') FROM DUAL;
SELECT INSTR('ㅇㅇIT교육센터 ㅇㅇ교육 ㅇㅇ개발부 ㅇㅇ교육본사', 'ㅇㅇ'),
INSTR('ㅇㅇIT교육센터 ㅇㅇ교육 ㅇㅇ개발부 ㅇㅇ교육본사', 'ㅇㅇ',2),
INSTR('ㅇㅇIT교육센터 ㅇㅇ교육 ㅇㅇ개발부 ㅇㅇ교육본사', 'ㅇㅇ',2,2),
INSTR('ㅇㅇIT교육센터 ㅇㅇ교육 ㅇㅇ개발부 ㅇㅇ교육본사', 'ㅇㅇ',-2,2)
FROM DUAL;
SELECT LPAD('오늘 월요일', 14, 'X'),
RPAD('오늘 월요일', 14, 'X')
FROM DUAL;
SELECT ' 아자',
LTRIM(' 아자잣'),
RTRIM('월요병은 무서워 '),
LTRIM('AAABBBCCCC화이팅!', 'ABC') -- or
FROM DUAL;
SELECT TRIM(' hi ') AS A,
TRIM (LEADING 'z' FROM 'zzzzzhi') AS B
FROM DUAL;
SELECT SUBSTR('오늘 너무너무 행복해 DB가 너무 쉽잖아', 13),
SUBSTR('오늘 너무너무 행복해 DB가 너무 쉽잖아', 13, 2),
SUBSTR('오늘 너무너무 행복해 DB가 너무 쉽잖아', -3, 3),
SUBSTR('오늘 너무너무 행복해 DB가 너무 쉽잖아', INSTR('오늘 너무너무 행복해 DB가 너무 쉽잖아', '행'),3)
FROM DUAL;

UPPER('Welcome to oRACLE word'),
LOWER('Welcome to oRACLE word'),
INITCAP('Welcome to oRACLE word')

SELECT CONCAT('이번시간 끝나면', ' 점심시간'),
'이번시간 끝나면' || ' 점심시간'
FROM DUAL;

SELECT 'DB는 너무 어려워', REPLACE('DB는 너무 어려워', '어려워', '쉽다')
FROM DUAL;

SELECT EMAIL, REVERSE(EMAIL)
FROM EMPLOYEE;

SELECT ABS(10), ABS(-10)
FROM DUAL;
--10, 10
--나머지 값을 구하는 함수: MOD() -> JAVA % 연산자
SELECT MOD(3, 2) FROM DUAL;
--1
SELECT 125.567, ROUND(125.567), ROUND(125.367), ROUND(125.567, 2), ROUND(125.567, 3)
FROM DUAL

SELECT 125.123, CEIL(125.123), CEIL(125.83)
FROM DUAL

SELECT 125.123, FLOOR(125.123), FLOOR(125.83)
FROM DUAL

SELECT 125.123, TRUNC(125.123), TRUNC(125.123, 2)
FROM DUAL;

SELECT DBMS_RANDOM.VALUE(),
DBMS_RANDOM.VALUE()*10,
FLOOR(DBMS_RANDOM.VALUE()),
FLOOR(DBMS_RANDOM.VALUE()*10)
FROM DUAL;
SELECT DBMS_RANDOM.STRING('X', 10),
DBMS_RANDOM.STRING('P', 10),
DBMS_RANDOM.STRING('U', 10),
DBMS_RANDOM.STRING('L', 10)
FROM DUAL;

SELECT SYSDATE, SYSTIMESTAMP
FROM DUAL;

-- +, -: 날짜의 일수가 증가하거나 차감되는 연산처리
SELECT SYSDATE, SYSDATE + 1, SYSDATE - 30
FROM DUAL;

SELECT NEXT_DAY(SYSDATE, '월')
FROM DUAL;
SELECT LAST_DAY(SYSDATE), LAST_DAY('00/04/04')
FROM DUAL;

SELECT SYSDATE, ADD_MONTHS(SYSDATE, 10)
FROM DUAL;

SELECT FLOOR(MONTHS_BETWEEN(SYSDATE, '00/01/01')) FROM DUAL;
--EXTRACT(YEAR FROM 날짜): 년도를 숫자로 변환
--EXTRACT(MONTH FROM 날짜): 월을 숫자로 변환
--EXTRACT(DATE FROM 날짜): 일을 숫자로 변환
SELECT EXTRACT(YEAR FROM SYSDATE) AS YEAR,
EXTRACT(MONTH FROM SYSDATE)AS MONTH,
EXTRACT(DAY FROM SYSDATE) AS DAY
FROM DUAL;

SELECT EMP_NAME, HIRE_DATE, EXTRACT(MONTH FROM HIRE_DATE) AS 입사12월
FROM EMPLOYEE
WHERE EXTRACT(MONTH FROM HIRE_DATE) = 12;
SELECT 1234567,
TO_CHAR(1234567,'000,000,000'),
TO_CHAR(1234567,'999,999,999')
FROM DUAL;

SELECT 180.5,
TO_CHAR(180.5, 'FM000'),
TO_CHAR(180.5, 'FM000,000.00'),
TO_CHAR(180.5, 'FM999.99')
FROM DUAL;

SELECT SYSDATE,
TO_CHAR(SYSDATE, 'YYYY.MM.DD'),
TO_CHAR(SYSDATE, 'YYYY-MM-DD'),
--, . 같은 경우 자동으로 변경이 되지만 한글은 아니어서 "" 해줘야함
TO_CHAR(SYSDATE, 'YYYY"년" MM"월" DD"일"')
FROM DUAL;

-- 사원의 급여를 화폐단위로 포함하고, 단위별로 , 로 구분해서 출력
-- 입사일은 0000년00월00일로 출력
-- 사원명 급여 입사일
SELECT EMP_NAME as 사원명,
TO_CHAR(SALARY, 'L999,999,999') as 월급,
TO_CHAR(HIRE_DATE, 'YYYY"년" MM"월" DD"일"') as 입사일
FROM EMPLOYEE;

SELECT 1000 + '1000' FROM DUAL;
SELECT 1000 + '1,000' FROM DUAL; --X
SELECT 1000 + TO_NUMBER('1,000', '9,999') FROM DUAL;
SELECT TO_DATE('99/01/08', 'YY/MM/DD') - 10,
TO_DATE('99-05-05', 'YY-MM-DD'),
TO_DATE(250227, 'YYMMDD'),
TO_DATE(TO_CHAR(000227,'000000'), 'YYMMDD')
FROM DUAL;

--NULL 처리 함수
--NVL(컬럼명, 대체값) 지정된 컬럼에 NULL이 있으면 대체값으로 출력하는 함수
SELECT EMP_NAME,
BONUS,
NVL(BONUS, 0),
NVL(DEPT_CODE, '인턴')
FROM EMPLOYEE;
--NVL2(): NULL값일 때 출력할 값, NULL이 아닐 때 출력할 값을 설정하는 함수
SELECT EMP_NAME, DEPT_CODE, NVL2(DEPT_CODE, '정규직', '인턴') AS DIV
FROM EMPLOYEE;


SELECT EMP_NAME,
DECODE (DEPT_CODE, 'D9', '총무부', 'D6', '영업부') as 부서명
FROM EMPLOYEE;
--CASE
-- WHEN 조건문
-- THEN 출력할 값
-- WHEN 조건문2
-- THEN 출력할 값2
--RR로 연도 출력
--현재 입력 계산
--00~49 00~49 현세기
--00~49 50~00 전세기
--50~99 00~49 다음세기
--50~99 50~99 현세기
--
SELECT
EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM TO_DATE(SUBSTR(EMP_NO, 1, 2),'RR')) AS 나이,
EXTRACT(YEAR FROM TO_DATE(SUBSTR(EMP_NO, 1, 2),'YY')),
EXTRACT(YEAR FROM TO_DATE(SUBSTR(EMP_NO, 1, 2),'RR')),
EXTRACT(YEAR FROM SYSDATE) -
(SUBSTR(EMP_NO, 1, 2) +
CASE
WHEN SUBSTR(EMP_NO, 8, 1) IN ('1','2')
THEN 1900
WHEN SUBSTR(EMP_NO, 8, 1) IN ('3', '4')
THEN 2000
END) as age
FROM EMPLOYEE;

--그룹 함수의 결과는 한개 ROW 출력
--SELECT문에서 그룹함수를 사용하면 컬럼을 선택하는 것이 제한된다
--합계, 평균, ROW 갯수, 최댓값, 최솟값
--SUM(컬럼): 컬럼값의 총 합계를 조회
--AVG(컬럼): 컬럼값의 평균을 조회
--COUNT(컬럼):ROW수를 조회 * 컬럼값이 NULL인 ROW제외
--MAX(컬럼): 컬럼값의 최댓값을 조회
--MIN(컬럼): 컬럼값의 최솟값을 조회
--D5 D6 D7 사원수 급여합계 평균 조회
SELECT COUNT(*), SUM(SALARY), AVG(SALARY)
FROM EMPLOYEE
WHERE DEPT_CODE IN('D6', 'D7', 'D5');
--최고 급여 받는 사원
--그룹 함수는 where절에 사용할 수 없다
--사용하려면 다른 구문을 사용해야함
SELECT *
FROM EMPLOYEE
WHERE MAX(SALARY); --X
--GROUP BY 절 이용
--동일한 컬럼 값을 묶어주는 기능
--SELECT 컬럼명
--FROM TABLENAME
--[WHERE 조건문]
--[GROUP BY 컬럼명[,컬럼명,컬럼명..]]
--[HAVING 조건문(그룹함수의 결과로 조건문생성)]
--부서별 급여합계 조회
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
SELECT JOB_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY JOB_CODE
HAVING COUNT(*) >= 3;
SELECT MANAGER_ID, COUNT(*)
FROM EMPLOYEE
GROUP BY MANAGER_ID
HAVING COUNT(MANAGER_ID) >= 2;