검색될 행의 제한 : WHERE
■ 검색될 행의 제한 : WHERE
명칭 |
설명 |
WHERE |
쿼리에서 반환되는 행을 제한 |
만족해야 할 조건을 포함하며 조건이 참일 경우 조건을 만족하는 행이 반환 |
■ 구문
SELECT *|{[DISTINCT] column|표현식 [별칭],...}
FROM table
[WHERE 조건(s)];
■ WHERE 절의 기본 사용법
- WHERE 절은 열 이름, 비교 조건, 상수 또는 값 목록 등 3가지의 요소로 구성
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE dept_id = 100;
- "WHERE dept_id = 100" 처럼 숫자는 단일 인용부호('')를 사용하지 않고 검색
- 문자열 및 날짜는 단일 인용부호로 묶어야 하며 대소문자를 구분
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE emp_name = '김 혜수';
공백을 포함하여 조회하여 조회되지 않음
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE emp_name = '김혜수';
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = 부사장;
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = '부사장';
SELECT emp_id, emp_name, birthdate, hiredate
FROM y_emp;
SELECT emp_id, emp_name, salary, hiredate
FROM y_emp
WHERE hiredate = '2001/03/19';
■ 일반 비교연산자의 사용
연산자 |
설명 |
= |
같다 |
> |
보다 크다 |
< |
보다 작다 |
>= |
보다 크거나 같다 |
<= |
보다 작거나 같다 |
<>, !=, ^= |
같지 않다 |
SELECT emp_id, emp_name, salary
FROM y_emp
WHERE salary <= 400;
SELECT emp_id, emp_name, salary
FROM y_emp
WHERE salary*12 > 8000;
- 표현식에 대한 비교 시 WHERE 절에는 별칭을 사용할 수 없다.
SELECT emp_id, emp_name, salary annsal
FROM y_emp
WHERE annsal > 8000;
- 대소의 비교는 숫자만 가능한 것이 아니다.
- 문자나 날짜 데이터도 대소의 비교가 가능하다.
- 문자는 영문자 순(ASCII 코드 값 기준)으로 A가 가장 작고 Z가 가장 크다.
- 날짜는 과거 -> 미래로 갈수록 큰 값으로 평가
SELECT emp_id, emp_name, position, hiredate
FROM y_emp
WHERE hiredate > '2017/01/01';
■ 기타 SQL 연산자
연산자 |
설명 |
BETWEEN ··· AND ··· |
두 값의 범위 사이 |
IN(list ···) |
괄호 안의 값 목록 중 하나와 일치 |
LIKE |
문자 패턴 일치 |
%는 0개 이상의 문자 |
_는 하나의 문자 |
SELECT emp_name, salary
FROM y_emp
WHERE salary BETWEEN 600 AND 700;
SELECT emp_id, emp_name, salary, mgr_id
FROM y_emp
WHERE mgr_id IN (1001,1002,1003);
- 괄호 안의 목록에 사용되는 값이 문자 또는 날짜인 경우에는 단일 인용부호를 사용하여 묶어주어야 한다.
SELECT emp_name, position, dept_id
FROM y_emp
WHERE position IN ('부장','차장');
SELECT emp_id, emp_name
FROM y_emp
WHERE emp_name LIKE '김%';
SELECT emp_id, emp_name
FROM y_emp
WHERE emp_name LIKE '_승%';
- 검색할 문자에 실제로 '%' 및 '_' 문자가 포함된 경우에는 해당문자 앞에 임의의 문자를 지정하고 ESCAPE 옵션을 사용하여 이스케이프 문자로 지정
SELECT *
FROM pay_grade
WHERE pay_level LIKE '%@_B' ESCAPE '@';
■ NULL 조건
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE dept_id IS NULL;
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE dept_id IS NOT NULL;
■ 논리 연산자(AND, OR, NOT)
연산자 |
설명 |
AND |
WHERE 절의 조건을 모두 만족하면 데이터 반환 |
OR |
조건 중 하나만 만족하면 레코드를 선택 |
NOT |
NOT 연산자 다음에 오는 조건에 대해 거짓인 행 반환 |
BETWEEN, LIKE, IN 등 다른 SQL 연산자와 함께 사용할 수 있다. |
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = '사원'
AND dept_id = 400;
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = '사원'
OR dept_id = 400;
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position NOT IN ('과장','대리','사원');
■ 연산자 우선 순위
순위 |
연산자 |
1 |
산술연산자(X, /, +, -) |
2 |
연결연산자(||) |
3 |
비교연산자(=, >, >=, <, <=, <>) |
4 |
IS [NOT] NULL, LIKE, [NOT] IN |
5 |
[NOT] BETWEEN |
6 |
NOT |
7 |
AND |
8 |
OR |
SELECT emp_name, position, salary
FROM y_emp
WHERE position = '차장'
OR position = '부장'
AND salary > 700;
- 예제의 결과에서 직급이 차장인 사원은 SALARY가 700을 넘지 않아도 출력이 되었다.
- 즉 연산자 우선순위 규칙에 의해 AND로 연결된 두 조건문에 대하여 먼저 평가되었음을 알 수 있다.
SELECT emp_name, position, salary
FROM y_emp
WHERE (position = '차장'
OR position = '부장')
AND salary > 700;