--dual(더미 테이블)
--출력 결과가 1개일 경우 사용되는 테이블
--1일이 몇분인가?
select 60 * 24
from dept;
select * from dept;
select 60 * 24
from dual;
-- 숫자함수
--절대값(absolute)
select -10, abs(-10)
from dual;
--버림(floor)
select 34.7894, floor(34.7894)
from dual;
--반올림(5이상이면 올림, 5미만 버림) - round
select 34.5678, round(34.5678)
from dual;
select 12.3456, round(12.3456)
from dual;
--자릿수 포함
select 34.5678, round(34.5678, 2) -- 소숫점 이하 둘째짜리 까지(셋째자리에서 반올림)
from dual;
--소숫점 이상
select 34.5678, round(34.5678, -1) -- 소숫점 이상 1번째 (10의 자리까지)
from dual;
--소숫점 이하 버림(자릿수)
--trunc (truncate: 잘라내다)
select trunc(34.5678, 2)
from dual;
-- 나머지(%) : modualr
-- mod(피젯수, 젯수)
select mod(27,2) -- 27을 2로 나눈 나머지
from dual;
--올림 (ceil: 천정)
select ceil(34.5678)
from dual;
-- 문자 함수
-- 대소문자, 첫글자
select 'Welcome to Oracle',
upper('Welcome to Oracle'),
lower('Welcome to Oracle'),
initcap('Welcome to Oracle') -- intiial capitalize
from dual;
-- 문자열 길이
-- length
-- lengthb
select length('Oracle'), length('오라클'),
lengthb('Oracle'), lengthb('오라클')
from dual;
-- 부분 문자열 : 자바-substring(시작위치, 끝위치) -> 오라클-substr(문자열, 시작위치, 갯수)
select substr('Welcome to Oracle', 4, 3)
from dual;
--부분 문자열 - 시작위치를 뒤에서부터 (음수)
select substr('Welcome to Oracle', -4, 3)
from dual;
select substr('월컴투오라클', 4, 3)
from dual; --오라클
--특정 문자의 위치 : indexOf() -> instr(문자열, 문자)
select instr('Welcome to Oracle', 'O')
from dual;
-- 채우기(padding, left padding, right padding) -padding-left, padding-right
-- lpad,rpad
select lpad('Oracle', 20, '#'), rpad('Oracle', 20, '#')
from dual;
-- 주민번호: 011231-1112222
select rpad(substr('011231-1112222', 1, 8), 14, '*')
from dual;
--p151 연습문제
--01. substr함수 이용해 9월에 입사한 사원 출력
select *
from emp
where 09 = substr(hiredate, 4, 2);
--02. substr함수 이용해 2003년에 입사한 사원 출력
select *
from emp
where '2003' = substr(hiredate, 1, 4);
--03. substr함수 이용해 "기"로 끝나는 사원 출력
select *
from emp
where '기' = substr(ename, 3, 1);
--04. 이름의 두번째 글짜에 "동"이 있는 사원 검색(instr 사용)
select *
from emp
where instr(ename, '동', 2, 1) = 2;
select *
from emp
where ename like '_동%';
--형변환 함수 - parseInt(), parseFloat()
-- to_char(), to_date(), to_number()
select sysdate, to_char(sysdate, 'YYYY/MM/DD'), to_char(sysdate, 'YYYY-MM-DD'),
to_char(sysdate, 'YYYY-MM-DD DAY'), to_char(sysdate, 'YYYY-MM-DD DY'),
to_char(sysdate, 'YYYY-MM-DD AM HH:MI:SS'), -- 12시간제
to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') --24시간제
from dual;
--숫자형 문자형으로 변환하기
select 1230000, to_char(1230000), to_char(1230000,'L999,999,999')
from dual;
-- 그룹함수
-- 합계 - sum
-- 급여의 총합
select sum(sal)
from emp;
-- 급여 평균 -소숫점 이하 둘째자리
select round(avg(sal), 2)
from emp;
-- 최대값 - max, 최소값 - min
select max(sal), min(sal)
from emp;
-- 갯수(count)
-- 사원수
select count(*)
from emp;
--직급의 수 -distinct: 중복제거
select count(distinct job)
from emp;
--주의
-- 급여를 가장 많이 받는 사원의 이름과 급여 검색
select ename, sal
from emp
where sal = (select max(sal) from emp); --서브쿼리
select ename, max(sal)
from emp; --안됨 : ename 값은 14개 max(sal)값은 1개 : 갯수 매칭 안됨
--group by 절 -> 그룹함수와 함께 사용
--부서번호, 급여 출력 (부서번호 순으로 정렬)
select deptno, sal
from emp
order by deptno;
select deptno
from emp
group by deptno;
select avg(sal)
from emp
group by deptno;
-- ~별 .. 구하기
select deptno, avg(sal) 급여평균, sum(sal) 급여합계
from emp
group by deptno;
-- 각 부서별 최소급여와 최대급여
select deptno, min(sal), max(sal)
from emp
group by deptno
order by deptno;
--group by에 적용되는 조건 - having
-- 부서별 급여 평균이 500이상인 부서번호와 급여 평균 구하기
select deptno, avg(sal)
from emp
group by deptno
having avg(sal) >= 500;
--급여가 500인 사원의 부서와 급여 구하기
select deptno, sal
from emp
where sal >= 500;
-- 최대 급여가 500을 초과하는 부서에 대해서 최대 급여와 최소 급여 구하기
select deptno, max(sal), min(sal)
from emp
group by deptno
having max(sal) > 500;
--직급이 사원인 사람을 제외하고 급여 총액이 1000이상인 직급별 급여 총액 구하기
select job, sum(sal)
from emp
where job != '사원'
group by job
having sum(sal) >= 1000;
--연습문제
-- 01. 급여 최고액, 최저액, 총액 및 평균급여 구하기
select max(sal), min(sal), sum(sal), avg(sal)
from emp;
-- 02. 담당 업무(job) 유형별로 급여 최고액, 최저액, 총액, 평균급여 구하기
select job, max(sal), min(sal), sum(sal), avg(sal)
from emp
group by job;
-- 03. 담당 업무 별 사원수 출력
select job, count(*)
from emp
group by job;
--04 과장의 수 출력하기
select job, count(*)
from emp
group by job
having job = '과장';
-- 05 급여 최고액, 급여 최저액의 차액 구하기 (별칭 부여)
select max(sal) - min(sal) 차액
from emp;
-- 06 직급별(job) 사원의 최저급여 출력
select job, min(sal)
from emp
group by job;
--07. 부서별 사원수 , 평균 급여 구하기 (소숫점 이하 둘째자리까지)
select deptno, count(*), round(avg(sal), 2)
from emp
group by deptno;
--decode -> switch(deptno) {case, case, default }
--decode (표현식, 경우1, 결과1,
-- 경우2, 결과2,
-- 결과n)
-- 사원명(emp), 부서번호(emp), 부서명(dname)
select * from dept; --부서명
select * from emp; -- 부서번호
select ename, deptno, decode(deptno, 10, '경리부',
20, '인사부',
30, '영업부',
40, '전산부') 부서명
from emp;
-- case ~ end : if ~ else if ~ else
-- case when 조건1 then 결과1
-- when 조건2 then 결과2
-- when 조건3 then 결과3
-- else 결과n
-- end
select ename, deptno, case when deptno = 10 then '경리부'
when deptno = 20 then '인사부'
when deptno = 30 then '영업부'
when deptno = 40 then '전산부'
end 부서명
from emp;
--08 부서명, 지역명, 사원수, 부서내의 모든 사원의 평균급여 출력 -decode 사용
select * from dept;
select * from emp;
select deptno, decode(deptno, 10, '경리부',
20, '인사부',
30, '영업부',
40, '전산부') 부서명, decode(deptno, 10, '서울',
20, '인천',
30, '용인',
40, '수원') 지역명,
count(*) 사원수, round(avg(sal), 2) 평균급여
from emp
group by deptno;
'DATABASE > SQL, PL-SQL' 카테고리의 다른 글
익명 PL/SQL 예제 (0) | 2021.01.16 |
---|---|
오라클 scott 예제 스키마 (0) | 2021.01.16 |
윈도우 10에서 Oracle 11g 설치(express버젼) (0) | 2021.01.16 |
SQL 서브쿼리 예제 (0) | 2020.11.14 |
SQL 조인(JOIN) (0) | 2020.11.14 |
댓글