WHERE와 조건 연산자
WHERE 절로 원하는 행만 고르는 방법과 비교 연산자, BETWEEN, IN, LIKE와 ESCAPE, 논리 연산자의 동작, AND와 OR의 우선순위
#핵심 요약
WHERE 절에 검색 조건을 주면 조건을 만족하는 행만 선택됨
작성 순서는 SELECT → FROM → WHERE, 실행 순서는 FROM → WHERE → SELECT임
문자와 날짜 값은 작은따옴표로 감쌈
BETWEEN a AND b는 양 끝값을 포함함AND는 OR보다 먼저 평가되므로 섞어 쓸 때는 괄호로 순서를 정함
#개념과 동작 원리
Oracle 연산자 분류:
| 종류 | 연산자 |
|---|---|
| 산술 연산자 | *, /, +, - |
| 비교 연산자 | >, <, >=, <=, =, !=, <>, ^=, BETWEEN ... AND, LIKE, IS NULL, IN |
| 논리 연산자 | AND, OR, NOT |
조건 우선순위(높은 것부터, 공식 문서):
- SQL 연산자(산술, 연결)가 조건보다 먼저 평가됨
=,!=,<,>,<=,>=IS [NOT] NULL,LIKE,[NOT] BETWEEN,[NOT] IN,EXISTSNOTANDOR
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
#비교 연산자
SELECT ename, sal, job, hiredate
FROM emp
WHERE ename = 'SCOTT';결과 해석:
날짜 비교는 세션 날짜 형식에 맞춘 문자열로 했음
ALTER SESSION SET nls_date_format = 'RR/MM/DD';SELECT ename, hiredate
FROM emp
WHERE hiredate = '81/11/17';결과 해석:
ALTER SESSION은 현재 세션에만 적용됨
문자열을 날짜로 바꾸는 암시적 변환은 형 변환과 날짜 포맷에서 다룸
#BETWEEN, IN
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
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')을 넣고 "두 번째 철자가 %인 사원"을 찾는 문제를 냈음
수업 자료에 답은 없음
공식 문서 규칙대로 쓰면 다음과 같음
SELECT ename FROM emp WHERE ename LIKE '_\%%' ESCAPE '\';
SELECT ename FROM emp WHERE ename LIKE '_\%\%%' ESCAPE '\';결과 해석:
실습의 테스트 행 입력(INSERT ... COMMIT)은 실습 테이블을 바꿈
#논리 연산자와 우선순위
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 처리를 봄