WHERE 절은 조회할 행을 선별하기 위한 조건식이다. 조건식의 결과 값이 true인 행만 출력한다.
즉 내가 원하는 열 값만 출력하거나 수정할 수 있게 해준다.
간단한 예시를 보자
select * from emp where deptno = 30;
emp 테이블의 모든 정보를 조회하지만 where 절을 통해서 deptno(부서번호) 가 30인 정보만 출력하도록 했다.
이와 같이 where 뒤에는 조건식이 들어와야 하므로 연산자가 잇따르는 경우가 많다.
이 연산자에 대해 알아보도록 하자
1) 논리 연산자
- A AND B : A와 B 조건을 모두 만족하는 것
- A OR B : A 또는 B의 조건을 만족하는 것 (둘중에 하나라도 만족하는 것)
- NOT A: 논리 부정 연산자. (A가 아닌 것)
AND 연산자를 이용하면 여러개의 조건식을 모두 만족시키는 결과를 찾을 수 있다.
select * from emp where deptno = 30 and job = 'CLERK';
마찬가지로 OR 연산자를 이용하면 여러가지 조건식 중 최소 하나 이상을 만족시키는 결과를 보여준다.
select * from emp where deptno = 30 or job = 'CLERK';
위의 두 예시 모두
1. 부서번호가 30
2. 직업이 CLERK
라는 두가지 조건을 가지고 있지만 AND 연산자를 사용하느냐, OR 연산자를 사용하느냐 에 따라 결과가 달라진 것을 볼 수 있다.
select * from emp where not job = 'CLERK';
NOT 연산자를 이용하면 직업이 CLERK 인 사원은 제외하고 결과가 출력된 것을 볼 수 있다.
2) 비교 연산자
비교 연산자를 통해 급여가 얼마 이상인 사원의 정보 등을 출력할 수 있다.
등가 비교 연산자에서 !=, <>, ^= 는 모두 NOT과 동일한 역할을 수행한다.
등가 비교 연산자를 제외하면 일상 생활에서도 쉽게 볼수 있는 연산자이므로 간단한 예시를 보고 넘어가도록 하자.
select * from emp where sal>1000 and job != 'SALESMAN';
급여가 1000이상이고 직업이 SALESMAN 이 아닌 결과를 출력하는 것이다.
NOT job = 'SALESMAN' 으로 해도 결과는 똑같다.
3) SQL 연산자
- IN (list) : OR와 비슷한 역할을 한다. (리스트에 있는 값 중에서 어느 하나라도 일치하면 된다.)
부정 : NOT IN (list) (리스트의 값 모두 포함하지 않는다)
- BETWEEN A AND B : a와 b의 값 사이에 있으면 된다. (a와 b 값이 포함됨)
부정 : NOT BETWEEN A AND B (A와 B 사이의 값을 포함하지 않는다)
- LIKE : 비교문자열과 형태가 일치하면 된다. (와일드카드 문자 %, _ 사용)
부정 : NOT LIKE
- IS NULL : NULL 값인 경우
부정 : NOT IS NULL
IN
직업이 SALESMAN 또는 MANAGER 인 사원을 알아보려고 할 때,
select * from emp where job = 'SALESMAN' or job = 'MANAGER';
위와 같이 입력해도 되지만 'or job = ' 를 여러번 입력해주어야 하는 번거로움이 있다.
때문에 조건식에 많은 조건이 들어가는 경우 IN (list)를 이용 해주면 간편하다.
list안의 조건을 만족하는 것을 자동으로 보여준다.
select * from emp where job in('SALESMAN','MANAGER');
두 SQL 문 모두 같은 결과를 출력한다.
부정의 경우 NOT IN (list) 로 사용되는데 list에 있는 것이 아닌 경우만 출력된다. (모두 아닌 경우)
BETWEEN A AND B
between a and b 연산자는 a와 b 사이의 결과를 도출한다(a와 b도 포함한다)
select * from emp where sal between 2000 and 3000;
위 결과도 마찬가지로
select * from emp where sal >= 2000 and sal <= 3000;
처럼 표현할 수도 있지만 between 연산자를 이용하면 편리하다.
부정의 경우 NOT BETWEEN A AND B 로 사용. A와 B 사이의 값을 포함하지 않는 결과를 보여준다 (A미만 or B초과)
LIKE
LIKE 연산자는 와일드카드 문자를 사용하여 특정한 값 검색을 할 때 같이 사용되는 문자를 말한다
패턴을 정의하여 검색을 효율적으로 할 수 있다.
- % : 개수에 관계없이 모든 문자 ex) S% => S로 시작하는 모든 문자열. S도 포함
- _ : 특정한 위치에 위치한 문자(한글자) ex) _S => 두번째 글자가 S인 문자. / _S% => 두번째글자가 S로 시작하는 모든 문자열
이를 이용하여 사원 이름에 S가 포함되지 않는 사원 데이터를 출력해보도록 하자.
select * from emp where ename not like ('%S%');
이번에는 2번째 글자가 A로 시작하는 모든 사원 데이터를 출력해본다.
select * from emp where ename like('_A%');
부정의 경우 NOT LIKE로 사용하고 특정 문자를 포함하지 않는 결과를 출력해준다.
IS NULL
NULL은 ‘현재 무슨 값인지 확정되지 않은 상태’ 이거나 ‘값 자체가 존재하지 않는 상태’를 나타내는 데이터에 사용한다.
where 문에서는 조건식의 결과가 null이 되면 출력되지 않는다.
때문에 값이 존재하지 않는 null과의 연산을 하게 되면 결과는 null이 되므로 출력되지 않는다.
ex) null + 100 = null
때문에 이 null 값을 확인하기 위해서는 IS NULL 연산자를 사용한다.
select * from emp where comm is not null;
위 예문에서는 comm(추가수당) 이 null 이 아닌 사원 데이터를 출력한다.
0인 데이터를 출력하더라도 null 인 데이터는 출력하지 않는 것을 볼 수 있다.
4) 집합 연산자
두 개의 SELECT 문을 연결 할 때 사용하는 연산자이다.
- UNION : 연결된 SELECT문의 결과 값을 합집합으로 묶어 준다. 결과 값의 중복은 제거된다.
- UNION ALL : 연결된 SELECT문의 결과 값을 합집합으로 묶어 줍니다. 중복된 결과 값도 제거 없이 모두 출력 된다.
- MINUS : 먼저 작성한 SELECT문의 결과 값에서 다음 SELECT문의 결과 값을 차집합 처리한다.
먼저 작성한 SELECT문의 결과 값 중 다음 SELECT 문에 존재하지 않는 데이터만 출력된다.
- INTERSECT : 먼저 작성한 SELECT문과 다음 SELECT문의 결과값이 같은 데이터만 출력된다. 교집합과 같은 의미.
UNION / UNION ALL 연산자를 이용할 때는
- 열의 개수와 순서가 모든 쿼리에서 동일해야 한다.
- 데이터 형식이 호환되어야 한다.
위 두 조건을 만족하여야 한다.
select empno, ename, job, deptno from emp where deptno = 30 UNION
select empno, ename, job, deptno from emp where job = 'SALESMAN';
부서번호가 30인 사원정보를 출력하는 select 문과
직업이 SALESMAN 인 사원정보를 출력하는 select 문을 UNION 연산 하였다.
중복 된 결과는 모두 제거되어 있다.
select empno, ename, job, deptno from emp where deptno = 30 UNION ALL
select empno, ename, job, deptno from emp where job = 'SALESMAN';
union all 을 사용하면 중복되는 값도 제거하지않고 모두 출력되므로
SALESMAN 직업이면서 부서번호가 30인 사원정보가 중복되어 나타나는 것을 확인할 수 있다.
MINUS 연산자는 차집합을 의미한다.
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP MINUS
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP WHERE DEPTNO = 10 ;
emp테이블에서 부서번호가 10인 사원을 뺀 결과를 출력한다.
INTERSECT 연산자는 교집합을 의미한다.
SELECT * FROM EMP WHERE JOB = 'SALESMAN' INTERSECT
SELECT * FROM EMP WHERE DEPTNO = 30 ;
emp 테이블에서 직업이 SALESMAN이고 부서번호가 30인 사원의 교집합만 출력한다.