0826 DB

yookyungmin·2022년 8월 26일
0

select * from employee where emp_name like '%해술';

--(function) nvl ex) 부서코드가 null값일떄만 인턴이 반환
select emp_id, emp_name, nvl(dept_code, '인턴') from employee ;

--함수(function)
--length : 인자로 전달된 데이터의 길이값을 반환하는 함수

select length('hello oracle')||'글자' 글자길이 from dual;

select length('한글도됩니다')||'글자' 글자길이 from dual;

-- lengthb : 인자로 전달된 데이터의 바이트수를 반환하는 함수

select lengthb('한글도됩니다')||'바이트' 글자길이 from dual;
select lengthb('한글도됩니다')||'바이트' 글자길이 from dual; -- 오라클 한글 한글자 3바이트
select lengthb('hello oracleㅣ')||'바이트' 글자길이 from dual;

--instr 문자열 내에서 문자열 검색하여 위치를 반환하는 기능
select instr('Hello Oracle Hi high','H', 1, 2 ) from dual; -- H를 찾을건데 첫번째 위치에서 두번쨰 위치까지 거리
select instr('Hello Oracle Hi High','H', 1, 3 ) from dual; -- H를 찾을건데 첫번째 위치에서 세번째 위치까지 거리 못찾으면 0반환

--substr : 문자열 내에서 문자열을 추출해내는 기능
select substr('Hello World of Oracle', 7, '5') from dual; --7번쨰 위치에서 5글자 추출

select substr('Hello World of Oracle', 13, '2') from dual; --7번쨰 위치에서 2글자 추출

--employee테이블에서 직원들의 사번 및 이름 성만 출력해보세요
select emp_id 사원번호, substr(emp_name, 1,1) 성, substr(emp_name, 2, '2') 이름 from employee;

select distinct substr(emp_name, 1,1) 성, substr(emp_name, 2, '2') 이름 from employee; --distinct는 중복제거인데 컬럼 한개만 적용

--quiz
-- substr(emp_no, 8, 1) 8번째 에서 첫글자까지
select emp_id, emp_name, substr(emp_no, 1, 8)||'**' 주민번호 from employee where substr(emp_no, 8, 1) in ('1', '3');

-- ABS : 절대값
select abs(-1) from dual;

--MOD : 나머지를 구하는 함수
SELECT MOD(5,1) FROM DUAL;

--ROUND : 반올림 함수
SELECT ROUND(123.456) FROM DUAL;

SELECT ROUND(123.456, 3) FROM DUAL;
SELECT ROUND(123.456, 2) FROM DUAL;
SELECT ROUND(123.456, 1) FROM DUAL; --소수점 첫번쨰 자리반올림
SELECT ROUND(123.556, 0) FROM DUAL;

SELECT ROUND(123.556, -1) FROM DUAL;
SELECT ROUND(123.556, -2) FROM DUAL;

--FLOOR: 버림함수
SELECT FLOOR(123.456) FROM dual;

--TRUNC : 지정위치에서 버림 함수 반올림 없이
SELECT TRUNC(123.456, 1) from dual;
SELECT TRUNC(123.456, 2) from dual;
SELECT TRUNC(123.456, 3) from dual;

-- CEIL : 올림함수
select ceil(123.456) from dual;


--날짜 관련 함수
-- sysdate : 현재 날짜 + 현재시간을 가지는 값 반환
-- 단순 출력에서는 시간까지는 눈에 보이지 않지만 내부적인 값은 존재함
select sysdate from dual;

--months_between
--인자로 전달 된 두날짜 사이의 개월수를 반환하는 함수

select emp_name, months_between(sysdate, hire_date) from employee;

--add_months
-- 첫번쨰 인자 날짜에, 두번쨰 인자 숫자 개월수를 더하여 반환

select emp_name, add_months(hire_date, 6)from employee; -- 고용날짜 + 6개월
select add_months(sysdate, 8) from dual; -- 현재날짜+8개월

--next_day
--인자로 전달받은 날짜에, 인자로 전달받은 요일중 가장 가까운 다음 요일의 날짜를 반환
select next_Day(sysdate, '목') from dual; --현재 날짜 기준으로 가까운 목요일의 요일
select next_Day(hire_date, '수') from employee; -- 고용날짜기준 가까운 수요일의 요일

--last_day
--인자로 전달받은 날짜가 속해있는 달의 가장 마지막일 날짜를 반환
select last_day(sysdate) from dual;

--퀴즈 다음달 마지막 날짜를 구하세요
select last_Day(add_months(sysdate, 1)) from dual;

--extract
--날짜값으로부터 년/월/일 값을 독립적으로 추출하여 반환
select extract(year from sysdate) from dual; --현재날짜 년만 출력
select extract(month from sysdate) from dual;
select extract(day from sysdate) from dual;

--퀴즈:
--employe 테이블 사원의 이름 입사일 년차를 출력하세요
--(조건1, 입사일은 출력형태를 yyyy년 m월 D일 형태로 출력하세요.)
--(조건2. 년차 출력은 소수점이 발생할 경우 올림처리하여 출력할것(28.144-> 29년차)
--(조건3 입사일 기준 오름차순 정렬 출력)

select emp_name 이름,
extract(year from hire_date)||'년'|| extract(month from hire_Date)||'월'||extract(day from hire_Date)||'일' 입사일,
ceil((sysdate-hire_Date)/365)||'년' 년차 from employee order by 2;

--형변환 함수
--to char (숫자 또는 날짜를 문자열로)
select to_char(sysdate,'yyyy/mm/dd hh:mi:ss') from dual; --
select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual; -- 24시 단위로 날짜
select to_char(sysdate,'yyyy"년"mm"월"dd"일" hh24"시"mi"분"ss"초" (Dy)') from dual;

--quiz --
--employee 테이블에서 사원명 고요일을 출력하세요
--조건, 고용일은(1990/02/01(화)) 과 같은 형태로 출력해주세요
select emp_name, to_Char(hire_Date, 'yyyy/mm/dd(dy) ') from employee;

select to_Char(1000000, 'L999,999,999') 숫자표현 from dual; -- 1,000,000

--select to_char(1000000,'L999, 999, 999') 숫자표현 from dual; 자동? 인식
select emp_id, emp_name, to_char(salary, 'L999,999,999') from employee;

--to_Date
--숫자 또는 문자열을 날짜로 변환
--문자열->날짜
select to_Date(20000101, 'yyyymmdd') from dual;

--숫자 -> 날짜
select to_Date(12012000, 'mmddyyyy') from dual;

--1901년 표현하고 싶은데 앞에 19는 어떻게 나타낼 수 있나요?
select to_Date(19010101, 'yyyymmdd') from dual;
select to_char(to_date(19010101, 'yyyymmdd'), 'yyyy mm dd') from dual;

-- 2013 4 8 일은 무슨 요일일까요?
select to_char(to_date(20130408, 'yyyymmdd'), 'yyyy"년"mm"월"dd"일"(dy)') from dual;
select to_char(to_date(20130408, 'yyyymmdd'), 'day') from dual;
select to_char(to_date(20130408, 'yyyymmdd'), 'yyyy/mm/dd/(dy)') from dual;

0개의 댓글