Oracle 레코드의 선택

Oracle DB

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
제목과 URL을 복사했습니다