select ename, sal, job
from emp
where job = 'SALESMAN'
and sal >= 1200;
+ - * /
>, <, >=, <=, =, !=, <>, ^=
and, or, not
select ename, sal, job
from emp
where job = 'SALESMAN' or sal >= 1200;
💡 and
는 조건이 전부 true여야 결과가 출력되는데
or
는 조건 중 1개만 true여도 결과가 출력됨
논리연산자 and와 or에 우선순위가 있음
and가 먼저 작동됨
-- job이 ANALYST이고 sal이 2000이상인 사람 먼저
select ename, sal, job
from emp
where job='SALESMAN' or job ='ANALYST' and sal > 2000;
-- 괄호 먼저
select ename, sal, job
from emp
where (job='SALESMAN' or job ='ANALYST') and sal > 2000;
💡 괄호가 없는 위의 SQL에서 and와 or가 같이 있으면 and가 먼저 작동됨
select ename, sal, job, deptno
from emp
where (deptno = 10 or deptno = 20)
and job = 'SALESMAN';
( OR 가 먼저 수행되게하시오 )
① SELECT * FROM EMP
WHERE JOB IN ('ANALYST','CLERK') AND SAL > 1200;.
② SELECT * FROM EMP
WHERE JOB = 'ANALYST' OR JOB = 'CLERK' AND SAL > 1200;
③ SELECT * FROM EMP
WHERE (JOB = 'ANALYST' AND SAL > 1200) OR (JOB = 'CLERK' AND SAL > 1200);
④ SELECT * FROM EMP
WHERE (JOB = 'ANALYST' OR JOB = 'CLERK') AND SAL > 1200;
답: ①, ④
explain plan for
SELECT * FROM EMP
WHERE JOB IN ('ANALYST','CLERK') AND SAL > 1200;
select * from table(dbms_xplan.display);
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 261 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 3 | 261 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(("JOB"='ANALYST' OR "JOB"='CLERK') AND "SAL">1200)
Note
-----
- dynamic statistics used: dynamic sampling (level=2)