1. 특정 행의 검색
일반적인 경우 테이블에 있는 모든 자료를 조회할 필요 없이 사용자가 원하는 자료를 조회하는 경우가 대부분 입니다. 이러한 질의를 만족하게 하는 것이 WHERE절입니다. WHERE절은 수행될 조건 절을 포함하며 FROM절 바로 다음에 기술됩니다.
1.1 Syntax
SELECT [DISTINCT] {*, column [alias], . . .} FROM table_name [WHERE condition] [ORDER BY {column, expression} [ASC | DESC]]; |
DISTINCT 중복 행 제거 옵션
* 테이블의 모든 column 출력
alias 해당 column에 대한 다른 이름 부여
table_name 테이블명 질의 대상 테이블 이름
WHERE 조건을 만족하는 행들만 검색
condition column명, 표현식, 문자 상수, 숫자 상수, 비교 연산자로 구성된다.
ORDER BY 질의 결과 정렬을 위한 옵션(ASC:오름차순(Default),DESC내림차순)
1.2 WHERE절에 사용되는 연산자
1) WHERE절을 사용하여 행들을 제한할 수 있다
2) WHERE절은 FROM절 다음에 온다.
3) 조건은 아래의 것으로 구성된다.
① column 명, 표현식, 상수
② 비교 연산자, SQL연산자, 논리연산자
③ 문자(Literal)
1.2.1 비교 연산자
연산자 |
의 미 |
= |
같다 |
> |
보다 크다 |
>= |
보다 크거나 같다 |
< |
보다 작다 |
<= |
보다 작거나 같다 |
<>, !=, ^= |
같지 않다 |
NOT Column_name = |
같지 않다 |
NOT Column_name > |
보다 크지 않다 |
문제1) EMP 테이블에서 급여가 3000이상인 사원의 정보를 사원번호, 이름, 담당업무, 급여를 출력하여라
SQL> SELECT empno,ename,job,sal 2 FROM emp 3 WHERE sal >= 3000; EMPNO ENAME JOB SAL --------- ---------- --------- --------- 7839 KING PRESIDENT 5000 7902 FORD ANALYST 3000 7788 SCOTT ANALYST 3000 |
문제2) EMP 테이블에서 담당 업무가 Manager인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 부서번호를 출력하여라.
SQL> SELECT empno,ename,job,sal,deptno 2 FROM emp 3 WHERE job = 'MANAGER'; EMPNO ENAME JOB SAL DEPTNO --------- ---------- --------- --------- --------- 7698 BLAKE MANAGER 2850 30 7782 CLARK MANAGER 2450 10 7566 JONES MANAGER 2975 20 |
SQL> SELECT empno,ename,job,sal,deptno 2 FROM emp 3 WHERE job = 'Manager'; no rows selected |
문제3) EMP 테이블에서 입사일자가
SQL> SELECT empno,ename,job,sal,hiredate,deptno 2 FROM emp 3 WHERE hiredate >= '01-JAN-82'; EMPNO ENAME JOB SAL HIREDATE DEPTNO --------- ---------- --------- --------- ------------------ --------- 7788 SCOTT ANALYST 3000 09-DEC-82 20 7876 ADAMS CLERK 1100 12-JAN-83 20 7934 MILLER CLERK 1300 23-JAN-82 10 |
♣ 참고
1) 문자 STRING과 날짜 값은 단일 인용 부호(‘ ‘)를 사용한다.
2) 문자 값은 대소문자를 구분하고 날짜 값은 날짜 형식을 구분합니다.
3) Default날짜 형식은 ‘DD-MON-YY’ 입니다.
1.2.2 SQL연산자
연산자 |
설 명 |
BETWEEN a AND b |
a와b사이에 있다.(a, b값 포함) |
IN (list) |
list의 값 중 어느 하나와 일치한다. |
LIKE |
문자 형태와 일치한다.(%,_사용) |
IS NULL |
NULL값을 가졌다. |
NOT BETWEEN a AND b |
a와b사이에 있지않다.(a, b값 포함하지 않음) |
NOT IN (list) |
list의 값과 일치하지 않는다.. |
NOT LIKE |
문자 형태와 일치하지 않는다. |
NOT IS NULL |
NULL값을 갖지 않는다. |
가) BETWEEN연산자
두 값의 범위에 해당하는 행을 출력하기 위해 사용한다.
문제4) EMP 테이블에서 급여가 1250에서 1500사이의 정보를 성명, 담당업무, 급여, 부서번호를 출력하여라
SQL> SELECT ename,job,sal,deptno 2 FROM emp 3 WHERE sal BETWEEN 1300 AND 1500; ENAME JOB SAL DEPTNO ---------- --------- --------- --------- TURNER SALESMAN 1500 30 MILLER CLERK 1300 10 |
SQL> SELECT ename,job,sal,deptno 2 FROM emp 3 WHERE sal >= 1300 AND sal <= 1500; ENAME JOB SAL DEPTNO ---------- --------- --------- --------- TURNER SALESMAN 1500 30 MILLER CLERK 1300 10 |
♣ 참고
BETWEEN연산자를 기술할 경우 명시된 값도 포함 된다. 또한 작은 값을 앞에 기술하고 큰 값은 뒤에 기술하여야 한다.
SQL> SELECT ename,job,sal,deptno 2 FROM emp 3 WHERE sal BETWEEN 1500 AND 1300; no rows selected |
나) IN 연산자
목록에 있는 값에 대해서 출력하기 위해 IN연산자를 사용한다.
문제5) EMP 테이블에서 사원번호가 7902,7788,7566인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자를 출력하여라
SQL> SELECT empno,ename,job,sal,hiredate 2 FROM emp 3 WHERE empno IN (7902,7788,7566); EMPNO ENAME JOB SAL HIREDATE --------- ---------- --------- --------- ---------------- 7566 JONES MANAGER 2975 02-APR-81 7788 SCOTT ANALYST 3000 09-DEC-82 7902 FORD ANALYST 3000 03-DEC-81 |
SQL> SELECT empno,ename,job,sal,hiredate 2 FROM emp 3 WHERE empno = 7902 OR empno = 7788 OR empno = 7566; EMPNO ENAME JOB SAL HIREDATE --------- ---------- --------- --------- --------------- 7566 JONES MANAGER 2975 02-APR-81 7788 SCOTT ANALYST 3000 09-DEC-82 7902 FORD ANALYST 3000 03-DEC-81 |
다) LIKE 연산자
1) 검색 STRING 값에 대한 와일드 카드 검색을 위해서 LIKE연산자를 사용한다.
2) 검색 조건은 LITERAL 문자나 숫자를 포함할 수 있다.
3) ‘%’는 문자가 없거나 하나 이상의 문자를 ‘_’는 하나의 문자와 대치됩니다.
4) 패턴 일치 문자를 조합할 수 있습니다.
5) ‘%’나 ‘_’에 대해서 검색하기 위해서는 Escape 식별자를 이용할 수 있습니다.
예) name에 값이 X_Y가 포함되어 있는 문자열을 조회하고자 할 경우 Escape를 사용한다
WHERE name LIKE ‘%X\_Y%’ ESCAPE ‘\’; |
문제6) EMP 테이블에서 입사일자가 82년도에 입사한 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하여라
SQL> SELECT empno,ename,job,sal,hiredate,deptno 2 FROM emp 3 WHERE hiredate LIKE '%82'; EMPNO ENAME JOB SAL HIREDATE DEPTNO --------- ---------- --------- --------- ------------------ --------- 7788 SCOTT ANALYST 3000 09-DEC-82 20 7934 MILLER CLERK 1300 23-JAN-82 10 |
♣ 참고
1) 기본 날짜 형식이 ‘YY-MM-DD’일 경우는 WHERE hiredate LIKE '82%';로 기술한다.
2) SQL> ALTER SESSION SET NLS_DATE_FORMAT = ‘YY-MM-DD’; 명령어로 연결되어 있는 SQL*Plus 창(SESSION)에서 날짜 타입을 바꿀 수 있다.
라) IS NULL 연산자
NULL값은 값이 없거나, 알 수 없거나, 적용할 수 없다는 의미이므로 NULL값을 조회하고자 할 경우에 사용한다.
문제7) EMP 테이블에서 보너스가 NULL인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하여라
SQL> SELECT empno,ename,job,sal,comm,deptno 2 FROM emp 3 WHERE comm IS NULL; EMPNO ENAME JOB SAL COMM DEPTNO --------- ---------- --------- --------- --------- --------- 7839 KING PRESIDENT 5000 10 . . . . . . . . . . 10 rows selected. |
1.2.3 논리 연산자
연산자 |
의 미 |
AND |
양쪽 컴포넌트의 조건이 TRUE이면 TRUE를 RETURN합니다. |
OR |
한쪽 컴포넌트의 조건만이 TRUE이면 TRUE를 RETURN합니다 |
NOT |
이후의 조건이 FALSE이면 TRUE를 RETURN합니다 |
가. AND연산자
1) 양쪽의 조건이 참이어야 TRUE를 RETURN한다.
2) 다음의 테이블은 AND로 두개의 표현식을 조합한 결과를 보여 준다.
AND |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
FALSE |
NULL |
FALSE |
FALSE |
FALSE |
FALSE |
NULL |
NULL |
FALSE |
NULL |
문제8) EMP 테이블에서 급여가 1100이상이고 JOB이 Manager인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하여라
SQL> SELECT empno,ename,job,sal,hiredate,deptno 2 FROM emp 3 WHERE sal >= 1100 AND job = 'MANAGER'; EMPNO ENAME JOB SAL HIREDATE DEPTNO --------- ---------- --------- --------- ------------------ --------- 7698 BLAKE MANAGER 2850 01-MAY-81 30 7782 CLARK MANAGER 2450 09-JUN-81 10 7566 JONES MANAGER 2975 02-APR-81 20 |
나) OR 연산자
1) 한쪽의 조건만 참이면 TRUE를 RETURN한다.
2) 다음의 테이블은 OR로 두개의 표현식을 조합한 결과를 보여 준다.
OR |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
TRUE |
FALSE |
NULL |
NULL |
TRUE |
NULL |
NULL |
문제9) EMP 테이블에서 급여가 1100이상이거나 JOB이 Manager인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하여라
SQL> SELECT empno,ename,job,sal,hiredate,deptno 2 FROM emp 3 WHERE sal >= 1100 OR job = 'MANAGER'; EMPNO ENAME JOB SAL HIREDATE DEPTNO --------- ---------- --------- --------- ------------------ --------- 7839 KING PRESIDENT 5000 17-NOV-81 10 7698 BLAKE MANAGER 2850 01-MAY-81 30 7782 CLARK MANAGER 2450 09-JUN-81 10 . . . . . . . . . . 12 rows selected. |
다) NOT연산자
1) NOT연산자 우측의 값이 거짓이면 TRUE를 RETURN한다
2) 다음의 테이블은 NOT으로 두개의 표현식을 조합한 결과를 보여 준다.
OR |
TRUE |
FALSE |
NULL |
|
FALSE |
TRUE |
NULL |
문제10) EMP 테이블에서 급여가 JOB이 Manager,Clear,Analyst가 아닌 사원의 정보를 사원번호, 성명, 담당업무, 급여, 부서번호를 출력하여라
SQL> SELECT empno,ename,job,sal,deptno 2 FROM emp 3 WHERE job NOT IN ('MANAGER','CLERK','ANALYST'); EMPNO ENAME JOB SAL DEPTNO --------- ---------- --------- --------- --------- 7839 KING PRESIDENT 5000 10 7654 MARTIN SALESMAN 1250 30 7499 ALLEN SALESMAN 1600 30 7844 TURNER SALESMAN 1500 30 7521 WARD SALESMAN 1250 30 |
♣ 참고
NOT 연산자는 BETWEEN, LIKE, IS NULL과 같은 다른 SQL연산자와 함께 사용될 수 있습니다.
. . . . WHERE NOT job IN (‘CLERK’,’ANALYST’); . . . . WHERE sal NOT BETWEEN 1000 AND 1500; . . . . WHERE ename NOT LIKE ‘%A%’; . . . . WHERE comm IS NOT NULL; |
1.3.4 우선 순위 규칙
1) 괄호
2) 모든 비교 연산자
3) NOT
4) AND
5) OR
문제11) 업무가 PRESIDENT이고 급여가 1500이상이거나 업무가 SALESMAN인 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하여라.
SQL> SELECT empno,ename,job,sal 2 FROM emp 3 WHERE job = 'SALESMAN' OR job = 'PRESIDENT' AND sal > 1500; EMPNO ENAME JOB SAL --------- ---------- --------- --------- 7839 KING PRESIDENT 5000 7654 MARTIN SALESMAN 1250 7499 ALLEN SALESMAN 1600 7844 TURNER SALESMAN 1500 7521 WARD SALESMAN 1250 |
문제12) 업무가 PRESIDENT또는 SALESMAN이고 급여가 1500이상이거나 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하여라.
SQL> SELECT empno,ename,job,sal 2 FROM emp 3 WHERE (job = 'SALESMAN' OR job = 'PRESIDENT') AND sal > 1500; EMPNO ENAME JOB SAL --------- ---------- --------- --------- 7839 KING PRESIDENT 5000 7499 ALLEN SALESMAN 1600 |
2. ORDER BY절
질의 결과에 RETURN되는 행의 순서는 정의되지 않습니다. ORDER BY절은 행을 정렬하는데 사용할 수 있습니다. ORDER BY절 사용하는 경우 SELECT문의 맨 뒤에 기술되어야 합니다. 정렬을 위한 표현식이나 Alias을 명시할 수 있습니다.
2.1 Syntax
SELECT [DISTINCT] {*, column [alias], . . .} FROM table_name [WHERE condition] [ORDER BY {column, expression} [ASC | DESC]]; |
ORDER BY 검색된 행이 출력되는 순서를 명시합니다.
ASC 행의 오름차순 정렬(Default)
DESC 행의 내림차순 정렬
♣ 참고
ORDER BY절이 사용되지 않았다면, 정렬 순서가 정의되지 않은 것이며 오라클 서버는 똑같은 질의를 두 번 실행했을 때 행을 똑같은 순서로 나타내지 않을 수도 있습니다.
2.2 데이터의 정렬
1) 디폴트 정렬은 오름차순입니다:
① 숫자 값은 가장 적은 값이 먼저 출력됩니다.(예 : 1 ~ 999)
② 날짜 값은 가장 빠른 값이 먼저 출력됩니다.(예 : 01-JAN-92 ~ 01-JAN-95)
③ 문자 값은 알파벳 순서로 출력됩니다.(예 : A ~ Z ~ a ~ z)
④ Null값은 오름차순에서는 제일 나중에 그리고 내림차순에서는 제일 먼저 옵니다.
2) 디폴트 순서 변경
① 행이 디스플레이 되는 순서를 바꾸기 위해서, ORDER BY절에서 열 이름 뒤에 DESC키워드를 명시해야 합니다.
문제13) EMP 테이블에서 입사일자 순으로 정렬하여 사원번호, 이름, 업무, 급여, 입사일자,부서번호를 출력하여라.
SQL> SELECT hiredate,empno,ename,job,sal,deptno 2 FROM emp 3 ORDER BY hiredate; HIREDATE EMPNO ENAME JOB SAL DEPTNO ------------------ --------- ---------- --------- --------- --------- 17-DEC-80 7369 SMITH CLERK 800 20 20-FEB-81 7499 ALLEN SALESMAN 1600 30 22-FEB-81 7521 WARD SALESMAN 1250 30 02-APR-81 7566 JONES MANAGER 2975 20 . . . . . . . . . . 14 rows selected. |
문제14) EMP 테이블에서 가장 최근에 입사한 순으로 사원번호, 이름, 업무, 급여, 입사일자,부서번호를 출력하여라.
SQL> SELECT hiredate,empno,ename,job,sal, deptno 2 FROM emp 3 ORDER BY hiredate DESC; HIREDATE EMPNO ENAME JOB SAL DEPTNO ------------------ --------- ---------- --------- --------- --------- 12-JAN-83 7876 ADAMS CLERK 1100 20 09-DEC-82 7788 SCOTT ANALYST 3000 20 23-JAN-82 7934 MILLER CLERK 1300 10 . . . . . . . . . . 14 rows selected. |
2.2.1 다양한 정렬 방법
SQL> SELECT empno,ename,job,sal,sal*12 annsal 2 FROM emp 3 ORDER BY annsal; |
SQL> SELECT empno,ename,job,sal,sal*12 annsal 2 FROM emp 3 ORDER BY sal*12; |
SQL> SELECT empno,ename,job,sal,sal*12 annsal 2 FROM emp 3 ORDER BY 5; |
2.3 다중 열에 의한 정렬
1) 하나 이상의 열로 질의 결과를 정렬할 수 있습니다.
2) 주어진 테이블에 있는 개수까지만 가능합니다.
3) ORDER BY절에서 열을 명시하고, 열 이름은 콤마로 구분합니다.
4) 열의 순서를 바꾸고자 한다면 열 이름 뒤에 DESC를 명시합니다.
5) SELECT절에 포함되지 않는 열로 정렬할 수도 있습니다.
문제15) EMP 테이블에서 부서번호로 정렬한 후 부서번호가 같을 경우 급여가 많은 순으로 정렬하여 사원번호, 성명, 업무, 부서번호, 급여를 출력하여라.
SQL> SELECT deptno,sal,empno,ename,job 2 FROM emp 3 ORDER BY deptno, sal DESC; DEPTNO SAL EMPNO ENAME JOB --------- --------- --------- ---------- --------- 10 5000 7839 KING PRESIDENT 10 2450 7782 CLARK MANAGER 10 1300 7934 MILLER CLERK 20 7788 SCOTT ANALYST 20 3000 7902 FORD ANALYST 20 2975 7566 JONES MANAGER 20 1100 7876 ADAMS CLERK 20 800 7369 SMITH CLERK 30 2850 7698 BLAKE MANAGER 30 1600 7499 ALLEN SALESMAN 30 1500 7844 TURNER SALESMAN 30 1250 7654 MARTIN SALESMAN 30 1250 7521 WARD SALESMAN 30 950 7900 JAMES CLERK 14 rows selected. |
문제16) EMP 테이블에서 첫번째 정렬은 부서번호로 두번째 정렬은 업무로 세번째 정렬은 급여가 많은 순으로 정렬하여 사원번호, 성명, 입사일자, 부서번호, 업무, 급여를 출력하여라.
SQL> SELECT deptno,job,sal,empno,ename,hiredate 2 FROM emp 3 ORDER BY deptno,job,sal DESC; DEPTNO JOB SAL EMPNO ENAME HIREDATE --------- --------- --------- --------- ---------- ----------------- 10 CLERK 1300 7934 MILLER 23-JAN-82 10 MANAGER 2450 7782 CLARK 09-JUN-81 10 PRESIDENT 5000 7839 KING 17-NOV-81 20 ANALYST 7788 SCOTT 09-DEC-82 20 ANALYST 3000 7902 FORD 03-DEC-81 20 CLERK 1100 7876 ADAMS 12-JAN-83 20 CLERK 800 7369 SMITH 17-DEC-80 20 MANAGER 2975 7566 JONES 02-APR-81 30 CLERK 950 7900 JAMES 03-DEC-81 30 MANAGER 2850 7698 BLAKE 01-MAY-81 30 SALESMAN 1600 7499 ALLEN 20-FEB-81 30 SALESMAN 1500 7844 TURNER 08-SEP-81 30 SALESMAN 1250 7654 MARTIN 28-SEP-81 30 SALESMAN 1250 7521 WARD 22-FEB-81 14 rows selected. |
◈ 연 습 문 제 ◈
1. WHERE절에 HIREDATE의 비교를 '01-JAN-82'가 아닌 '01-jan-82'로 기술하면 결과는 ?
SQL> SELECT * 2 FROM emp 3 WHERE hiredate = '23-jan-82'; |
2. EMP 테이블에서 급여가 3000이상인 사원의 정보를 사원번호,이름,담당업무,급여를 출력하는 SELECT 문장을 작성하시오.
3. EMP 테이블에서 사원번호가 7788인 사원의 이름과 부서번호를 출력하는 SELECT 문장을 작성하시오.
4. EMP 테이블에서 입사일이 February 20, 1981과 May 1, 19981 사이에 입사한 사원의 이름,업무,입사일을 출력하는 SELECT 문장을 작성하시오. 단 입사일 순으로 출력하시오.
5. EMP 테이블에서 부서번호가 10,20인 사원의 모든 정보를 출력하는 SELECT 문장을 작성하시오. 단 이름순으로 정렬하여라.
6. EMP 테이블에서 급여가 1500이상이고 부서번호가 10,30인 사원의 이름과 급여를 출력하는 SELECT 문장을 작성하여라. 단 HEADING을 Employee과 Monthly Salary로 출력하여라.
7. EMP 테이블에서 1982년에 입사한 사원의 모든 정보를 출력하는 SELECT 문을 작성하여라.
8. EMP 테이블에서 COMM에 NULL이 아닌 사원의 모든 정보를 출력하는 SELECT 문을 작성하여라.
9. EMP 테이블에서 보너스가 급여보다 10%가 많은 모든 종업원에 대하여 이름,급여,보너스를 출력하는 SELECT 문을 작성하여라.
10. EMP 테이블에서 업무가 Clerk이거나 Analyst이고 급여가 1000,3000,5000이 아닌 모든 사원의 정보를 출력하는 SELECT 문을 작성하여라.
11. EMP 테이블에서 이름에 L이 두 자가 있고 부서가 30이거나 또는 관리자가 7782인 사원의 모든 정보를 출력하는 SELECT 문을 작성하여라.