WHERE
WHERE 절을 사용하지 않으면 FROM 절에 명시된 table의 모든 row를 조회하게 된다.
Table 내의 특정 row만 선택하고 싶을 때 WHERE 절에 조건식(condition)을 써준다.
Oracle server는 Table의 row를 하나씩 읽어 WHERE 절의 조건식을 평가하여 TRUE로 만족하는 것만을 선택한다.
Condition을 평가한 결과는 TRUE, FALSE, NULL 중의 하나이다.
emp 테이블에 ename 이 SMITH이면 즉 TRUE이면 해당 행을 띄워줘라.
select *
from emp
where ename = 'SMITH'
Date값은 현재 session의 nls_date_format에 맞춰 표현해 준다.
형식에 맞게
맞지않게
이렇게 포맷이 맞지않으면 오류가 난다.
비교 연산자 중에서 같지 않음을 나타내는 <> 연산자는 모든 운영체제에서 사용 가능하며, 운영 체제 종류에 따라 != 나 ^= 도 사용될 수 있다.
EMP테이블 열이름 - EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
DEPT테이블 열이름 - DEPTNO, DNAME LOC
<문제>
사번이 7788인 사원의 이름과 급여를 출력하시오.
급여가 3000 이 넘는 직종을 출력하시오
PRESIDENT 를 제외한 사원들의 이름과 직종을 출력하시오.
BOSTON 지역에 있는 부서의 번호와 이름을 출력하시오.
Date 값에 대해 조건을 줄 때는 현재 session의 NLS_DATE_FORMAT에 맞춰 주도록 한다.
WHERE parameter = 'NLS_DATE_FORMAT';
SQL> ALTER SESSION SET nls_date_format = 'DD-MON-RR';
SQL> SELECT empno, ename FROM emp WHERE hiredate >= '01-JAN-82';
SQL> ALTER SESSION SET nls_date_format = 'RR/MM/DD';
SQL> SELECT empno, ename FROM emp WHERE hiredate >= '82/01/01';
IN
select * from emp
where sal in(800, 1500, 3000) 800, 1500, 3000인 값들을 찾아줌
ANY
select * from emp
where sal <ANY(800, 1500) 800보다 작은 행들 1500보다작은 행들을 찾아줌
ALL
where sal >ALL(800, 1500) 1500보다 큰 행들을 찾아준다.
ANY와 ALL 연산자의 앞에 비교연산자가 반드시 함께 쓰여야 한다.
IN 연산자는 =ANY 연산자와 같은 결과이다.
NOT IN 연산자는 <>ALL 연산자와 같은 결과이다.
BETWEEN
select *
from emp
where sal between 1000 and 2000 1000과 2000사이의 sal이 있는 값을 가져와라.
LIKE
select *
from emp
where ename like 'S%' 대문자 S로 시작하는 사람
select *
from emp
where ename like '%S' 대문자 S로 끝나는 사람
2 from emp
3* where comm = NULL
SQL> /
file afiedt.buf(이)가 기록되었습니다
2 from emp
3* where comm is NULL
SQL> /
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80/12/17 800 20
7566 JONES MANAGER 7839 81/04/02 2975 20
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7782 CLARK MANAGER 7839 81/06/09 2450 10
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7839 KING PRESIDENT 81/11/17 5000 10
7876 ADAMS CLERK 7788 87/05/23 1100 20
7900 JAMES CLERK 7698 81/12/03 950 30
7902 FORD ANALYST 7566 81/12/03 3000 20
7934 MILLER CLERK 7782 82/01/23 1300 10
2 from emp
3* where hiredate like '%03%' //03 뒤에 NULL값이 오므로 정상적으로 03이 검색된다.
SQL> /
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7900 JAMES CLERK 7698 81/12/03 950 30
7902 FORD ANALYST 7566 81/12/03 3000 20
file afiedt.buf(이)가 기록되었습니다
2 from emp
3* where hiredate like '%03' //찾는 값이 맨 앞에 03이 아니면 꼭 시작할 때 %붙여주자.
SQL> /
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7900 JAMES CLERK 7698 81/12/03 950 30
7902 FORD ANALYST 7566 81/12/03 3000 20
정리
Wildcard ‘_’는 1개의 문자를 대표한다.
Wildcard 문자를 일반 문자로 사용하고 싶을 때 ESCAPE 문자를 사용한다. ESCAPE 문자 바로 뒤에 사용된 wildcard 문자는 일반 문자로 인식된다.
Column의 Null여부를 판단할 때는 반드시 ‘IS NULL’ 혹은 ‘IS NOT NULL’ 연산자를 사용해야 한다.
연산자 우선순위
논리 연산 진리표
ORDER BY
ORDER BY 절에 정렬의 기준이 되는 column을 여러 개 명시할 수 있다. Oracle은 첫 번째 column으로 정렬한 다음, 그 column 값이 같은 row들에 대해서는 두 번째 column값으로 정렬을 해준다.
오름차 순(ASC) 정렬이 default이며, 내림차 순으로 정렬하고자 할 때는 DESC 라는 옵션을 명시해 준다.
ORDER BY 절에 column 명 대신 positional notation을 사용할 수도 있다. Position number는 SELECT절의 column 순서를 의미한다.
1 SELECT *
2 FROM emp
3* order by sal desc, ename
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7839 KING PRESIDENT 81/11/17 5000 10
7902 FORD ANALYST 7566 81/12/03 3000 20
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7566 JONES MANAGER 7839 81/04/02 2975 20
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7782 CLARK MANAGER 7839 81/06/09 2450 10
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7934 MILLER CLERK 7782 82/01/23 1300 10
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7876 ADAMS CLERK 7788 87/05/23 1100 20
7900 JAMES CLERK 7698 81/12/03 950 30
7369 SMITH CLERK 7902 80/12/17 800 20
sal을 기준으로 내림차순하여 정렬하고 그 다음 ename을 기준으로 오름차순 정렬한다.
SQL> SELECT ename, sal FROM emp ORDER BY 2 DESC, 1;
두번째 열을 내림차순으로 첫번째 열을 오름차순으로 정렬한다.
'프로그래밍 기초 > 오라클' 카테고리의 다른 글
Advanced Query (0) | 2010.02.25 |
---|---|
Single-Row Functions (0) | 2010.02.24 |
기본쿼리 (1) | 2010.02.23 |
SQL문 정리 (0) | 2010.02.22 |
Database System (0) | 2010.02.22 |