[문제18]
주민번호 뒷6자리부분을 아래화면과 같이 출력해주세요.
| 주민번호_1 | 주민번호_2 |
|---|---|
| 210101-1234567 | 210101-1****** |
<풀이>
SELECT
'210101-1234567' AS 주민번호_1,
rpad(substr('210101-1234567', 1,instr('210101-1234567','-')+1), length('210101-1234567'), '*') AS 주민번호_2
FROM
dual;
[문제19]
employees(사원) 테이블에서 일요일에 입사한
사원의 정보를 조회하세요.
<풀이>
SELECT *
FROM hr.employees
WHERE to_char(hire_date,'d') = '1';
[문제20]
오늘 날짜를 "2024년 6월 13일 목요일" 출력해주세요.
SELECT to_char(sysdate,'yyyy"년" fmmm"월" dd"일" day')
<풀이>
SELECT
to_char(sysdate, 'fmyyyy"년"mm"월"dd"일" day')
FROM
dual;
[문제21]
사원의 employees(사원)테이블에 있는 last_name,hire_date 및
근무 6 개월 후 첫번째 월요일에 해당하는 급여 협상 날짜를 표시합니다.
열 레이블을 REVIEW 로 지정합니다.
날짜는 "월요일, the Second of 4, 2007"과 유사한 형식으로 나타나도록 지정합니다.
<풀이>
SELECT
last_name,
hire_date,
to_char(next_day(add_months(hire_date, 6), '월요일'), 'day,"the" Ddspth "of" fmmm, yyyy ') AS review
--Ddspth로 입력시 첫글자만 대문자로 표시
FROM
hr.employees;
- char(문자형)을 number(숫자형)으로 변환하는 함수
단, 숫자 문자일 경우에만 가능하다.- to_number(문자(숫자), 숫자모델요소(생략가능))
SELECT
to_number('1','9') + 1,
to_number('200') + 1
FROM
dual;
[문제22]
짝수달에 입사한 사원들의 정보를 출력해주세요.
<풀이>
SELECT
*
FROM
hr.employees
WHERE
mod(to_number(to_char(hire_date, 'fmmm')), 2) = 0
ORDER BY
6;
[문제23]
2006년도 홀수달에 입사한 사원들의 정보를 출력해주세요.
<풀이>
SELECT
*
FROM
hr.employees
WHERE mod(to_number(to_char(hire_date, 'fmmm')), 2) = 1
AND to_number(to_char(hire_date, 'yyyy')) = 2006
ORDER BY 6;
<다른풀이>
SELECT
*
FROM
hr.employees
WHERE mod(to_number(to_char(hire_date, 'fmmm')), 2) = 1
AND hire_date BETWEEN to_date('2006/01/01','yyyy/mm/dd') AND to_date('2006/12/31','yyyy/mm/dd')
-- 현재 접속 세션 날짜 포맷에 맞게 작성 한 경우에만 암시적으로 DATE 타입으로 변경
-- 해당 접속세션 확인 select * from nls_session_parameters;
ORDER BY 6;
- char(문자(날짜))를 date(날짜형)으로 변환하는 함수
- to_date(문자(날짜), 날짜 모델요소)
- ❗기본값은 해당 날짜의 0시 00분 00초로 설정
SELECT *
FROM hr.employees
WHERE hire_date BETWEEN to_date('2006/01/01','yyyy/mm/dd') AND to_date('2006/12/31','yyyy/mm/dd')
형 변환시 기준 컬럼값을 변형 하지 말고 비교 대상을 형 변환해주도록 하자. (인덱스가 걸려 있을 경우 인덱스를 수행하지 못함)
- yy - 현재 년도의 세기를 반영 ex) 2095-10-27
- rr - 2000년 부터는 표기법을 자동화로 변경해 준다.
SELECT
to_char(to_date('95-10-27','yy-mm-dd'),'yyyy-mm-dd') as yy타입,
to_char(to_date('95-10-27','rr-mm-dd'),'yyyy-mm-dd') as rr타입
FROM
dual;

| rr타입 | 데이터 입력 연도(0~49) | 데이터 입력 연도(50~99) |
|---|---|---|
| 현재연도(0~49) | 반환날짜는 현재 세기를 반영 | 반환날짜는 이전 세기를 반영 |
| 현재연도(50~99) | 반환날짜는 이후 세기를 반영 | 반환날짜는 현재 세기를 반영 |
- NULL은 사용할 수 없거나, 할당되지 않았거나, 알수 없거나, 적용할 수 없는값, 계산할 수 없는값, 결측치(값)
- NULL은 0, 공백이 아니다
- NULL은 char(문자형) 이다
- null값을 실제값으로 리턴하는 함수
- NVL(컬럼, 실제값)
- NVL 함수는 입력되는 인수값들의 데이터타입이 일치해야 한다.
SELECT
nvl(commission_pct,0),
nvl(to_char(commission_pct),'no comm')
--to_char를 이용하여 문자타입으로 변환시켜 타입을 통일함
FROM hr.employees;
- 첫번째 exp1이 null이 아니면 exp2 수행하고, exp1이 null이면 exp3를 수행한다.
- exp2, exp3 데이터 타입이 일치해야 한다.
SELECT
nvl2(commission_pct,(salary * 12) +(salary * 12 * commission_pct), salary * 12),
nvl2(commission_pct, to_char(salary*12),'no comm')
--to_char를 이용하여 exp2,exp3의 형을 맞춰줌
FROM
hr.employees;
- exp1이 null이면 exp2를 수행하고, exp2도 null이면 exp3를 수행, exp3도 null이면 다음 표현수를 수행한다.
- 즉 null이 발생하지 않을때 까지 인수(표현식)을 수행하는 함수
- 두 표현식(인수)을 비교해서 같으면 null을 리턴하고 같지 않으면 exp1을 리턴하는 함수
SELECT
employee_id,
length(last_name),
length(first_name),
nullif(length(last_name),length(first_name))
FROM hr.employees;

- SQL에서는 IF문을 사용할 수 없다.
- decode함수, case 표현식(9i)
- 기준값과 비교값을 같다(=) 비교 연산자만 사용한다.
decode(기준값,
---------비교값1,참값1,
---------비교값2,참값2,
---------.....
---------기본값)
- decode 함수의 3번째 인수의 data type이 4번째 인수에 data_type에 영향을 준다.
SELECT
employee_id,
salary,
job_id,
decode(job_id, 'IT_PROG', salary * 1.1, 'ST_CLERK', salary * 1.2,
'SA_REP', salary * 1.3, salary) as revised_salary
FROM
hr.employees;
- 기준값과 비교값에 대해서 모든 비교 연산자를 사용 할수 있다.
case when 기준값 비교연산자 비교값 then 참값1
------when 기준값 비교연산자 비교값 then 참값2
------...
------else 기본값 end
SELECT
employee_id,
salary,
job_id,
case when job_id = 'IT_PROG' then salary * 1.1
when job_id = 'ST_CLERK' then salary * 1.2
when job_id = 'SA_REP' then salary * 1.3
else salary end as revised_salary
FROM hr.employees;
[4일차 후기]
오늘로 국비교육을 시작한지 4일차 인데 몸도 이제 슬슬 수업시간에 적응을 해가는 걸 느끼고 있다. 그리고 문득 깨닫게 되는데 역시 사람은 자기가 좋아하는걸 해야 한다고, 전 직장을 다닐때는 그렇게 안가던 시간이 좋아하고 하고 싶은 걸 배우니 8시간이 이렇게나 빨리 지나가고 있었다. 그렇다고 수업 시간 내내 진도만 나갔으면 머리가 못 버틸수도 있었겠지만 강사님의 사담을 곁들이니 더 재밌는거 같다ㅎㅎ 오늘은 형변환 함수, NULL 관련 함수, 조건제어문까지 배워보았는데 그동안 알았다고 생각한 내용들 이었는데 역시 전문 수업으로 들어서 그런지 디테일이 상당해 새롭게 배우는 부분들이 많았다. 5개월의 교육기간중 4일차 밖에 안됬는데도 이렇게 배우는 부분들이 많은데 5개월을 온전히 버텨 지식과 스킬이 축적된 수료후의 내 모습이 궁금해 지기 시작했다.