08/26 DB

yookyungmin·2022년 8월 26일
0

-- or 조건이 너무 많이 사용될 경우 in표현으로 대체 가능
select * from employee where email like '%s%' and dept_code in ('D9','D6', 'D5')
and ('90/01/01' <= hire_Date and hire_date<= '00/12/1') and salary >=2780000;

--0826

-- order by : 데이터 정렬 문법 ~에 의해서 줄을 세우다, 기본 오름차순 , order by salary asc asc가 생략되어있음

select emp_id, emp_name, salary ||'원' 연봉 from employee order by salary; --급여 오름차순
select emp_id 사원번호, emp_name 이름, salary ||'원' 연봉 from employee order by salary desc; --급여 내림차순
select emp_id, emp_name, salary ||'원' 연봉 from employee order by emp_name; --이름 오름차순 가나다순

select * from employee;
desc employee;

select from employee order by DEPT_CODE; --DEPT_CODE 부서코드 오름차순
select
from employee order by DEPT_CODE, JOB_CODE; --DEPT_CODE 부서코드 JOB_CODE 직급코드 기본 오름차순
select from employee order by DEPT_CODE DESC, JOB_CODE DESC; --DEPT_CODE 부서코드 JOB_CODE 직급코드 내림차순
select
from employee order by 6, 7 DESC; -- 컬럼번호로도 ORDER BY 조회 가능 7번 JOB_cODE 내림차순

--floor(실수값) -> 정수
select floor(3.14) from dual;

select emp_name, floor(sysdate-hire_date)||'일' 근속일수 from employee order by 근속일수;

--(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;

==================================================================

--quiz
--1근속일수 5년 이상, 10년 이하인 직원의 이름, 주민번호, 급여, 입사일을 출력하세요
select emp_name 이름, emp_no 주민번호, salary ||'원' 연봉, hire_date 입사일
from employee where sysdate-hire_Date between 3655 and 36510;
--2. 재직중이 아닌 직원의, 근무기간 이름 부서코드를 출력하세요 (ENT_YN컬럼)
select emp_name, dept_Code, floor(ent_date-hire_Date)||'일' 근무기간 from employee where ENT_YN ='Y';

--3 근속년수가 10년 이상의 직원들의 이름, 급여, 근속년수(소수점X) 오름차순으로 정렬
--(급여는 50%인상된 급여로 출력하세요.)
select emp_name 이름, salary+(salary50/100) 급여, floor((sysdate-hire_Date)/365) 근속년수 from employee where (sysdate-hire_Date) > =36510
order by 근속년수;

select emp_name 이름, salary+(salary50/100) 급여, floor((sysdate-hire_Date)/365) 근속년수 from employee where (sysdate-hire_Date) > =36510
order by 3;

select emp_name 이름, salary1.5 급여, floor((sysdate-hire_date)/365) 근속년수 from employee where (sysdate-hire_Date) >=36510 order by 근속년수;
--4 입사일이 99/01/01~ 10/01/01 인 직원중 급여가 2백만원 이하인 사람의
-- 이름, 주민번호, 이메일, 폰번호, 급여를 출력하세요
select emp_name 이름, emp_no 주민번호, email 이메일, phone 번호, salary 급여 from employee
where hire_Date between '99/01/01' and '10/01/01' and salary <=2000000;

--5 급여가 200~300 만원 사이인 여직원중에서 4월 생일자의 이름을, 주민번호, 급여 부서코드 출력
--(주민번호 내림차순)
select emp_name 이름, emp_no 주민번호, dept_code from employee where (salary between 2000000 and 3000000)
and emp_no like '___4%-2%' order by emp_no desc;

select emp_name 이름, emp_no 주민번호, dept_code from employee where (salary between 2000000 and 3000000)
and emp_no like '___2%' and emp_no like '___4%' order by emp_no desc;

select emp_name 사원명, emp_no 주민번호, dept_code from employee where salary between 2000000 and 3000000 and emp_no like '___4%-2%' order by emp_no desc;

select emp_id, emp_name, nvl(dept_code, '인턴') from employee ;
--6 남자직원 중 보너스가 없는 지원의 오늘까지의 근무일을 측정하여 각 1000일마다 급여의 10%를 보너스로 계산하여
--이름, 계산된 금액(특별보너스로 별칭설정) 출력 이름 오름차순 정렬
select emp_name 이름, (floor((sysdate-hire_Date)/1000))(salary0.1) 특별보너스 from employee where emp_no like '%-1%'
and bonus is null order by emp_name;

select emp_name 이름, (floor((sysdate-hire_Date)/1000))(salary0.1) 특별보너스 from employee where emp_no like '__-1%'
and bonus is null order by emp_name;

0개의 댓글