데이터베이스 연구실.log

WHERE와 조건 연산자

WHERE 절로 원하는 행만 고르는 방법과 비교 연산자, BETWEEN, IN, LIKE와 ESCAPE, 논리 연산자의 동작, AND와 OR의 우선순위

WHERE비교 연산자BETWEENINLIKEESCAPEANDORNOT연산자 우선순위

#핵심 요약

WHERE 절에 검색 조건을 주면 조건을 만족하는 행만 선택됨

작성 순서는 SELECT → FROM → WHERE, 실행 순서는 FROM → WHERE → SELECT임

문자와 날짜 값은 작은따옴표로 감쌈

BETWEEN a AND b는 양 끝값을 포함함
AND는 OR보다 먼저 평가되므로 섞어 쓸 때는 괄호로 순서를 정함

#개념과 동작 원리

Oracle 연산자 분류:

종류 연산자
산술 연산자 *, /, +, -
비교 연산자 >, <, >=, <=, =, !=, <>, ^=, BETWEEN ... AND, LIKE, IS NULL, IN
논리 연산자 AND, OR, NOT

조건 우선순위(높은 것부터, 공식 문서):

  1. SQL 연산자(산술, 연결)가 조건보다 먼저 평가됨
  2. =, !=, <, >, <=, >=
  3. IS [NOT] NULL, LIKE, [NOT] BETWEEN, [NOT] IN, EXISTS
  4. NOT
  5. AND
  6. OR

expr1 BETWEEN expr2 AND expr3은 expr2 <= expr1 AND expr1 <= expr3과 같음
expr3이 expr2보다 작으면 범위가 비어 아무 행도 맞지 않음
NOT BETWEEN은 NOT (expr1 BETWEEN expr2 AND expr3)임

LIKE에서 %는 0개 이상의 문자, _는 정확히 한 문자에 맞음
% 패턴은 NULL에 맞지 않음

ESCAPE '문자'로 지정한 문자를 %나 _ 앞에 두면 와일드카드가 아니라 글자 그대로 찾음
이스케이프 문자 자체는 두 번 써서 찾음
%와 _는 이스케이프 문자로 쓸 수 없음

#필수 명령어 또는 SQL

#비교 연산자

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename, sal, job, hiredate
  FROM emp
 WHERE ename = 'SCOTT';

결과 해석:

날짜 비교는 세션 날짜 형식에 맞춘 문자열로 했음

SQL Developer 또는 SQL*Plus현재 세션 설정만 변경함
ALTER SESSION SET nls_date_format = 'RR/MM/DD';
SQL Developer 또는 SQL*Plus조회만 함
SELECT ename, hiredate
  FROM emp
 WHERE hiredate = '81/11/17';

결과 해석:

ALTER SESSION은 현재 세션에만 적용됨
문자열을 날짜로 바꾸는 암시적 변환은 형 변환과 날짜 포맷에서 다룸

#BETWEEN, IN

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename, sal
  FROM emp
 WHERE sal BETWEEN 1000 AND 3000;

SELECT ename, sal
  FROM emp
 WHERE sal NOT BETWEEN 1000 AND 3000;

SELECT ename, sal, job
  FROM emp
 WHERE job IN ('SALESMAN', 'ANALYST', 'MANAGER');

결과 해석:

실행 계획 읽기는 성능 분석과 튜닝 분야에서 다룸

#LIKE와 ESCAPE

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename FROM emp WHERE ename LIKE 'S%';
SELECT ename FROM emp WHERE ename LIKE '%T';
SELECT ename FROM emp WHERE ename LIKE '_M%';
SELECT ename, job FROM emp WHERE job NOT LIKE '%SALES%';

결과 해석:

실습에서는 이름에 %가 들어간 행('A%B', 'A%%B')을 넣고 "두 번째 철자가 %인 사원"을 찾는 문제를 냈음
수업 자료에 답은 없음
공식 문서 규칙대로 쓰면 다음과 같음

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename FROM emp WHERE ename LIKE '_\%%' ESCAPE '\';
SELECT ename FROM emp WHERE ename LIKE '_\%\%%' ESCAPE '\';

결과 해석:

실습의 테스트 행 입력(INSERT ... COMMIT)은 실습 테이블을 바꿈

#논리 연산자와 우선순위

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename, sal, job
  FROM emp
 WHERE job = 'SALESMAN' AND sal >= 1200;

SELECT ename, sal, job
  FROM emp
 WHERE job = 'SALESMAN' OR job = 'ANALYST' AND sal > 2000;

SELECT ename, sal, job
  FROM emp
 WHERE (job = 'SALESMAN' OR job = 'ANALYST') AND sal > 2000;

결과 해석: 두 번째 문장은 AND가 먼저 묶여 "SALESMAN 전체 또는 월급 2000 초과 ANALYST"가 됨
세 번째 문장은 "SALESMAN이나 ANALYST 중 월급 2000 초과"임
실습에서는 두 결과가 다른지 비교했음

#사용 조건과 주의사항

실습 답 일부에 따옴표 위치 오류, 잘못된 컬럼, 철자 오류가 있음

NULL은 =로 비교할 수 없음
NULL 처리를 봄

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기