Oracle SQL
[SQL] WHERE 절
YoonJuHan
2023. 4. 5. 19:07
WHERE
- WHERE 절을 사용하여 쿼리에 반환되는 행을 제한
- FROM 절 다음에서 조건을 표현하기 위해 열 이름, 표현식, 비교 연산자 및 상수로 구성
- 단일 SELECT 문장에서 WHERE 절은 한 번만 사용 가능
- WHERE 절에 여러 조건을 지정하기 위하여 AND, OR과 같은 논리 연산자를 사용
- WHERE 절의 기본 사용법
- 열 이름, 비교 조건, 상수 또는 값 목록 등 세 가지 요소로 구성
- 문자열 및 날짜는 단일 인용부호로 묶어야 하며 대소문자 구분
- 날짜는 기본 날짜 형식을 사용
- 100번 부서에서 근무하는 사원에 대한 사번, 이름, 직급, 부서번호를 나열
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE dept_id = 100;
- 직급이 부사장인 직원의 사번, 이름, 직급, 부서번호를 출력
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = '부사장';
- 2001년 3월 19일에 입사한 사원의 사원번호, 이름, 급여, 입사일을 조회
SELECT emp_id, emp_name, salary, hiredate
FROM y_emp
WHERE hiredate = '01/03/19';
- 결과가 나오지 않거나 오류가 발생하는 경우
-- 결과가 나오지 않음(오류는 아님) : 공백을 포함하고 있어서 같은 이름이 없음
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 = 부사장;
일반 비교 연산자의 사용
- 주로 표현식을 다른 값이나 표현식과 대소비교를 하기 위해 사용
일반적인 비교 연산자의 종류 | |
연산자 | 의미 |
= | 같다 |
> | 보다 크다 |
< | 보다 작다 |
>= | 보다 크거나 같다 |
<= | 보다 작거나 같다 |
<>, !=, ^= | 같지 않다 |
- 급여가 400 이하인 사원의 이름과 급여를 검색
SELECT emp_id, emp_name, salary
FROM y_emp
WHERE salary <= 400;
- WHERE 절에서 salary * 12 처럼 표현식에 대한 비교를 할 수도 있다. 연봉이 8000보다 많은 직원을 검색
SELECT emp_name, salary*12 annsal
FROM y_emp
WHERE salary * 12 > 8000;
- 2017년 1월 1일 이후에 입사한 사원을 검색
SELECT emp_id, emp_name, position, hiredate
FROM y_emp
WHERE hiredate > '17/01/01';
- 별칭을 비교 조건으로 하면 오류 발생
SELECT emp_name, salary * 12 annsal
FROM y_emp
WHERE annsal > 8000;
기타 SQL 연산자
- SQL에서만 사용되는 비교 연산자
-
모든 데이터 유형에 적용
SQL 연산자 종류 | |
연산자 | 의미 |
BETWEEN a AND b | a와 b의 값 사이 |
IN (list...) | 괄호 안의 값 목록 중 하나와 일치 |
LIKE | 문자의 패턴 일치 |
- BETWEEN a AND b
- BETWEEN 범위 조건을 사용하면 값의 범위에 따라 행을 표시
- 하한값과 상한값도 지정된 범위에 포함
- BETWEEN 조건으로 지정한 값은 하한값을 먼저 지정
- IN(list...)
- IN 연산자 다음의 괄호 안에 원하는 값의 리스트를 명시
- 리스트에 포함된 값중 하나와 일치되는 값을 포함하는 행이 결과로 반환
- LIKE
- 검색할 값을 정확하게 알지 못하는 경우 LIKE 조건을 사용하여 문자 패턴이 일치하는 행을 선택
- 검색 문자열은 % 또는 _ 이 두 가지 기호를 사용하여 구성
- %는 0개 이상의 문자 대체
- _는 하나의 문자만 대체
- %나 _가 포함된 데이터의 검색 방법
- %나 _앞에 ESCAPE 문자로 지정
- ESCAPE문자는 사용자 임의로 지정 가능
- 급여가 600 이상 700 이하인 사원 검색
SELECT emp_name, salary
FROM y_emp
WHERE salary BETWEEN 600 AND 700;
- 관리자의 사원 번호가 1001, 1002, 1003인 모든 사원의 사원 번호, 이름, 급여 및 관리자의 사원 번호를 검색
SELECT emp_id, emp_name, salary, mgr_id
FROM y_emp
WHERE mgr_id IN (1001, 1002, 1003);
- 단일 인용 부호를 사용하여 직급이 부장 또는 차장인 사원을 검색
SELECT emp_name, position
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 '_승%';
- PAY_LEVEL이 "_B"인 정보를 검색
SELECT *
FROM pay_grade
WHERE pay_level LIKE '%\_B' ESCAPE '\';
NULL 조건
- NULL 값은 어떤 값과도 동일성 여부를 판별 불가
- = NULL을 사용하여 비교 불가능
- NULL 여부를 테스트하기 위한 비교 연산자를 사용
- NULL인 데이터를 보기 위해서 IS NULL 연산자를 사용
- NULL이 아닌 데이터를 조회하기 위해서는 IS NOT NULL 연산자를 사용
- 부서 정보가 NULL인 사원을 검색
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE dept_id IS NULL;
- COMM이 NULL이 아닌 사원 즉 회사에서 Commission을 받는 사원을 검색
SELECT emp_id, emp_name, comm
FROM y_emp
WHERE comm IS NOT NULL;
논리 연산자 [AND, OR, NOT]
- 단일 SELECT 문에 WHERE 절은 한 번만 사용
- WHERE 절에 여러 조건을 조합하여 출력될 행을 더욱더 제한하기 위하여 논리 연산자를 사용
- 논리 연산자의 종류 : AND, OR, NOT
- AND
- WHERE 절의 조건을 모두 만족하는 데이터를 반환
- 조건 가운데 어느 한 가지 조건에 대한 결과라도 거짓 또는 NULL일 경우 해당 행은 포함되지 않는다.
- OR
- OR 연산자는 조건 중 하나만 만족하면 레코드를 선택
- 조건 가운데 어느 한 가지 조건에 대한 결과가 거짓 또는 NULL일 경우에도 해당 행은 결과에 포함된다.
- NOT
- NOT 연산자 다음에 오는 조건에 대해 거짓인 행이 반환
- NOT 연산자는 BETWEEN, LIKE, IN 등 다른 SQL 연산자와 함께 사용
- 쉽게 말해 거짓은 참으로 참은 거짓으로 결과를 뒤집는 것
- 사용 예시 : NOT IN, NOT LIKE, NOT BETWEEN, IS NOT NULL
- 직급이 '사원'이고 400번 부서에 속하는 사원을 검색
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = '사원' AND dept_id = 400;
- 직급이 '사원'이거나 400번 부서에 속하는 사원을 검색
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = '사원' OR dept_id = 400;
- 직급이 과장, 대리, 사원이 아닌 사원을 검색
SELECT emp_id, position, dept_id
FROM y_emp
WHERE position NOT IN ('과장', '대리', '사원');
연산자 우선 순위 규칙
- 표현식을 평가하고 계산하는 순서를 결정
- 괄호를 사용하여 우선순위 변경 가능
기본 우선 순위 순서 | |
순위 | 연산자 |
1 | 산술 연산자 (*, /, +, -) |
2 | 연결 연산자 (||) |
3 | 비교 연산자 (=, >, >=, <, <=, <>) |
4 | IS [NOT] NULL, LIKE, [NOT] IN |
5 | [NOT] BETWEEN |
6 | NOT |
7 | AND |
8 | OR |
- 직급이 차장 이거나 부장이고 급여가 700이 넘는 사원을 검색
SELECT emp_name, position, salary
FROM y_emp
WHERE position = '차장' OR position = '부장' AND salary > 700;
- 차장 또는 부장인 사원 가운데 급여가 700이 넘는 사원을 검색
SELECT emp_name, position, salary
FROM y_emp
WHERE (position = '차장' OR position = '부장') AND salary > 700;