오라클 데이터 검색 – Keywords(2)

지난 시간에 검색을 위한 KEYWORDS 중에서 NOT, BETWEEN, IN에 대해 살펴 보았습니다. 이번 시간에는 와일드 카드를 사용할 수 있는  LIKE, 널 값을 찾을 때 쓰는 IS NULL, 중복된 열을 가려내는 DISTINCT에 대해 알아보겠습니다.
반드시 실습을 하셔야 됩니다. 그냥 읽고 넘어가시면(물론 저보다 다들 머리가 좋으니까 넘어갈 수도 있겠지만) 百見이 不如一打 – 일단 키보드로 확인하고 넘어가세요…)

  1. LIKE
    와일드 카드 문자 아시죠? 예를 들어 도스에서 ‘A’로 시작하는 모든 파일이라고 하면 ‘A*.*’이라고 쓰죠. 도스 기반에서는(Windows에서도 마찬가지이지만) 문자 하나를 나타내는 와일드 카드 문자는 ‘?’, 여러 문자를 나타내는 와일드 카드 문자는 ‘*’를 사용합니다.
    원래 와일드 카드는 트럼프를 이용한 여러 가지 카드 게임에서 52장의 카드 한 벌 중 원하는 어떤 종류의 카드로도 써먹을 수 있도록 특별히 지정된 카드, 즉 만능 패를 의미합니다. 그래서 일명 만능 문자로 번역하기도 합니다.

    LIKE는 와일드 카드 문자를 사용할 수 있는 키워드입니다.

    • 오라클(SQL)에서 사용 가능한 와일드 카드 문자는 다음 두 종류가 있습니다.
      • % : 0~여러 개의 문자를 의미합니다.
      • _ (Underscore): 1개의 문자를 의미합니다.
    • 다음과 같이 입력하고 그 결과를 보세요.
      SELECT *
      FROM EMP
      WHERE EMP_NUM LIKE ‘1%0_’ ;

      무슨 뜻이죠?
      EMP_NUM 컬럼의 값이 ‘1~0□’인 것을 찾는 것이죠. 즉 1과 0 사이에는 어떠한 문자가 와도 상관없고 0 뒤에 하나의 문자가 있는 것을 의미합니다.

    • Like를 부정하려면 다음과 같이 사용합니다.(NOT의 위치를 잘 보세요.)
      • WHERE  LAST_NAME  NOT  LIKE ‘A%’
      • WHERE  NOT  LAST_NAME  LIKE ‘A%’

  2. IS NULL

    • 컬럼으 값이 Null인 Row(레코드)를 찾을 때 사용합니다.
    • IS NULL을 사용할 수 있는 컬럼의 컬럼 룰은 당연히 NN(No Null)이 아니어야 겠죠.
    • NULL은 0이나 스페이스(빈칸)이 아닙니다. 아무 것도 없는 값을 의미합니다. 즉 입력하지 않은 상태를 말합니다.
    • NULL을 포함한 산술 연산(+,-,*,/ 등)의 결과값은 모두 NULL이 됩니다.
    • IS NULL 대신  = NULL 을 사용하면 Syntax Error(문법 오류)는 아니지만 원하는 결과가 안 나옵니다. ‘= NULL’은 결국 문자열이 문자열 NULL과 같은 것이라는 의미가 되는데… 이렇게 쓰면 안되겠죠?
    • IS NULL의 부정 표현은 다음과 같이 사용합니다.(NOT의 위치를 잘 보세요. 보통 첫째 줄처럼 IS NOT NULL과 같이 사용합니다. 영어 문법을 따른 것이죠.)
      • WHERE  AVAILABLE  IS  NOT  NULL;
      • WHERE  NOT  AVAILABLE  IS  NULL;
    • IS NULL을 실습하기 위해 다음과 같은 EMP_SKILL 테이블이 필요합니다.

      일단 다음과 같이 입력하여(복사해 붙여넣어도 됩니다.) 기존의 EMP_SKILL 테이블을 버리고 다음 내용의 새로운 테이블을 하나 만듭니다.

      DROP TABLE EMP_SKILL;
      CREATE TABLE EMP_SKILL
      ( EMP_NUM CHAR(5),
        SKILL_NO CHAR(4),
        ACQUIRE_DATE DATE NOT NULL,
        AVAILABLE CHAR(3),
        CONSTRAINT PK_EMPSKILL PRIMARY KEY(EMP_NUM, SKILL_NO) );
      INSERT INTO EMP_SKILL VALUES ( ‘10001’, ‘S101′, ’99/01/20’, ‘YES’);
      INSERT INTO EMP_SKILL VALUES ( ‘10001’, ‘S102′, ’99/02/23’, NULL);
      INSERT INTO EMP_SKILL VALUES ( ‘10002’, ‘P101′, ’98/04/04’, NULL);
      INSERT INTO EMP_SKILL VALUES ( ‘10003’, ‘C101′, ’00/05/23’, ‘YES’);
      INSERT INTO EMP_SKILL VALUES ( ‘10004’, ‘S101′, ’99/07/07’, NULL);
      INSERT INTO EMP_SKILL VALUES ( ‘10004’, ‘P101′, ’99/10/11’, NULL);
      INSERT INTO EMP_SKILL VALUES ( ‘10006’, ‘E101′, ’00/12/13’, NULL);

    • 다음과 같이 입력해서 그 결과를 살펴 보세요.
      • SELECT *
        FROM EMP_SKILL
        WHERE AVAILABLE IS NULL;

      • SELECT *
        FROM EMP_SKILL
        WHERE AVAILABLE = NULL;

      • SELECT *
        FROM EMP_SKILL
        WHERE AVAILABLE IS NOT NULL;

  3. DISTINCT
    • distinct는 ‘별개의’, ‘~와는 종류가 다른’이라는 뜻을 가진 단어입니다.
    • SQL 문에서 DISTINCT는 검색 결과(Result Set) 중에서 중복된 Row(레코드)는 한 번만 보여주도록 합니다.
    • DISTINCT는 SELECT 문에서 딱 한 번만 사용할 수 있습니다.
    • DISTINCT 뒤에는 여러 컬럼(필드)을 기술할 수 있는데 이때는 모든 컬럼에 DISTINCT가 적용됩니다.
    • 실습을 해야 무슨 뜻인지가 정확히 이해되겠죠.
      다음과 같이 입력하여 그 결과를 비교해 보세요.
      • SELECT EMP_NUM
        FROM EMP_SKILL
        WHERE AVAILABLE IS NULL;

      • SELECT DISTINCT EMP_NUM
        FROM EMP_SKILL
        WHERE AVAILABLE IS NULL;

      뭐가 다른지 모르겠다구요. 결과를 유심히 보세요. 차이를 발견해야지 다음 실습을 할 수 있습니다.
    • 그럼 이번에는 다음과 같이 입력해서 바로 위 결과와 비교해 보세요.
      • SELECT DISTINCT EMP_NUM, SKILL_NO
        FROM EMP_SKILL
        WHERE AVAILABLE IS NULL;

      EMP_NUM과 SKILL_NO가 한꺼번에 중복된 것만 가려서 한번에 표시하고 EMP_NUM 또는 SKILL_NO 중 하나만 중복된 것은 중복을 허용하여 함께 표시합니다.

토요일 아침, 출근 시간이 다가오네요. 오늘도 행복한 하루 되세요.
이상 동주 아빠 손병목이었습니다.

위로 스크롤