본문 바로가기
카테고리 없음

22-09-30 오라클 DataBase

by Hunihu 2022. 9. 30.

select

예제 3개 풀어보기

 

BONUS Table

 

DEPT Table

 

EMP Table

 

 

-- 직원 테이블(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;