이번에는 행의 특정 데이터 값을 조회하거나 비교하여 연산 처리 하는 방법을 알아보겠습니다.
WHERE 절은 WHERE라는 단어에서 알 수 있듯이 조건을 지정해 데이터 값을 ‘어디에서 어떻게’ 가져올지 정합니다
WHERE 절을 사용하여 조회하려는 조건을 지정할 수 있습니다.
WHERE 절은 FROM 절 다음에 위치합니다.
수행될 조건 절에는 비교 연산자, SQL 연산자, 논리 연산자, 열 이 름, 표현식, 숫자, 문자 등을 쓸 수 있습니다.
SELECT 문에서 WHERE 절은 다음 형식으로 쓸 수 있습니다.
SELECT 열 이름 --------➋ 출력하려는 열
FROM 테이블 이름 ------➊ 참조하려는 테이블
WHERE 원하는 조건; ----➌ 조건식
데이터가 조회되는 논리 순서를 살펴봅시다.
➊ 참조하려는 테이블로부터(FROM)
➋ 해당 조건식으로(WHERE)
➌ 열을 선택(SELECT)하여 조회합니다.
WHERE 절에는 연산자(operator)를 같이 쓸 수 있는데, 연산자는 operator라는 의미 그대로 데이터 값을 조작하는 데 사용됩니다.
연산자는 크게 비교 연산자(그리고 부정 비교 연산자), SQL 연산자(그리고 부정 SQL 연산자), 논리 연산자로 구분할 수 있습니다.
| 연산자의 종류 | 설명 | 예시 |
|---|---|---|
| 비교 연산자 | 조건을 비교 | =,<,>등 |
| SQL 연산자 | 조건 비교를 확장 | BETWEEN,IN 등 |
| 논리 연산자 | 조건 논리를 연결 | AND,OR 등 |
연산자의 우선순위는 다음과 같습니다.
괄호 > 부정 연산 > 비교 연산 > SQL 연산 순으로 처리됩니다.
논리 연산자는 NOT, AND, OR 순으로 처리됩니다.
연산자의 순서는 데이터 조회 속도에 영향을 줄 수 있습니다.
조회 성능에 관한 부분은 고급 SQL 영역
| 구분 | 연산자 | 의미 |
|---|---|---|
| = | 같다. | |
| 비교 연산자 | <>(!=) | 같지않다. |
| > | 보다크다. | |
| >= | 보다 크거나 같다. | |
| < | 보다 작다. | |
| <= | 보다 작거나 같다. |
특정 데이터 값을 선택할 때 주로 사용하는 연산자는 ‘같다’라는 의미를 가진 등호 연산자인 =입니다.
SELECT *
FROM employees
WHERE employee_id = 100;
실습
select *
from hr.employees
where FIRST_NAME = 'David';

부등호 연산자 >= 연산자는 ‘크거나 같을 경우’, 즉 ‘~ 이상’이라는 의미입니다.
SELECT *
FROM employees
WHERE employee_id >= 105;
실습
select *
from hr.employees
where EMPLOYEE_ID <= 150;

SQL 연산자는 비교 연산자보다 조금 더 확장된 연산자로 자주 쓰는 연산자입니다. 종류는 다음과 같습니다.
SQL 연산자의 종류
| 구분 | 연산자 | 의미 |
|---|---|---|
| SQL 연산 | BETWEEN a AND b | a와 b 사이에 값이 있다 (a, b 값 포함) |
| SQL 연산 | IN (list) | list 중 어느 값이라도 일치한다. |
| SQL 연산 | LIKE ‘비교 문자’ | 비교 문자와 형태가 일치한다 (%, _ 사용). |
| SQL 연산 | IS NULL | null 값을 갖는다. |
BETWEEN 연산자는 두 값의 범위에 해당하는 행을 출력할 때 사용합니다. a 이상 b 이하의 값을 조회하라는 의미로 >=와 <= 연산자를 함께 사용한 것과 같습니다.
실습
select *
from hr.employees
where SALARY BETWEEN 10000 and 20000;

조회하고자 하는 데이터 값이 여러 개일 때 사용합니다.
= 연산자와 유사하지만 = 연산자는 조회 조건으로 데이터 값을 하나만 지정할 수 있는데 반해 IN 연산자는 데이터 값을 여러 개, 즉 목록(list)으로 지정할 수 있습니다.
여러 개의 값 목록 중에서 하나의 값이라도 만족하면 조건에 해당하는 결과를 출력합니다.
이러한 연산자를 다중 행 연산자라고도 부릅니다.
실습
select *
from hr.employees
where SALARY in (10000, 17000 , 24000);

LIKE 연산자는 조회 조건 값이 명확하지 않을 때 사용합니다. LIKE 연산자는 ‘~와 같다’라는 의미입니다.
LIKE 연산자는 %와 _ 같은 기호 연산자(wild card)와 함께 사용합니다.
조건에는 문자나 숫자를 포함할 수 있습니다.
%는 ‘모든 문자’라는 의미고, _는 ‘한 글자’라는 의미입니다.
실습
select *
from hr.employees
where JOB_ID like 'AD%';

employees 테이블에서 AD를 포함하면서 AD 뒤에 따라오는 문자열이 3자리인 데이터 값을 갖는 직원 정보를 조회하세요(AD+3자리 데이터 값).
SELECT *
FROM employees
WHERE job_id LIKE 'AD___'; ----_가 3개, 즉 AD 뒤에 따라오는 문자열이 3자리인 데이터
실습
SELECT *
from HR.EMPLOYEES
where JOB_ID like 'AD___'; ----_가 3개, 즉 AD 뒤에 따라오는 문자열이 3자리인 데이터

IS NULL 연산자는 데이터 값이 null인 경우를 조회하고자 할 때 사용합니다.
null은 값이 지정되지 않았기 때문에 값이 없어 알 수 없는 값을 말합니다. null은 0이나 공백(space)과는 엄연히 다릅니다. 0은 숫자 값이고 공백은 문자 값이므로 다른 유형의 데이터 값입니다.
실습
SELECT *
from HR.EMPLOYEES
where MANAGER_ID is null;

논리 연산자는 여러 조건을 논리적으로 연결할 때 사용하는 연산자입니다. SQL 문의 조건을 계속 추가해야 할 때 필수 연산자입니다.
논리 연산자의 종류
| 구분 | 연산자 | 의미 |
|---|---|---|
| 논리 연산 | AND | 기술 순서로 봤을 때 앞의 조건과 뒤의 조건이 동시에 참(TRUE)이어야 참이다. 즉, 앞뒤 조건을 동시에 만족해야 한다. |
| 논리 연산 | OR | 앞의 조건이 참(TRUE)이거나 뒤의 조건이 참(TRUE)인 경우, 즉 한쪽이라도 참이면 참이다. |
| 논리 연산 | NOT | 뒤의 조건에 대해 반대 결과를 반환한다. |
특정 조건을 모두 만족해야 할 때는 AND 연산자
AND 연산자 : 교집합
SELECT *
from HR.EMPLOYEES
where SALARY > 4000
and job_id = 'IT_PROG';

OR 연산자 : 합집합
SELECT *
from HR.EMPLOYEES
where SALARY > 4000
AND job_id = 'IT_PROG'
OR job_id = 'FI_ACCOUNT';

NOT 연산자는 조건을 부정으로 만드는 역할을 하기 때문에 부정 연산자로 불립니다. 부정 연산자에는 부정 ‘비교 연산자’와 부정 ‘SQL 연산자’가 있습니다.
부정 연산자는 일반 연산자와 반대로 ‘조건에 맞는’ 경우가 아니라 ‘조건에 맞지 않는’ 경우의 값을 반환합니다.
부정 연산자의 종류
| 구분 | 연산자 | 의미 |
|---|---|---|
| 부정 비교 | != | 같지 않다. |
| 부정 비교 | <> | 같지 않다 (ISO 표준). |
| 부정 비교 | NOT 열 이름 = | ~와 같지 않다. |
| 부정 비교 | NOT 열 이름 > | ~보다 크지 않다. |
| 부정 SQL | NOT BETWEEN a AND b | a와 b 사이에 값이 없다. |
| 부정 SQL | NOT IN (list) | list 값과 일치하지 않는다. |
| 부정 SQL | IS NOT NULL | null 값을 갖지 않는다. |
즉, 일반 연산자와 반대 개념이라고 이해하면 됩니다
사실 비교 연산자, SQL 연산자, 논리 연산자, 부정 연산자 등 어떤 연산자가 어느 연산자에 속하는지 연산자의 종류까지 외울 필요는 없습니다. 각 연산자가 각각 어떤 역할을 하는지 개념만 알고 있으면 됩니다.
SELECT *
from HR.EMPLOYEES
where employee_id <> 105;

SELECT *
from HR.EMPLOYEES
where manager_id is not null; ----null 값이 아닌 경우

중요
!=,<> -> 같지않다
AND 논리곱
OR 논리합
A !> B 크지않다
A가 B보다
A !< B 작지않다