상세 컨텐츠

본문 제목

[오라클 교재] 제3장 데이터 제한과 정렬

프로그래밍/DB

by 라제폰 2008. 12. 26. 20:58

본문

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 테이블에서 입사일자가 1982년 1월 1 이후에 입사한 사원의 정보를  사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하여라

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    

 ab사이에 있다.(a, b값 포함)       

IN  (list)

list의 값 중 어느 하나와 일치한다.

LIKE

문자 형태와 일치한다.(%,_사용)

IS NULL

NULL값을 가졌다.

NOT BETWEEN a AND b    

 ab사이에 있지않다.(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 문을 작성하여라.


관련글 더보기