select
예제 3개 풀어보기
-- 직원 테이블(emp)에서 이름(ename)과 직무(job)을 "SMITH는 CLERK입니다." 형식으로 출력.
select ename || '는' || job || '입니다' from emp;
-- 직원 테이블(emp)에서 직무(job)을 검색
select job from emp;
-- 위 결과에서 중복되지 않는 job 값들만 출력
select DISTINCT job from emp;
where
-- 테이블에서 데이터 검색
-- (1) projection: 테이블에서 원하는 컬럼들을 선택.
-- (2) selection: 테이블에서 조건을 만족하는 레코드(행, row)들을 검색.
-- select 컬럼, ... from 테이블 where 조건식 order by 정렬컬럼 asc/desc;
-- 비교 연산자: =, !=, >, >=, <, <=, is null, is not null, ....
-- 논리 연산자: and, or, not
예제 문제)
-- 직원 테이블에서 10번 부서에 근무하는 직원들의 부서번호, 사번, 이름을 출력.
select deptno,empno,ename from emp where(deptno = 10);
-- 직원 테이블에서 수당(comm)이 null이 아닌 직원들의 사번, 이름, 수당을 검색.
-- 출력 순서는 이름의 오름차순으로 정렬해서
select empno, ename, comm from emp where(comm is not null) order by ename;
-- 직원 테이블에서 급여(sal)가 2000 이상인 직원들의 이름과 급여를 검색
-- 출력 순서는 급여의 내림차순으로 정렬해서.
select ename, sal from emp where(sal >= 2000) order by sal desc;
-- 직원 테이블에서 급여가 2000 이상 3000 이하인 직원들의 사번, 이름, 직책, 급여를 검색
-- 급여의 내림차순 출력.
select empno, ename, job, sal from emp where (2000 <= sal and sal <= 3000) order by sal desc;
조건문에 between A and B 문법을 사용할 수도 있다.
select empno, ename, job, sal from emp where (sal between 2000 and 3000) order by sal desc;
-- 직원 테이블에서 10번 또는 20번 부서에서 근무하는 직원들의 부서번호, 이름, 급여를 검색.
-- 출력 순서는 (1) 부서 번호, (2) 이름 오름차순 정렬.
select deptno,ename,sal from emp where (deptno = 10 or deptno = 20) order by deptno,ename;
조건문에 in (비교하는 값 나열) 문법을 사용해서 or 비교연산자를 대체할 수도 있다.
select deptno,ename,sal from emp where (deptno in (10, 20)) order by deptno,ename;
-- 직원 테이블에서 직무가 'CLERK'인 직원들의 직무, 이름, 급여를 출력.
-- 이름 오름차순 순서로 출력
select job,ename,sal from emp where (job = 'CLERK') order by ename;
-- 직원 테이블에서 직무가 'CLERK' 또는 'MANAGER'인 직원들의 직무, 이름, 급여를 검색.
-- 출력 순서 (1) 직무 (2) 급여 오름차순 정렬.
select job,ename,sal from emp where (job ='CLERK' or job ='MANAGER') order by job,sal;
select job,ename,sal from emp where (job in ('CLERK','MANAGER')) order by job,sal;
--직원 테이블에서 20번 부서에서 근무하는 CLERK의 모든 정보를 검색
select * from emp where (deptno = 20 and job = 'CLERK');
-- 직원 테이블에서 20번 부서에서 근무하거나 또는 직무가 CLERK인 직원들의 모든 정보를 검색
select * from emp where (deptno = 20 or job = 'CLERK');
-- 직원 테이블에서 CLERK, ANALYST, MANAGER가 아닌 직원들의 사번, 이름, 직무, 급여를 검색
-- 사번 오름차순 정렬.
select empno, ename, job, sal from emp where (job != 'CLERK' and job !='ANALYST' and job != 'MANAGER')
order by empno;
select empno, ename, job, sal from emp where not (job = 'CLERK' or job ='ANALYST' or job = 'MANAGER')
order by empno;
select empno, ename, job, sal from emp where job not in('CLERK','ANALYST','MANAGER')
order by empno;
-- 숫자뿐 만 아니라 문자열(varchar2), 날짜(date,timestamp) 타입들도 대소 비교가 가능.
-- 직원 테이블의 모든 레코드를 입사일의 오름차순으로 출력.
select * from emp order by hiredate;
-- '1987/01/01'을 포함해서 그 이후에 입사한 사원들의 레코드(모든 칼럼)을 검색.
-- 입사일 오름차순으로 출력.
select * from emp where ('1987/01/01'<= hiredate) order by hiredate;
-- 문자열 타입과 날짜 타입을 같은 타입으로 변환 후에 대소 비교가 이루어짐.
-- 특정 문자열로 시작하거나, 특정 문자열이 포함된 값을 찾는 query.
-- 'A'로 시작하는 이름을 갖는 직원들의 이름을 오름차순으로 출력.
오라클 연습계정을 통해 연습해보기
ID = hr / Pw = hr
-- hr 계정의 employees 테이블 사용
-- 직원 이름을 출력할 때는 First/Last Name을 이어서 출력할 수 있도록(|| 연산자 사용)
-- Ex 1. employees 테이블의 구조(컬럼 이름, NULL 여부, 데이터 타입) 확인
desc employees;
-- Ex 2. 성(last_name)이 'J'로 시작하는 직원들의 사번, 이름을 출력
select employee_id, first_name || ' ' || last_name as name
from employees
where last_name like 'J%';
-- Ex 3. 성(last_name)에 'E' 또는 'e'가 포함된 직원들의 사번, 이름을 출력
-- 오라클 문자열 함수 upper(컬럼), lower(컬럼)
select employee_id, first_name || ' ' || last_name as name
from employees
where last_name like '%E%' or last_name like '%e%';
-- 위 문장의 결과와 비교: in을 사용하는 경우.
select employee_id, first_name || ' ' || last_name as name
from employees
where last_name in ('%E%', '%e%');
-- last_name = '%E%' or last_name = '%e%'
select employee_id, first_name || ' ' || last_name as name
from employees
where upper(last_name) like '%E%';
-- Ex 4. 전화번호가 '011'로 시작하는 직원들의 사번, 이름, 전화번호를 출력
select employee_id, first_name || ' ' || last_name as name, phone_number
from employees
where phone_number like '011%';
-- Ex 5. 급여가 3000 이상 5000 이하인 직원들의 사번, 이름, 급여를 검색
-- 급여의 내림차순 출력
select employee_id, first_name || ' ' || last_name as name, salary
from employees
where (salary between 3000 and 5000)
order by salary;
-- Ex 6. 수당이 있는(not null) 직원들의 사번, 이름, 급여, 연봉을 검색
-- commission_pct 컬럼: 수당의 퍼센티지(percentage). 수당이 12개월 급여의 몇 %인 지.
-- 수당 포함 연봉 = 월급 * 12 + 특별 수당
-- = 월급 * 12 + (월급 * 12) * percentage
-- = (월급 * 12) * (1 + percentage)
select employee_id, first_name || ' ' || last_name as name, salary,
((salary * 12) * (1 + commission_pct)) as year_salary
from employees
where commission_pct is not null;