본문 바로가기

.주제별/SQL,DB

SQL)강의- 제 2 장 데이터베이스로부터 자료검색

출처 : http://naver.kaist.ac.kr/oracle_sql/s02.htm 

1. 기본적인 Query문

Syntax

    SELECT      [DISTINCT] {*,column [alias]…..}
    FROM        테이블명
    WHERE       Query조건(들)
    [ORDER BY   {column, 표현식}  {ASC|DESC}];


    4개의 기본적인 절로 구성

    설  명

    SELECT절

    적어도 한 개의 column으로 구성된 리스트이다.
    DISTINCT : 중복 행을 1개 만 출력한다.
    *      : 모든 Column을 선택한다.
    Alias : 선택된 column에 대해 다른 이름을 부여한다.

    FROM절

    대상 테이블을 적는다.

    WHERE절

    Query조건을 만족하는 행들만을 Return하도록 한다.
    (column, 표현식, 상수 및 비교 연산자들로 구성된다.)

    ORDER BY

    Query된 행들이 Display되는 순서를 명시한다.
    ASC|DESC : 올림차순|내림차순으로 행들을 정렬한다


SQL 명령 작성 규칙

    ◈SQL 명령어들은 여러 라인에 걸쳐 입력 가능하다.
    ◈절들은 보통 판독성과 편집의 용이를 추구하기 위해 각기 다른 라인에 적는다.
    ◈명령어는 여러 라인에 걸쳐 분리할 수 없으며 약식표기 할 수 없다.
    ◈키워드 및 명령어는 전형적으로 대문자로 입력하며 모든 다른 단어들은 예를 들자면 테이블 명,
        column 명 등은 소문자로 입력한다.
    ◈SQL 명령어들은 대소문자 구별이 불필요하다.
    ◈SQL 명령은 SQL 프롬프트에서 입력하며 뒤에 오는 라인들은 번호가 부여되는데
       이를 SQL 버퍼라고 부른다.
     

버퍼내에서 SQL 문장을 실행시키는 방법

    ◈마지막 절 끝에 세미콜론(;)을 찍는다.
    ◈버퍼 내에 있는 마지막 라인에 세미콜론을 찍거나 슬래쉬(/)를 입력한다.
    ◈프롬프트에서 슬래쉬를 입력한다.
    ◈SQL 프롬프트에서 SQL *Plus의 RUN 명령을 입력한다.
     

모든 column, 모든 행 선택

    ◈가장 기본적인 SELECT 문장은 아래사항을 포함해야 한다.
    ◈Display 시킬 column들을 명시하기 위한 SELECT절
    ◈SELECT절에서 명시한 column들을 갖고 있는 테이블을 명시하기 위한 FROM절.
     

    ♠실습 : DEPT테이블로부터 모든 행과 모든 column을 출력 하시오

      SQL> SELECT * FROM S_DEPT;

     

특정 column 선택

    ◈SELECT절에서 column명들을 명시하고 콤마에 의해 분리 함으로서 특정 column들만 출력되게
       Query를 제한할 수 있다.
    ◈테이블의 column명을 알기 위해 SQL*Plus의 DESCRIBE명령을 사용한다.
    ◈DESCRIBE 명령을 사용하여 column명을 확인할 수 있다.
    ◈SELECT 절에 column명들을 입력한다.
    ◈콤마를 사용하여 column들을 분리한다.
    ◈보기 원하는 순서대로 column명을 적는다.

    Default column Heading
    ◈ 레이블 정렬
        -좌측 정렬 : 날짜 및 문자 데이터
        -우측 정렬 : 숫자 데이터
    ◈ 레이블은 기본적으로 대문자로 보여진다.
     

    실습 : DEPT테이블를 DESCRIBE 명령으로 column들을 조회한 후 부서명과 부서번호를 출력 하시오.

    SQL> desc s_dept;
    SQL> select id, name   from s_dept;

     

2. 산술표현식

    ◈데이터가 출력 되는 방식을 변경하거나, 계산을 수행하고자 할 때 사용할 수 있다.
    ◈산술 표현식은 column명, 상수 숫자 값 및 산술 연산자를 포함한다.
     

산술 연산자

    ◈SQL에서 이용 가능한 산술 연산자는 +, -, *, / 이며
    ◈FROM절을 제외한 모든 SQL 문장에서 산술연산자를 사용할 수 있다

    실습 : 모든 사원의 연봉액수 및 commission percentage를 보여주기 위해 곱셈 연산자를 사용하라.

    SQL> select last_name, salary*12, commission_pct      from s_emp;

    ※Column SALARY*12의 계산 결과는 원래 테이블의 새로운 column이 아니라 단지 출력 용도로만
       사용되고 있음을 주시하라.
     

연산자 우선순위

    ◈곱셈 및 나눗셈이 덧셈 및 뺄셈보다 우선한다.
    ◈괄호는 우선순위 평가를 변경 시 또는 문장들을 명확하게 하기 위해 사용된다.
    ◈같은 우선순위의 연산자들은 왼쪽에서 오른쪽으로 수행된다.

     

    실습 : 사원의 이름, 급여, 연봉(급여의 12달분과 $100의 보너스의 합)을 출력 하시오.

    SQL> select last_name, salary, 12*salary+100     from s_emp;

     

    실습 : 사원의 이름, 급여, 연봉을 출력 하시오. 단, 월 보너스가  $100이다.

    SQL> select last_name, salary, 12*(salary+100)      from s_emp;

 

♣ 합성 연산자

    ◈사용자는 합성 연산자( || )를 사용하여 column을 다른 column, 산술 표현식 또는 상수 값에
        연결하여 문자 형태로 표현할 수 있다.
    ◈연산자 양편의 column들은 단일 결과 column으로 출력된다.
    ◈문자 표현식의 결과에 의해 새로운 column을 생성한다.

    실습 : Column Heading Employees로 하여 사원의 완전한 이름(Full name)을 Display 하라.

    SQL> select first_name||last_name AS "사원이름"       from s_emp;

♣ 리터럴 문자열

    ◈리터럴이란 column명, alias가 아닌 SELECT리스트에 포함된 문자,표현식 또는 숫자.
    ◈리터럴이란 column명, alias가 아닌 SELECT 리스트에 포함된 문자, 표현식 또는 숫자이다.
    ◈날짜 및 문자 값은 단일 인용부호(‘‘)로 둘러 쌓여야 하지만, 숫자 리터럴은 그럴 필요가 없다.
    ◈각 문자 column은 되돌려지는 각 행 당 하나씩 출력된다.

    ♠실습 : Column heading을 ’로 하고 사원의 이름(Full name)과 직급을 출력 하시오. 
               이때 구두점을 추가하여 이름과 직급이 구별되도록 하라.

    SQL> select first_name||last_name||'.'||title "사원명/직급"       from s_emp;

3. Column Aliases

    ◈Column alias는 column의 Heading을 새로이 변경한다.
    ◈column명 바로 뒤에 온다.(column명과 alias사이에 AS키워드를 사용할 수도 있다.)
    ◈이중 인용부호(Double quotation)는 alias가 공백, 특수문자를 포함할 경우와 대소문자 구분이
       필요할 경우 사용된다.
    ◈검색결과를 Display할 때, SQL*Plus는 보통 선택한 column명을 heading으로 사용한다.
    ◈column alias을 사용하여 column heading을 변경할 수 있다.
    ◈alias는 SELECT 리스트상에서 column명 뒤 공백을 사용하여 구분하고 alias를 적는다.
    ◈기본값으로 alias heading은 대문자로 출력되고 공백을 포함할 수 없는데 alias가 이중 인용부호
       안에 적혀 있을 시는 예외이다.

    실습 : 사원의 성,월급여 및 연봉을 Display 하라. 연봉은 월급여에다 월보너스금액인 $100을
               더한 데다 12를 곱하여 구하라. 그 column의 heading을 ANNUAL_SALARY로 출력하라

    SQL> select last_name, salary, 12*(salary+100) AS ANNUAL_SALARY
              from s_emp;

    ※ Note 사용자는 ANSI SQL92의 표준을 준수하기 위해 alias앞에 AS 키워드를 포함시킬 수 있다.
     

이중인용 부호(“ “)를 갖고 있는 column alias

    ◈alias가 공백,특수문자(예 #또는_)를 포함하거나 또는 대소문자를 구분해 한다면
       alias은 이중 인용부호(" ")로 에워싸라.

    실습 : 위 예에서 heading을 ’로 출력 하시오.(이중인용 부호 사용)

    SQL> select last_name, salary, 12*(salary+100) "Annual Salary"
         from s_emp;

 

4. NULL 값 관리와 NVL 함수

    ◈column에 데이터 값이 없으면 그 값 자체가 NULL 또는 NULL 값을 포함하고있다.
    ◈NULL 값은 이용할 수 없거나 할당되지 않은 값이며, NULL 값이란 공백이란 문자이다.{0은 숫자}
    ◈NULL 값은 1바이트의 내부저장 장치를 오버헤드로 사용하고 있으며 어떠한 datatype column들이라도
       NULL 값을 포함할 수 있다
    ◈ [column이 not NULL로 정의되어 있거나 테이블 생성시 primary key로 정의되어 있을 시는 예외]
    ◈산술 표현식에서의 NULL 값 표현식에서 column값이 NULL 값이면 결과는 NULL이 된다.

    실습 : 성, 월급여, 직급, 및 계산된 상여금을 출력.

    SQL> select last_name, title, salary*commission_pct/100 COMM
         from s_emp;

NVL함수

    ◈null값을 다른 값으로 대치하기 위해 NVL함수를 사용한다.
    ◈Syntax
        NVL  (expr1, expr2)
              expr1  : NULL값을 포함할 수 있는 값이거나 표현식이다.
                 expr2  : NULL값을 대치 시 사용할 값
    ◈NULL값을 전환하기 위한 NVL함수 예

      datatype

      전환 예

      NUMBER

      NVL(number_column,9)

      DATE

      NVL(date_column, '01-JAN-95')

      CHAR or VARCHAR2

      NVL(characrter_column, 'Unavailable')

       

    실습 : 위의 예에서 사원에 대한 상여금 계산시  NULL값을 0으로 대치하시오.

    SQL> select last_name,title, salary*NVL(commission_pct,0)/100 COMM
         from s_emp;

5. 중복 행 선택 방지(DISTINCT 키워드)

    ◈기본적으로 질의문은 중복된 행을 출력.
    ◈SELECT 절에서 SELECT 명령어 바로 뒤에 DISTINCT 키워드를 입력하면 중복 행을 모두 제거한다.
    ◈DISTINCT는 SELECT 모든 선택된 column에 영향을 준다.

    실습 : s_emp테이블의 모든 직급을 출력.

    SQL> select DISTINCT title FROM s_emp;


    실습 : S_EMP 테이블에서 직급과 부서번호가 다른 모든 사원을 출력 하시오.

    SQL> SELECT DISTINCT dept_id, title   FROM s_emp;

6. ORDER BY 절에 의한 사용한 행들의 정렬

    ◈ORDER BY절은 SELECT 명령에서 마지막에 위치.
    ◈기본적인 정렬순서는 올림차순.
    ◈사용자는 표현식 또는 alias에 의하여 정렬.
    ◈NULL값은 다음과 같이 출력.

      - 올림차순시 가장 마지막에 옴.
      - 내림차순시 가장 먼저옴.

    ◈Syntax
        SELECT expr
        FROM table Default
        [ORDER BY {column, expr} [ASC||DESC]];
     

기본적인 데이터의 정렬

    실습 : 모든 사원의 이름 부서 번호, 입사일의 정보를 사원의 이름을 기준으로 출력.

    SQL> SELECT last_name, dept_id, start_date         FROM s_emp  
             ORDER BY last_name;


    ◈나열한 column의 위치를 이용하여 결과를 정렬할 수 있다.()
    ◈이는 긴 표현식에 의한 정렬 시 유용하다. 즉, SELECT 상에서 표현식의 위치만 명시하면 된다.

    실습 : 사원명세를 Display 시키되 가장 연봉이 적은 순으로 정렬하라.

    SQL> SELECT last_name, salary*12          FROM s_emp  
             ORDER BY 2;

♣ Multiple Column에 의한 정렬

    ◈한 개 이상의 column에 의해 Query 결과를 정렬할 수 있다.
    ◈이는 ORDER BY절에서 column명을 명시하고 콤마를 사용하여 column명을 구분한다

    실습 : 모든 사원을 부서번호부터 정렬하고, 급여가 제일 많은 사람부터 되도록 하라.

    SQL> SELECT last_name, dept_id, salary          FROM s_emp
             ORDER BY dept_id, salary DESC;

 

7. 조건 Query(선택할 행의 제한)

    ◈WHERE절을 사용하여 행들을 제한할 수 있다
    ◈WHERE절은 FROM절 다음에 온다.
    ◈조건은 아래의 것으로 구성된다.
         - column 명, 표현식, 상수, 비교 연산자, 문자(Literal)

    ♣ Syntax

      SELECT expr
      FROM table
      [ORDER BY condition]
      [ORDER BY {column, expr} [ASC||DESC]];

    ◈ condition은 column명, 표현식, 상수 및 비교연산자로 구성된다
     

비교연산자

    ◈비교 연산자들은 2가지 범주로 나누어지는데 즉 논리 연산자와 SQL 연산자이다.
    ◈이런 비교 연산자들은 하나의 표현식을 다른 하나의 표현식과 비교하기 위해 WHERE절에서 사용한다.
    Syntax
        ...WHERE expr operator value
    ◈논리 연산자는 =,    >,    >=,    <,  <=  조건을 check한다.
     

SQL 연산자

    연산자

    의미

    BETWEEN...AND...

    두 개의 값 사이(두개의 값도 포함)

    IN(list)

    리스트의 값중 어느 하나라도 일치

    LIKE

    문자 형태와 일치

    IS NULL

    널값인 경우

    ◈모든 Datatype에 대해 연산가능한 4가지의 SQL연산자가 있다.
    ◈LINK연산자는 어떤 경우 BETWEEN비교 연산자와 유사하게 이용된다.
     

논리 연산자 : AND,   OR,  NOT
 

부정 논리 연산자

    연산자

    설명

    !=

    같지 않는(VAX,UNIX,PC)

    ^=

    같지 않는(IBM)

    <>

    같지 않는(모든 운영체제)

    NOT colname =

    같지 않는

    NOT colname >

    ∼보다 크지 않는


부정 SQL 연산자

    연산자

    설명

    NOT BETWEEN...AND...

    두 개의 명시된 값 사이가 아닌

    NOT IN(list)

    명시된 값의 리스트에 없는

    NOT LIKE

    비교 스트링과 같지 않는

    IS NOT NULL

    널값이 아닌

    ◈ 만약 사용자가 알려진 값을 널값과 비교하자면 IS 또는 IS NOT NULL 비교 연산자를 사용한다.
        널값을 다른 연산자를 사용해 비교하면 결과는 항상 FALSE이다.
    ◈예를 들자면 COMM!=NULL은 항상 거짓이다. 왜냐하면 널값은 어떤 다른값과 같거나 같지 않을
       수가 없기 때문이다.
     

    실습 : WHERE 조건의 예

    연산자 사용 예

    설 명

    WHERE BR_CODE 〓 501

    BR_CODE가 501인것

    WHERE BR_CODE != 501 또는(<> 501)

    BR_CODE가 501이 아닌것

    WHERE BR_CODE 〉 501

    BR_CODE가 501보다 큰것

    WHERE BR_CODE 〈〓 501

    BR_CODE가 501이하인것

    WHERE BR_CODE BETWEEN 510 AND 520

    BR_CODE가 510과 520사이

    WHERE BR_CODE NOT BETWEEN 510 AND 520

    BR_CODE가 510과 520사이가 아닌것

    WHERE BR_CODE IN (510, 520)

    BR_CODE가 510과 520인것

    WHERE JOB_DATE LIKE '%95'

    JOB_DATE가 '95년도 인것※ LIKE 는 CHAR나 DATE TYPE에만 사용이 가능하다

    WHERE CHUL_ID IS NULL

    CHUL_ID가 NULL인것

    WHERE CHUL_ID IS NOT NULL

    CHUL_ID가 NULL이 아닌것

    ◈WHERE문 내에서 AND와OR를 조합하여 여러가지 조건문을 만들어 사용할수 있다.
    ◈LINK연산자는 어떤 경우 BETWEEN비교 연산자와 유사하게 이용된다.
    ◈만약 사용자가 알려진 값을 널값과 비교하자면 IS 또는 IS NOT NULL 비교 연산자를 사용한다.
    널값을 다른 연산자를 사용해 비교하면 결과는 항상 FALSE이다.
       예를 들자면 COMM!=NULL은 항상 거짓이다.
       왜냐하면 널값은 어떤 다른값과 같거나 같지 않을 수가 없기 때문이다.
     

문자 스트링과 날짜

    ◈문자 스트링과 날짜는 단일 인용부호(Single quotation)에 의해 둘러 쌓인다.
    ◈숫자값은 인용부호가 필요 없다.
    ◈문자값은 대소문자 구분이 필요하다.
    ◈기본 날짜 형신은 'DD-MON-YY'이다.
    ◈문자 스트링과 날짜는 WHERE절을 단일 인용 부호('')에 의해 에워 쌓여야 한다.

    실습 : 사원 성이 ‘김’인 사원의 이름과, 성, 직책을 출력 하시오.

    SQL> SELECT first_name, last_name, title FROM s_emp
              WHERE first_name = '김';

 

BETWEEN 연산자

    ◈어떤 범위내의 값에 포함되었는지를 CHECK하기 위해 BETWEEN 연산자를 사용한다.
    ◈사용자는 BETWEEN 연산자를 사용하여 어느 범위의 값을 가진 행들을 Display 할 수 있다.
    ◈사용자가 명시하는 범위는 하한값과 상한값을 포함한다.
     

    실습 : 입사일자가 1991년 5월 9일에서 1991년 6월 17일 사이에 있는 사원의 성,이름 및 입사일자를
               Display 한다.

    /* DATE type이 영문인 경우 */
    SQL> SELECT first_name, last_name, start_date  
             FROM s_emp
             WHERE start_date BETWEEN ‘09-may-91’ AND ‘17-jun-91’;
     
    /* DATE type이 한글인 경우 */
    SQL> SELECT first_name, last_name, start_date  
             FROM s_emp
             WHERE start_date BETWEEN '91/05/09' AND '91/06/17';

IN 연산자

    ◈리스트 상의 값에 포함되었는지를 CHECK하기 위해 IN을 사용한다.

    실습 : 지역번호가 1이거나 3인 부서들의 부서번호,부서명,지역번호를 출력 하시오.

    SQL> SELECT id,name,region_id FROM s_dept
              WHERE region_id IN (1,3);

 LIKE 연산자

    ◈유효한 Query 스트링값으로 와일드카드 사용시 LIKE 연산자를 사용한다.
    ◈LIKE 연산자는 BETWEEN 비교연산자와 유사하게 이용된다.
    ◈Query 조건은 리터럴 문자 또는 숫자를 포함할 수 있다.
    ◈%(와0개 이상의 어떤 문자를 의미한다.) “_”(단일문자를 의미한다.)
       기호는 리터럴 문자와 어떤 조합으로도 이용 가능하다.
    ◈사용자가 “_” 문자를 검색하고자할 경우에는 ESCAPE 명령어를 사용한다.

    실습 : 성이 “M”자로 시작하는 모든 사원의 성을 출력 하시오.

    SQL> SELECT DEPT_ID, FIRST_NAME, LAST_NAME  
             FROM S_EMP
             WHERE LAST_NAME LIKE '만%';


    실습 : 1991년도에 입사한 사원의 입사일자를 출력 하시오.

    SQL> SELECT last_name, start_date  
              FROM s_emp
              WHERE start_date LIKE '91%';


    실습 : 고객이름에 “X_Y”를 갖는 고객 이름을 출력 하시오.
               (Test를 위하여 다음에 배울 Update문을 먼저 사용하였다)

    SQL> update s_customer  
             set name = 'Unisports X_Y Test'
             where name LIKE 'Unispo%';

    SQL> SELECT name  
             FROM s_customer
             WHERE name LIKE '%X\_Y%' ESCAPE'\';

 

IS NULL 연산자

    ◈IS NULL 연산자를 사용해 NULL값을 Check한다.
    ◈반드시 = 연산자를 사용하여서는 안된다.

    실습 : 담당 영업사원를 갖고 있지 않는 모든 고객들의 고객번호, 고객이름 및 신용도를 출력 하시오.

    SQL> SELECT id,name,credit_rating  
             FROM s_customer
             WHERE sales_rep_id IS NULL;

 

8. 다중 조건에 의한 Query와 우선순위

    ◈여러개의 질문조건들을 묶어 복잡한 질문조건을 명시할 필요가 있는데 이때 AND와 OR연산자가
        복합논리 표현식을 만들기 위해 사용된다.
    ◈AND연산자는 모든 조건이 참일시 참이고 OR연산자는 어느 하나의 조건이라도 참일시 참이다.

    실습 : 부서번호 41에 근무하는 모든 재고 담당 사원의 성, 월급여, 부서번호 및 직급을 출력한다.

    SQL> SELECT last_name, salary, dept_id, title  
         FROM s_emp
         WHERE dept_id = 41 AND title = 'Stock Clerk'

     

    실습 : 부서번호 41에 근무하거나 직급이 Stock Clerk인 사원의 성, 월급여, 부서번호 및 직급을
               출력한다.

    SQL> SELECT last_name, salary, dept_id, title  
             FROM s_emp
             WHERE dept_id = 41 OR title = 'Stock Clerk';

     

 ♣ 우선 순위 규칙

    ◈여러분은 같은 논리 표현식에 AND와 OR연산자를 합성할 수가 있다.
    ◈모든 조건들의 결과는 연결연산자의 우선순위에 의해 결정되는 순서로 조합된다.
    ◈동등한 우선순위의 연산자가 바로 옆에 사용될시 좌측에서 우측으로 수행된다.    각 AND는 먼저
       수행되고 그 다음에 각 OR가 수행된다. AND는 OR보다 더 높은 우선순위를 가지고 있다.
    ◈괄호를 사용하여 우선 순위를 변경 할 수 있다.
    ◈여러 연산자들이 나열되었을때 우선순위 규칙
       1 순위 : 모든 비교 연산자(=, <>, >, >=, <. <=, in, LIKE, IS NULL, BETWEEN)
       2 순위 : AND
       3 순위 : OR

    실습 : 부서번호 44인 부서 사원 중에서 월급여가 1000이상이 되는 사원과 42부서에 속하는
               전사원을 출력 하시오.

    SQL> SELECT last_name,salary, dept_id  
             FROM s_emp
             WHERE salary >= 1000 AND dept_id = 44 OR dept_id = 42;

     

      ♠실습 : 44부서나 42부서 사원 중에서 월급여가 1000이상이 되는 사원들을 출력 하시오.

    SQL> SELECT last_name,salary, dept_id  
         FROM s_emp
         WHERE salary >= 1000 AND (dept_id = 44 OR dept_id = 42);