[DB] BETWEEN, IN, LIKE, ASC / DESC
BETWEEN, IN
-- 10번 또는 20번에 근무하는 사람
select ename, deptno from emp where deptno = 10 or deptno = 20;
select ename, deptno from emp where deptno in (10, 20); -- 괄호 안에 개수 제한이 없어 여러 수를 작성할 수 있다.
-- 10번 또는 20번에 근무하지 않는 사람
select ename, deptno from emp where deptno not in (10, 20);
실습 예제
-- 급여가 2000 ~ 3500이고 comm이 null이 아닌 사람 이름, 급여, 입사일, comm
-- 급여가 2000 ~ 4000 사이가 아니거나 comm이 null인 사람의 이름, 급여, comm
-- 업무가 SALESMAN이거나 CLERK이거나 ANALYST인 사람의 사번, 이름, 업무
-- 부서가 10이거나 30번인 사람의 사번, 이름, 부서코드
-- 업무가 MANAGER도 아니고 CLERK도 아닌 사람의 사번, 이름, 업무
-- 81년도에 입사한 사람의 사번, 이름, 입사일
-- 이름이 D와 T사이의 문자로 시작하는 사람의 이름
-- 급여가 1000~3000인 사람의 이름, 급여, 커미션, 연봉(=(급여+comm)*12 comm이 null이면 0) 별칭
-- 이름(업무)은 급여가 xxx이고 연봉은 xxx이다
-- 급여가 2000 ~ 3500이고 comm이 null이 아닌 사람 이름, 급여, 입사일, comm
select ename, sal, hiredate, comm from emp where sal between 2000 and 3500 and comm is not null;
-- 급여가 2000 ~ 4000 사이가 아니거나 comm이 null인 사람의 이름, 급여, comm
select ename, sal, comm from emp where sal not between 2000 and 4000 or comm is null;
-- 업무가 SALESMAN이거나 CLERK이거나 ANALYST인 사람의 사번, 이름, 업무
select empno, ename, job from emp where job in ('SALESMAN','CLERK','ANALYST');
-- 부서가 10이거나 30번인 사람의 사번, 이름, 부서코드
select empno, ename, deptno from emp where deptno in (10,30);
-- 업무가 MANAGER도 아니고 CLERK도 아닌 사람의 사번, 이름, 업무
select empno, ename, job from emp where job not in ('MANAGER','CLERK');
-- 81년도에 입사한 사람의 사번, 이름, 입사일
select empno, ename, hiredate from emp where hiredate between '81/01/01' and '81/12/31';
-- 이름이 D와 T사이의 문자로 시작하는 사람의 이름
select ename from emp where ename between 'D' and 'TZZ';
-- 급여가 1000~3000인 사람의 이름, 급여, 커미션, 연봉(=(급여+comm)*12 comm이 null이면 0) 별칭
select ename, sal, comm, (sal+nvl(comm,0))*12 연봉 from emp where sal between 1000 and 3000;
-- 이름(업무)은 급여가 xxx이고 연봉은 xxx이다
select ename ||'('||job||')'||'은 급여가 ' || sal || '이고 연봉은 ' || (sal+nvl(comm,0))*12 || '이다' from emp;
LIKE
-- 81로 시작하고 나머지는 모두(%)
select empno, ename, hiredate from emp where hiredate like '81%';
select ename from emp where ename like 'S%';
-- %(모두) T % (모두) 글자 수 제한 없음
select ename from emp where ename like '%T%';
-- R로 끝나는 사람
select ename from emp where ename like '%R';
-- 언더바(_)는 아무 글자나 관계없지만 글자수 한개
-- A앞 한글자 즉 두 번째 글자가 A, A 뒤에는 모두 (글자 수 제한 없이 아무 글자 가능)
select ename from emp where ename like '_A%';
select ename from emp where ename like '__R%';
실습 예제
-- 이름이 R로 포함된 사람의 이름
-- 이름이 S로 끝나는 사람의 이름
-- 81년도 입사하고 업무가 MANAGER인 사람의 이름과 업무
-- 이름 두번째 글자가 L인 사람의 이름
-- 이름 끝에서 두번째 글자가 R인 사람의 이름
-- 이름에 TT가 연속에 붙어 있는 사람의 이름
-- 이름에 L이 두개인 사람의 이름
-- 부서코드가 3으로 시작하거나 급여가 2500 ~ 3000인 사람의 이름, 급여, 부서코드
-- 이름의 끝에서 3번째 글자가 N인 사람의 이름
-- 이름이 S로 시작하지 않는 사람의 이름
-- 이름이 R로 포함된 사람의 이름
select ename from emp where ename like '%R%';
-- 이름이 S로 끝나는 사람의 이름
select ename from emp where ename like '%S';
-- 81년도 입사하고 업무가 MANAGER인 사람의 이름과 업무
select ename, job from emp where hiredate like '81%' and job = 'MANAGER';
-- 이름 두번째 글자가 L인 사람의 이름
select ename from emp where ename like '_L%';
-- 이름 끝에서 두번째 글자가 R인 사람의 이름
select ename from emp where ename like '%R_';
-- 이름에 TT가 연속에 붙어 있는 사람의 이름
select ename from emp where ename like '%TT%';
-- 이름에 L이 두개인 사람의 이름
select ename from emp where ename like '%L%L%';
-- 부서코드가 3으로 시작하거나 급여가 2500 ~ 3000인 사람의 이름, 급여, 부서코드
select ename, sal, deptno from emp where deptno like '3%' or sal between 2500 and 3000;
-- 이름의 끝에서 3번째 글자가 N인 사람의 이름
select ename from emp where ename like '%N__';
-- 이름이 S로 시작하지 않는 사람의 이름
select ename from emp where ename not like 'S%';
연산의 우선순위 - AND, OR
우선순위 : NOT > AND > OR
!!! 주의사항 !!!
아래 소스코드의 결과의 차이점 살펴보기
AND 연산이 우선순위가 먼저이므로 첫번째 코드는 job ='MANAGER' and sal >= 2000이 먼저 실행된다.
-- 매니저이면서 급여가 2000이상이거나 salesman인 것을 찾기
select empno, ename, job, sal from emp where job='SALESMAN' or job ='MANAGER' and sal >= 2000;
select empno, ename, job, sal from emp where job='SALESMAN' or (job ='MANAGER' and sal >= 2000);
-- 업무가 salesman이거나 manager 중에서 급여가 2000이상인 것
select empno, ename, job, sal from emp where (job='SALESMAN' or job ='MANAGER') and sal >= 2000;
ASC / DESC
-- select 컬럼,....from 테이블명 where 조건 order by 컬럼명(순서, 식, 별칭); 작은 순(asc 생략), 큰 순서(desc)
select ename 이름, sal from emp order by sal;
select ename 이름, sal from emp order by 이름 desc;
select ename 이름, sal from emp order by 이름 desc;
select ename 이름, sal from emp order by 2 desc;
select ename, sal, comm, sal+nvl(comm,0) from emp order by sal+nvl(comm,0);
-- 부서코드 작은 순으로 정렬, 부서코드가 같으면 급여가 작은 순으로 정렬
select ename, sal, deptno from emp order by deptno, sal;
-- 부서코드 작은 순으로 정렬, 부서코드가 같으면 급여가 큰 순으로 정렬
select ename, sal, deptno from emp order by deptno, sal desc;
-- 부서코드 큰 순으로 정렬, 부서코드가 같으면 급여가 작은 순으로 정렬
select ename, sal, deptno from emp order by deptno desc, sal;
-- 부서코드 큰 순으로 정렬, 부서코드가 같으면 급여가 큰 순으로 정렬
select ename, sal, deptno from emp order by deptno desc, sal desc;
--! 주의사항 ! : oracle에서 null은 큰 수로 인식한다.
select ename, sal, comm from emp order by comm;
select ename, sal, comm from emp order by comm desc;
실습 예제
-- 사번, 이름, 급여 급여 큰 순으로
-- 이름, 업무, 급여, 입사일 업무별(작은 순), 급여 작은 순
-- 이름, 부서코드, 업무, 입사일, 급여 [부서별, 업무별, 급여 큰순]
-- 이름, 부서코드, 업무, 입사일, 급여 [81년에 입사한 사람 업무, 입사일 순
-- 이름, 급여, comm, 연봉((급여+comm_*12, comm이 null이면 0) 연봉 큰 순
-- 이름, 급여, 부서코드, 입사일 급여가 1500 ~ 3500 사이인데 입사일 순
-- 사번, 이름, 급여 급여 큰 순으로
select empno, ename, sal from emp order by sal desc;
select empno, ename, sal from emp order by 3 desc;
-- 이름, 업무, 급여, 입사일 업무별(작은 순), 급여 작은 순
select ename, job, sal, hiredate from emp order by job, sal;
-- 이름, 부서코드, 업무, 입사일, 급여 [부서별, 업무별, 급여 큰순]
select ename, deptno, job, hiredate, sal from emp order by deptno, job, sal desc;
select ename, deptno, job, hiredate, sal from emp order by 2,3,5 desc;
-- 이름, 부서코드, 업무, 입사일, 급여 [81년에 입사한 사람 업무, 입사일 순
select ename, deptno, job, hiredate, sal from emp where hiredate like '81%' order by job, hiredate;
-- 이름, 급여, comm, 연봉((급여+comm_*12, comm이 null이면 0) 연봉 큰 순
select ename, sal, comm, (sal+nvl(comm,0))*12 연봉 from emp order by 연봉 desc;
-- 이름, 급여, 부서코드, 입사일 급여가 1500 ~ 3500 사이인데 입사일 순
select ename, sal, deptno, hiredate from emp where sal between 1500 and 3000 order by hiredate;
실습 예제
-- EMP 테이블에서 hiredate가 1981년 2월 20과 1981년 5월 1일 사이에 입사한 사원의 ename,job,hiredate을 출력하는 SELECT 문장을 작성(단 hiredate 순으로 출력)
-- EMP 테이블에서 deptno가 10,20인 사원의 모든 정보를 출력하는 SELECT 문장을 작성(단 ename순으로 정렬)
-- EMP 테이블에서 sal이 1500이상이고 deptno가 10,30인 사원의 ename과 sal를 출력하는 SELECT 문장을 작성
(단 HEADING을 employee과 Monthly Salary로 출력)
-- EMP 테이블에서 hiredate가 1982년인 사원의 모든 정보를 출력하는 SELECT 문을 작성
-- EMP 테이블에서 hiredate가 1981년 2월 20과 1981년 5월 1일 사이에 입사한 사원의
-- ename,job,hiredate을 출력하는 SELECT 문장을 작성(단 hiredate 순으로 출력)
select ename, job, hiredate from emp where hiredate between '81/02/20' and '81/05/01'
order by hiredate;
-- EMP 테이블에서 deptno가 10,20인 사원의 모든 정보를 출력하는 SELECT 문장을 작성(단 ename순으로 정렬)
select * from emp where deptno in (10,20) order by ename;
-- EMP 테이블에서 sal이 1500이상이고 deptno가 10,30인 사원의 ename과 sal를 출력하는 SELECT 문장을 작성
-- (단 HEADING을 employee과 Monthly Salary로 출력)
select ename employee, sal "Monthly Salary" from emp where sal >= 1500 and deptno in (10,30);
-- EMP 테이블에서 hiredate가 1982년인 사원의 모든 정보를 출력하는 SELECT 문을 작성
select * from emp where hiredate like '82%';
-- EMP 테이블에서 COMM에 NULL이 아닌 사원의 모든 정보를 출력하는 SELECT 문을 작성
-- EMP 테이블에서 comm이 sal보다 10%많은 모든 사원에 대하여 ename,sal,보너스를 출력하는 SELECT 문을 작성
-- EMP 테이블에서 job이 CLERK이거나 ANALYST이고 sal이 1000,3000,5000이 아닌 모든 사원의 정보를 출력하는 SELECT 문을 작성
-- EMP 테이블에서 ename에 L이 두 자가 있고 deptno가 30이거나 또는 mgr이 7782인 사원의 모든 정보를 출력하는 SELECT 문을 작성
-- EMP 테이블에서 COMM에 NULL이 아닌 사원의 모든 정보를 출력하는 SELECT 문을 작성
select * from emp where comm is not null;
-- EMP 테이블에서 comm이 sal보다 10%많은 모든 사원에 대하여 ename,sal,보너스를 출력하는 SELECT 문을 작성
select ename, sal, comm from emp where comm > sal * 1.1;
-- EMP 테이블에서 job이 CLERK이거나 ANALYST이고 sal이 1000,3000,5000이 아닌 모든 사원의 정보를 출력하는 SELECT 문을 작성
select * from emp where job in ('CLERK','ANALYST') and sal not in (1000,3000,5000);
-- EMP 테이블에서 ename에 L이 두 자가 있고 deptno가 30이거나 또는 mgr이 7782인 사원의 모든 정보를 출력하는 SELECT 문을 작성
select * from emp where ename like '%L%L%' and (deptno = 30 or mgr = 7782);
-- 사원 테이블에서 입사일이 81년이고 업무가 'SALESMAN'이 아닌 직원의 사번, 사원명, 입사일, 업무, 급여.
-- 사원 테이블의 사번, 사원명, 입사일, 업무, 급여를 급여가 높은 순으로 정렬하고, 급여가 같으면 입사일이 빠른 사원으로 정렬
-- 사원 테이블에서 사원명의 세 번째 알파벳이 'N'인 사원의 사번, 사원명을 검색
-- 사원 테이블에서 연봉(SAL*12)이 35000 이상인 사번, 사원명, 연봉을 검색
-- 사원 테이블에서 입사일이 81년이고 업무가 'SALESMAN'이 아닌 직원의 사번, 사원명, 입사일, 업무, 급여.
select empno, ename, hiredate, job, sal from emp where hiredate like '81%' and job != 'SALESMAN';
-- 사원 테이블의 사번, 사원명, 입사일, 업무, 급여를 급여가 높은 순으로 정렬하고, 급여가 같으면 입사일이 빠른 사원으로 정렬
select empno, ename, hiredate, job, sal from emp order by sal desc, hiredate;
-- 사원 테이블에서 사원명의 세 번째 알파벳이 'N'인 사원의 사번, 사원명을 검색
select empno, ename from emp where ename like '__N%';
-- 사원 테이블에서 연봉(SAL*12)이 35000 이상인 사번, 사원명, 연봉을 검색
select empno, ename, sal*12 연봉 from emp where sal*12 >= 35000;
! 주의 !
where절에는 별칭을 사용할 수 없다.