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

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

반드시 실습을 하셔야 됩니다. 그냥 읽고 넘어가시면(물론 저보다 다들 머리가 좋으니까 넘어갈 수도 있겠지만) 百見이 不如一打 - 일단 키보드로 확인하고 넘어가세요...)

- LIKE
와일드 카드 문자 아시죠? 예를 들어 도스에서 'A'로 시작하는 모든 파일이라고 하면 'A*.*'이라고 쓰죠. 도스 기반에서는(Windows에서도 마찬가지이지만) 문자 하나를 나타내는 와일드 카드 문자는 '?', 여러 문자를 나타내는 와일드 카드 문자는 '*'를 사용합니다.
원래 와일드 카드는 트럼프를 이용한 여러 가지 카드 게임에서 52장의 카드 한 벌 중 원하는 어떤 종류의 카드로도 써먹을 수 있도록 특별히 지정된 카드, 즉 만능 패를 의미합니다. 그래서 일명 만능 문자로 번역하기도 합니다.
LIKE는 와일드 카드 문자를 사용할 수 있는 키워드입니다.
- 오라클(SQL)에서 사용 가능한 와일드 카드 문자는 다음 두 종류가 있습니다.
- % : 0~여러 개의 문자를 의미합니다.
- _ (Underscore): 1개의 문자를 의미합니다.
- % : 0~여러 개의 문자를 의미합니다.
- 다음과 같이 입력하고 그 결과를 보세요.
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%'
- WHERE LAST_NAME NOT LIKE 'A%'
- 오라클(SQL)에서 사용 가능한 와일드 카드 문자는 다음 두 종류가 있습니다.
- 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;
- WHERE AVAILABLE IS NOT 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;
- SELECT *
- 컬럼으 값이 Null인 Row(레코드)를 찾을 때 사용합니다.
- 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 EMP_NUM
- 그럼 이번에는 다음과 같이 입력해서 바로 위 결과와 비교해 보세요.
- SELECT DISTINCT EMP_NUM, SKILL_NO
FROM EMP_SKILL
WHERE AVAILABLE IS NULL;
EMP_NUM과 SKILL_NO가 한꺼번에 중복된 것만 가려서 한번에 표시하고 EMP_NUM 또는 SKILL_NO 중 하나만 중복된 것은 중복을 허용하여 함께 표시합니다. - SELECT DISTINCT EMP_NUM, SKILL_NO
- distinct는 '별개의', '~와는 종류가 다른'이라는 뜻을 가진 단어입니다.
토요일 아침, 출근 시간이 다가오네요. 오늘도 행복한 하루 되세요.
이상 동주 아빠 손병목이었습니다.
