https://skylarcoding.tistory.com/112#google_vignette
이씨 성을 가진 사원을 찾기에 실패한 예제
select *
from emp
where ename = '이';
이씨 성을 가진 사원 찾기
select *
from emp
where ename like '%성%';
이름이 두 번째 글자가 "성"이고, 그 뒤는 무엇이 오든 관계없는 사원 출력하기
SELECT *
FROM emp
WHERE ename LIKE '_성%';
이름에 "성"을 포함하지 않은 사원 출력하기
SELECT *
FROM emp
WHERE ename NOT LIKE '%성%';
급여를 적게 받는 사원부터 많이 받는 사원 순으로 출력하기
select *
from emp
order by sal asc;
asc를 생략한 채 order by 사용하기
select *
from emp
order by sal;
급여를 많이 받는 사원부터 적게 받는 사원 순으로 순차적으로 출력하기
select * from emp
order by sal desc;
사원의 이름을 기준으로, 사전에 먼저 실린 순서대로 출력하기
select *
from emp
order by ename;
가장 최근에 입사한 사람부터 출력하기
select *
from emp
order by hiredate desc;
selct *
from emp
order by hiredate desc, ename asc;
ace/ace에서
1.
salary가 10000달러 이상이며 job_id에 문자열 'MAN'이 포함된 사원의 last_name, salary, job_id 출력
salary가 10000달러 이상이거나 job_id에 문자열 'MAN'이 포함된 사원의 lst_name, salary, job_id 출력
job_id가 IT_PROG, ST_CLERK, SA_REP에 속하지 않은 사원의 last_name, job_id 출력
commission_pct가 null이 아닌 사원들의 lastname, commission_pct 출력
job_id가 ST_CLERK 또는 SA_REP이면서 급여가 2500, 3500, 7000이 아닌 모든 사원의 last_name, job_id, salary 출력
그룹 활동과 싱글 활동을 하는 가수 이름 출력하기
select *
from group_star
union
select *
from single_star;
그룹 활동과 싱글 활동을 하는 가수 이름을 중복하여 출력하기
select *
from group_star
union all
select *
from single_star
DEPARTMENT_ID
10
20
60
80
90
110
190
7 rows selected.
풀이코드
select department_id
from employees
where job_id not like '%st_clerk%';
정답코드
select department_id from departments
minus
select distinct department_id from employees
where job_id = '%st_clerk%';
@결과
COUNTR COUNTRY_NAME
DE Germany
JOB_ID DEPARTMENT_ID A_DUMMY
AD_ASST 10 1
ST_CLERK 50 2
ST_MAN 50 2
MK_MAN 20 3
MK_REP 20 3
풀이코드
select job_id, department_id
from job_history
where department_id = 10 or department_id = 50 or department_id = 20
order by (
CASE department_id
WHEN 10 THEN 1
WHEN 50 THEN 2
WHEN 20 THEN 3
ELSE 4
END
);
정답코드
select job_id, department_id, 1 a_dummy
from employees
where department_id = 10
union
select job_id, department_id, 2 a_dummy
from employees
where department_id = 50
union
select job_id, department_id, 3 a_dummy
from employees
where department_id = 20
order by a_dummy;
EMPLOYEE_ID JOB_ID
176 SA_REP
200 AD_ASST
정답코드
select last_name, department_id, nvl(null,' ') as department_name
from employees
union
select department_id, department_name, nvl(null,' ') as department_name
from departments;
DUAL 테이블로 1일이 몇 분인지 환산하기
SELECT 24*60
FROM DUAL;
DUAL 테이블 조회하기
SELECT *
FROM DUAL;
현재 날짜 조회하기
SELECT SYSDATE
FROM DUAL;
-10에 대한 절대값을 구하기
select -10, abs(-10)
from dual;
소수점 이하 반올림하기
select 34.5678, floor(34.5678)
from dual;
소수점 이하 반올림하기
select 34.5678, ROUND(34.5678)
from dual;
소수점 이하 두 번째 자리에서 반올림하기
select 34.5678, round(34.5678, 2)
from dual;
일의 자리에서 반올림하기
select 34.5678, round(34.5678, -1)
from dual;
특정 자릿수에서 잘라내기
select trunc(34.5678, 2), trunc(34.5678, -1), trunc(34.5678)
from dual;
select mod (27, 2), mod (27, 5), mod (27, 7)
from dual;
4부터 시작해서 문자 3개를 추출하기
select substr('welcome to oracle', 4, 3)
from dual;
영문자의 문자 수와 바이트 수 구하기
select substr('welcome to oracle', 3, 4),
substrb('welcome to oracle', 3, 4)
from dual;
한글의 문자 수와 바이트 수 구하기
select substr('웰컴투오라클', 4, 3), substrb('웰컴투오라클', 4, 3)
from dual;
문자열 'welcome to oracle'에 'o'의 위치 찾기
select instr('welcome to oracle', 'o')
from dual;
영문자에서 시작 위치와 발견 위치를 지정하여, 문자열에서 문자 한 개의 위치 찾기
select instr('welcome to oracle', 'o', 6, 2)
from daul;
한글에서 시작 위치와 발견 위치를 지정하여 문자열에서 문자 한 개의 위치 찾기
select instr('데이터베이스', '이', 4, 1), instrb('데이터베이스', '이', 4, 1)
from dual;
왼쪽에 특정 기호로 채우기
select lpad('oracle', 20, '#')
from dual;
오른쪽에 특정 기호로 채우기
select rpad('oracle', 20, '#')
from dual;
SELECT to_char(sysdate, 'YYYY/MM/DD, AM HH:MI:SS')
FROM DUAL;
TO_DATE('문자', 'format')
수치 형태의 문자 값의 차를 구하려다 오류가 발생하는 예
SELECT '20,000' - '10,000'
FROM DUAL;
수치 형태의 문자 값의 차 알아보기
SELECT TO_NUMBER('20,000', '99,999')
- TO_NUMBER('10,000', '99,999')
FROM DUAL;
**현재 날짜 알아보기
SELECT to_char(SYSDATE, 'YYYY/MM/DD')
FROM DUAL;
현재 날짜를 기준으로 어제와 내일 날짜 계산하기
SELECT to_char(SYSDATE-1, 'YYYY/MM/DD') 어제,
to_char(SYSDATE, 'YYYY/MM/DD') 오늘,
to_char(SYSDATE+1, 'YYYY/MM/DD') 내일,
FROM DUAL;
특정 날짜를 달을 기준으로 버리기
SELECT to_char(hiredate, 'YYYY/MM/DD') 입사일,
to_char(TRUNC(hiredate, 'MONTH'), 'YYYY/MM/DD') 입사일
FROM emp;
날짜 사이의 개월 수 구하기
SELECT ename, SYSDATE 오늘, to_char(hiredate, 'YYYY/MM/DD') 입사일,
TUNC(MONTH_BETWEEN (SYSDATE, hiredate)) 근무일수
FROM emp;
입사 날짜에 6개월을 추가하기
select ename, to_char(hiredate, 'YYYY/MM/DD') 입사일,
to_char(ADD_MONTHS(hiredate, 6), 'YYYY/MM/DD') "입사 6개월 후"
from emp;
next_day (date, 요일)
입사한 달의 마지막 날을 구하기
select ename, to_char(hiredate, 'YYYY/MM/DD') 입사일,
to_char(LAST_DAY(hiredate), 'YYYY/MM/DD') "마지막 날짜"
from emp;
NVL(expr1, expr2)
NVL(comm, 0)
NVL(hiredate, to_date('2014/5/10', 'YYYY/MM/DD'))
NVL(job, '매니저')
NVL2(expr1, expr2, expr3)
NULLIF(expr1, expr2)
COALESCE(expr-1, expr-2, ..., expr-n)
decode (표현식, 조건1, 결과1,
조건2, 결과2,
조건3, 결과3,
기본결과n
)
select grade
from salgrade;
select ename, decode(mod(empno, 2), 0, '백군'
, 1, '청군'
, '예외') as "팀"
from emp;
select ename, deptno, sal as 올해연봉,
decode(deptno, 10, sal*1.2
, 20, sal*1.1
, sal) as 내년연봉
from emp;
select ename, sal,
decode(ceil(sal/300)-1, 0, 'LOW',
1, 'MID',
2, 'HIGH',
'TOP') as grade
from emp;
select ename, sal,
case ceil(sal/300)-1 when 0 then 'LOW'
when 1 then 'MID'
when 2 then 'HIGH'
else 'TOP'
end as grade
from emp;
select ename, sal,
case when sal <= 300 then 'LOW'
when sal <= 600 then 'MID'
when sal <= 900 then 'HIGH'
else 'TOP'
end as grade
from emp;
case when 조건1 then 결과1
when 조건2 then 결과2
when 조건3 then 결과3
else 결과n
end
사원들의 커미션 총액 출력하기
select sum(comm) as "커미션 총액"
from emp;
최대 급여 구하기
select max(sal)
from emp;
최대 급여와 최대 급여를 받는 사원의 이름 출력하기
select ename, max(sal)
from emp;
커미션을 받은 사원의 수를 구하기
select count(comm) as "커미션 받는 사원의 수"
from emp;
전체 사원의 수와 커미션을 받는 사원의 수를 구하기
select count(*) as "전체 사원의 수",
count(comm) as "커미션 받는 사원 수"
from emp
select 컬럼명, 그룹 함수
from 테이블명
where 조건 (연산자)
group by 컬럼명;
group by 절에 명시하지 않은 컬럼을 select 절에 잘못 사용한 예제
select deptno, ename, avg(sal)
from emp
group by deptno;
부서별 급여 평균이 500 이상인 부서번호와 급여 평균 구하기
select deptno, avg(sal)
from emp
group by deptno
having avg(sal) >= 500;