1.2 Where 절과 Order by절 사용법 + 기타 비교 연산자
※ EMP 테이블 구조
# 문제 8. 커미션이 300인 사원의 이름, 커미션, 직업을 출력하시오.
select ename, comm, job from emp where comm = 300; |
- 혹시나 파이썬이나 기타 언어를 썼다면 comm == 300 이라 쓸 수 있으니 주의!! |
# 문제 9. 이름이 SCOTT인 사원의 이름과 월급을 출력하시오.
select ename, sal from emp where ename = 'SCOTT'; |
- 문자와 날짜는 양쪽에 싱글 쿼테이션('')을 사용해야 한다. - 데이터가 대문자로 저장되어 있으면 대문자로 검색해야 한다. ename = 'scott' 은 검색이 안됨 |
# 문제 10. 1981년 11월 17일에 입사한 사원의 이름과 입사일을 출력하시오.
select ename, hiredate from emp where hiredate = '81/11/17';
select ename, hiredate from emp where hiredate = to_date('81/11/17','RR/MM/DD'); |
- 첫 번째 쿼리는 sqlgate에서 에러가 날 수 있다. 왜냐하면 날짜 형식이 sqlplus와 다르기 때문이다. - 따라서 현재 세션의 날짜 형식을 확인해야 하는 데 쿼리는 다음과 같이 입력하면 된다.
select * from nls_session_parameters;
|
# 문제 11. 월급이 1500 이상인 사원들의 이름과 월급을 출력하시오.
select ename, sal from emp where sal >= 1500; |
※ 기타 비교 연산자
between A and B | 두 값 사이(경계값 포함!!!!) |
in(set) | 값 리스트 중 일치하는 값을 검색 |
like | 일치하는 문자 패턴을 검색 |
is null | null 값인지 여부를 판단 |
★ between ~ and ~
# 문제 12. 월급이 1000에서 3000 사이인 사원들의 이름과 월급을 출력하시오.
select ename, sal from emp where sal between 1000 and 3000; |
- " between 낮은 값 and 높은 값 " 형식을 유지하라!!! // 만약 높은 값과 낮은 값의 위치가 바뀐다면 에러가 뜰 것이다. |
★ Like 연산자
# 문제 13. 이름의 첫 글자가 S로 시작하는 사원들의 이름을 출력하시오.
select ename from emp where ename like 'S%'; |
- %가 특수문자가 아닌 wild card로 인식하려면 연산자가 반드시 = 이 아닌 like를 사용해야 한다. |
# 문제 14. 이름의 세번째 철자가 L인 사원들의 이름을 출력하시오.
select ename from emp where ename like '__L%'; |
- " _ " 은 한자리의 wild card를 의미한다. 의미한다. |
# 문제 15. emp 테이블에 A%B라는 이름의 사원이 있다고 가정해보자. 이 때 두번 째 철자가 %인 사원의 이름을 출력하시오.
select ename from emp where ename like '_%%';
select ename from emp where ename like '_m%%' escape 'm'; |
- 첫번 째 쿼리를 실행 할 경우에는 emp이름의 모든 사원이 출력될 것이다. - 두번 째 쿼리를 실행하면 m 바로 다음에 나오는 %를 wild card가 아닌 특수문자 %로 인식하라 쿼리인다. 따라서 A%B의 이름만 출력할 수 있게된다. |
# 문제 16. 이름의 두번 째 철자도 %이고 세번 째 철자도 %인 사원들의 이름을 출력하시오.
select ename from emp where ename like '_m%m%%' escape 'm'; |
★ In 연산자 & Not In
# 문제 17. 사원번호가 7788, 7902, 7369 번인 사원의 사원번호와 이름을 출력하시오.
select empno, ename from emp where empno in (7788,7902,7369); |
# 문제 18. 직업이 SALESMAN, ANALYST인 사원들의 이름과 직업을 출력하시오. (항상 문자는 대소문자 구분하도록!!)
select ename, job from emp where job in ('SALESMAN','ANALYST'); |
# 문제 19. 부서번호가 10, 20번이 아닌 사원들의 이름과 부서번호를 출력하시오.
select ename, deptno from emp where deptno not in (10,20); |
★ Is Null 연산자
# 문제 20. 커미션이 null인 사원들의 이름과 커미션을 출력하시오.
select ename, comm from emp where comm is null; |
- 주의! comm = null 은 안된다. // comm = 'null' 이것은 null이란 값을 가지는 comm을 찾는 것이다. |
※ 간단한 논리연산자
True | and | True | True | and | False | True | and | Null |
True | False |
Null (만약 Null이 True 라면 True 일 것이다. 그 반대라면 결과는 False일 것이다. 두가지 경우에 대해 일치 하지 않으니 우리는 그 결과를 알 수 없다.) |
True | or | True | True | or | False | True | or | Null |
True | True |
True (만약 Null이 True 라면 True 일 것이다. 그 반대라면 결과도 True일 것이다. 두가지 경우에 대해 일치하니 결과를 True 라고 알 수 있다.) |
False | and | Null | False | or | Null |
False (위의 논리와 동일하다. Null 값이 무엇이냐에 관계 없이 이 값은 False의 결과를 도출한다.) |
Null (Null 값이 어떤 값을 가지느냐에 따라서 결과가 달라지므로 Null의 결과를 도출한다.) |
# 문제 21. 직업이 SALESMAN 이고 월급이 1000 이상인 사람들의 이름과 월급과 직업을 출력하시오.
select ename, sal, job from emp where job = 'SALESMAN' and SAL >= 1000; |
※ 알아두면 좋은 연산자의 우선순위
1. 산술연산자 | 2. 연결연산자 | 3. 비교연산자 |
4. is null, like, in | 5. between | 6. 같지 않음 |
7. Not논리 | 8. And 논리 | 9. Or 논리 |
# 문제 22. 직업이 SALESMAN 이거나 CLERK 이고 월급이 1000 이상인 사원들의 이름과 월급과 직업을 출력하시오.
select ename, sal, job from emp where job in ('SALESMAN','CLERK') and sal >= 1000;
select ename, sal, job from emp where job = 'SALESMAN' or job = 'CLERK' and sal >= 1000; |
- 첫번 째 쿼리가 옳다. 두번 째 쿼리는 SALESMAN 이거나 CLERK이면서 월급이 1000이상인 사람을 출력하는 것이다. 그 이유는 or 논리 연산자가 가장 마지막에 정산되기 때문이다. |