WHERE구
WHERE는 지정한 조건을 만족하는 레코드만 취득하는, 즉 레코드를 선별하기 위해서 사용되는 키워드입니다.
SELECT 컬럼명 FROM 테이블명 WHERE 조건식
WHERE 구는 FROM 구의 직후에 오며, WHERE 키워드 뒤에 조건식을 지정합니다. 테이블의 전체 레코드에 대해서 조건식의 결과가 TRUE가 되는 레코드만이 결과로 취득됩니다.
조건식
WHERE 구에는 한 가지 이상의 조건식을 기술해야하며 그 조건식은 좌변, 비교연산자, 우변의 세 가지 요소로 구성됩니다.
좌변에는 컬럼명, 정수, 값의 리스트, 식 중에 한 가지를 지정하고 중앙에는 비교연산자를 배치합니다. 또, WHERE 구에는 컬럼의 별명은 지정할 수 없습니다.
컬럼명 비교연산자 {컬럼명 | 정수 | 값 리스트 | 식}
조건식 가이드라인
조건식 작성에는 몇 가지 규칙이 있습니다.
- 조건에 사용되는 값은 문자 또는 날짜 데이터의 경우, 값을 싱글쿼테이션(‘, 홑따옴표)로 감싸주어야 합니다.
- 조건식에는 컬럼의 별명을 지정할 수 없습니다.
- 문자 데이터의 알파벳은 대문자, 소문자를 구분합니다.
- 날짜 데이터는 서식을 구별합니다.
- 오라클의 디폴트 날짜 포맷은 DD-MON-RR(일 – 월 – 년도의 뒤에서부터 두 자리)로 되어있습니다.
- 디폴트 날짜 포맷은 사용하는 환경에 따라 다르지만 변환함수를 사용해서 디폴트 날짜 포맷 외의 포맷으로 변경해서 사용할 수 있습니다.
이 글의 예시는 아래 글의 초기 데이터를 사용했습니다.
예시1
수치를 검색하는 조건 SQL문입니다. emp 테이블의 컬럼 empno가 7698와 일치하는 레코드를 출력합니다.
COLUMN empno FORMAT 99999;
COLUMN ename FORMAT A6;
COLUMN hiredate FORMAT A10;
SELECT empno, ename, hiredate FROM emp WHERE empno = 7698;
결과는 다음과 같습니다. empno가 7698인 레코드 1건이 출력되었습니다.
EMPNO ENAME HIREDATE
------ ------ ----------
7698 BLAKE 1981/05/01
예시2
문자열을 검색하는 조건 SQL문입니다. emp 테이블의 컬럼 ename이 ‘MARTIN’과 일치하는 레코드를 출력합니다. 문자열은 싱글쿼테이션(홑따옴표)으로 감싸줍니다.
COLUMN empno FORMAT 99999;
COLUMN ename FORMAT A6;
COLUMN hiredate FORMAT A10;
SELECT empno, ename, hiredate FROM emp WHERE ename = 'MARTIN';
결과는 다음과 같습니다. ename가 MARTIN인 레코드 1건이 출력되었습니다.
EMPNO ENAME HIREDATE
------ ------ ----------
7654 MARTIN 1981/09/28
예시3
날짜를 검색하는 조건 SQL문입니다. emp 테이블의 컬럼 hiredate이 ‘1981/06/09’과 일치하는 레코드를 출력합니다. 날짜는 문자열과 마찬가지로 싱글쿼테이션로 감싸줍니다.
date형식의 디폴트 포맷을 alter문을 통해 바꿔주면 원하는 포맷으로 SQL문을 작성하고 결과를 출력할 수 있습니다. (alter문을 통한 일시적인 변경이기 때문에 세션이 끊기면 다시 원래대로 돌아갑니다.)
COLUMN empno FORMAT 99999;
COLUMN ename FORMAT A6;
COLUMN hiredate FORMAT A10;
alter session set nls_date_format = 'YYYY/MM/DD';
SELECT empno, ename, hiredate FROM emp WHERE hiredate = '1981/06/09';
결과는 다음과 같습니다. hiredate가 1981/06/09인 레코드 1건이 출력되었습니다.
EMPNO ENAME HIREDATE
------ ------ ----------
7782 CLARK 1981/06/09
예시4
조건삭에서 대/소문자를 구별하는 SQL문의 특징에 대해 직접 확인하겠습니다. 아래와 같이 ename를 ‘SMITH’로 검색했을 때 1건의 데이터가 출력됩니다.
COLUMN empno FORMAT 99999;
COLUMN ename FORMAT A6;
SELECT empno, ename FROM emp WHERE ename = 'SMITH';
EMPNO ENAME
------ ------
7369 SMITH
하지만 아래와 같이 소문자 ‘smith’, 혹은 소문자를 섞은 ‘Smith’로 검색할 경우 아래와 같이 해당되는 레코드를 찾지 못합니다.
SELECT empno, ename FROM emp WHERE ename = 'smith';
SELECT empno, ename FROM emp WHERE ename = 'Smith';
no rows selected
참조1
예시3에서 언급했던 alter문의 참고사항입니다. sqlplus에 로그인한 세션에서만 유효하므로 세션이 끊어지면 다시 원래대로 돌아갑니다.
날짜 서식의 디폴트 값을 미국용으로 변경합니다.
ALTER SESSION SET nls_territory=KOREA;
표시 언어를 한국어로 변경합니다.
ALTER SESSION SET nls_language=KOREAN;
참조2
출력하려는 컬럼에 별명을 붙일 수 있습니다. empno에 “Employee number”, ename에 “Name”이라는 별명을 붙여서 결과를 출력하는 SQL입니다.
SELECT empno "Employee number", ename "Name" FROM emp;
결과는 아래와 같습니다.
Employee number Name
--------------- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7839 KING
7844 TURNER
7900 JAMES
7902 FORD
7934 MILLER
출력하려는 컬럼에 간단한 산술연산식을 넣어 해당 결과를 “Annual”이라는 컬럼명으로 출력하는 SQL입니다.
SELECT empno "Employee number", ename "Name", sal*1200 "Annual" FROM emp;
결과는 아래와 같습니다.
Employee number Name Annual
--------------- ---------- ----------
7369 SMITH 960000
7499 ALLEN 1920000
7521 WARD 1500000
7566 JONES 3570000
7654 MARTIN 1500000
7698 BLAKE 3420000
7782 CLARK 2940000
7839 KING 6000000
7844 TURNER 1800000
7900 JAMES 1140000
7902 FORD 3600000
7934 MILLER 1560000
조건식에는 별명을 사용할 수 없습니다. 출력 대상이 되는 컬럼 ename에 “Name”이라는 별명을 붙이고 WHERE문에서도 “Name”이 ‘KING’인 데이터를 검색하는 SQL입니다.
SELECT empno "Employee number", ename "Name" FROM emp WHERE "Name" = 'KING';
문법에 어긋나기 때문에 에러 메시지가 출력됩니다.
ERROR at line 1:
ORA-00904: "Name": invalid identifier
하지만 제대로 “NAME”가 아닌 ename으로 검색하면 정상적인 결과가 출력됩니다.
SELECT empno "Employee number", ename "Name" FROM emp WHERE ename = 'KING';
결과는 아래와 같습니다.
Employee number Name
--------------- ----------
7839 KING