CH5. 더 정확하고 다양하게 결과를 출력하는 WHERE절과 연산자
*출처: <비전공자도 기초부터 확실하게! 오라클로 배우는 데이터베이스 입문>, 이지훈, 이지스퍼블리싱
5-1. 필요한 데이터만 쏙 출력하는 WHERE절
- WHERE절은 SELECT문으로 데이터를 조회할 때 특정 조건을 기준으로 원하는 행을 출력하는 데 사용한다.
- 그리고 여러 연산자를 함께 사용하면 더욱 세밀하게 데이터를 검색할 수 있다.
SELECT * FROM EMP WHERE DEPTNO = 30;
// 부서 번호가 30인 데이터만 출력한다.
SELECT [조회할 열1 이름], [열2 이름], .... ,[열N 이름]
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하기 위한 조건식];
키워드 | 필수 요소 | 선택 요소 | 설명 |
WHERE | 조건식 | - | 조회 조건 지정 |
5-2. 여러 개 조건식을 사용하는 AND, OR 연산자
- WHERE절에서는 조건식을 여러 개 지정할 수 있다. 이때 사용하는 것이 바로 논리 연산자 AND, OR이다.
- WHERE절에서 비교하는 데이터가 문자열일 경우 작은따옴표(' ')로 묶어준다. 앞뒤에 공백이 있으면 공백도 문자로 인식하기 때문에 주의해야한다.
- WHERE절에 사용할 수 있는 조건식의 개수는 제한이 없다.
SELECT * FROM EMP WHERE DEPTNO = 30 AND JOB = 'SALESMAN';
// AND 연산자 사용
// EMP 테이블에서 부서번호가 30 이면서 직책이 SALESMAN인 직원들의 행만 가져온다.
SELECT * FROM EMP WHERE DEPTNO = 30 OR JOB = 'CLERK';
// OR 연산자 사용
// EMP 테이블에서 부서 번호가 30 또는 직책이 CLERK인 직원들의 행만 가져온다
5-3. 연산자 종류와 활용 방법 알아보기
1) 산술 연산자
- 자바와 비슷하다. (+,-,*,/) 그러나 나머지 연산자(%)는 없다. 대신 오라클에서는 mod 함수를 통해 나머지 연산 같은 기능을 사용할 수 있다.
* 산술 연산자 사용 예)
SELECT * FROM EMP WHERE SAL*12 = 36000;
// EMP 테이블에서 SAL*12가 36000인 행을 가져온다.
2) 비교 연산자
2-1) 대소 비교 연산자
- 비교 연산자는 SQL문을 작성할 때 자주 사용하는 연산자로 연산자 앞뒤에 있는 데이터 값을 비교하는데 사용한다.
* 대소 비교 연산자 사용 예)
SELECT * FROM EMP WHERE SAL >= 3000;
// EMP 테이블에서 급여가 3000이상인 행을 가져온다.
- 대소 비교 연산자는 비교 대상인 데이터가 숫자가 아닌 문자열일 때도 사용할 수 있다.
SELECT * FROM EMP WHERE ENAME >= 'F';
// EMP 테이블에서 이름의 첫문자가 F와 같거나 뒤쪽인 것만 검색해서 갖고 온다.
3) 등가 비교 연산자
- ' = ' : SQL 문에서는 대입의 의미가 아니라 본래 기호 의미 그대로 '양쪽 데이터가 같은지 다른지' 확인하는데 사용한다.
- '같지 않다.'는 의미로 사용할 수 있는 방식: !=, <>, ^= (실무에서는 !=와 <>를 많이 사용한다.)
4) 논리 부정 연산자 NOT
- 보통 NOT 연산자를 IN, BETWEEN, IS NULL 연산자와 함께 복합적으로 사용하는 경우가 많고, 대소/등가/비교 연산자에 직접 사용하는 경우는 별로 없다.
- 하지만 복잡한 여러 개 조건식이 AND, OR로 묶여 있는 상태에서 정반대 결과를 얻고자 할 때에는 유용하게 사용할 수 있다. NOT 연산자로 한 번에 뒤집어서 사용하는 것이 간편하고 SQL문 작성 시간도 줄일 수 있기 때문이다.
SELECT * FROM EMP WHERE NOT SAL = 3000;
// EMP 테이블에서 SAL 가 3000이 아닌 행을 가져온다. 아래 문장과 동일한 의미이다.
// SELECT * FROM EMP WHERE SAL != 3000;
5) IN 연산자
- IN 연산자를 사용하면 특정 열에 해당하는 조건을 여러 개 지정할 수 있어 여러 조건식을 많이 작성할 필요가 없다.
// OR 연산자를 사용하여 여러 개 조건을 만족하는 데이터를 출력하기
SELECT * FROM EMP WHERE JOB = 'MANAGER' OR JOB = 'SALESMAN' OR JOB = 'CLERK';
// IN 연산자를 사용하여 출력하기
SELECT * FROM EMP WHERE JOB IN ('MANAGER', 'SALESMAN', 'CLERK');
SELECT [조회할 열1 이름], [열2 이름], .... ,[열N 이름]
FROM [조회할 테이블 이름]
WHERE 열 이름 IN (데이터1, 데이터2, 데이터3,..., 데이터N);
키워드 | 필수 요소 | 선택 요소 | 설명 |
IN | 열 이름 조회할 열의 데이터 목록 |
- | 특정 열에 포함된 데이터를 여러 개 조회할 때 사용 |
- IN 연산자 앞에 NOT 연산자를 적용하면 최종 결과의 반대 값을 반환해준다.
SELECT * FROM EMP WHERE JOB NOT IN ('MANAGER', 'SALESMAN', 'CLERK');
// 직책이 MANAGER, SALESMAN, CLERK이 아닌 행을 가져온다.
6) BETWEEN A AND B 연산자
// 급여가 2000~3000인 사원 데이터를 조회
// 1. 대소 비교 연산자와 AND 연산자를 사용하여 출력하기
SELECT * FROM EMP WHERE SAL>=2000 AND SAL<=3000;
// 2. BETWEEN A AND B 연산자를 사용하여 출력하기
SELECT * FROM EMP WHERE SAL BETWEEN 2000 AND 3000;
SELECT [조회할 열1 이름], [열2 이름], .... ,[열N 이름]
FROM [조회할 테이블 이름]
WHERE 열 이름 BETWEEN 최솟값 AND 최댓값;
키워드 | 필수 요소 | 선택 요소 | 설명 |
BETWEEN A AND B | 열 이름, 최솟값, 최댓값 | - | 일정 범위 내의 데이터를 조회할 때 사용 |
7) LIKE 연산자와 와일드 카드
- LIKE 연산자는 이메일이나 게시판 제목 또는 내용 검색 기능처럼 일부 문자열이 포함된 데이터를 조회할 때 사용한다.
SELECT * FROM EMP WHERE ENAME LIKE 'S%';
//ENAME 열 값이 대문자 S로 시작하는 데이터를 조회한다.
- 이 조건식에서 사용한 % 기호를 와일드 카드라고 한다. 와일드 카드는 특정 문자 또는 문자열을 대체하거나 문자열 데이터의 패턴을 표기하는 특수 문자이다. LIKE 연산자와 함께 사용할 수 있는 와일드 카드는 _와 %이다.
종류 | 의미 |
_ | 어떤 값이든 상관없이 한 개의 문자 데이터를 의미 |
% | 길이와 상관없이(문자 없는 경우도 포함) 모든 문자 데이터를 의미 |
- 만약 사원 이름의 두번째 글자가 L인 사원 데이터를 조회하고 싶다면 다음과 같이 LIKE 연산자에 와일드 카드를 활용할 수 있다.
SELECT * FROM EMP WHERE ENAME LIKE '_L%';
- 어떤 단어가 포함된 제목 또는 본문 검색과 같은 기능을 구현할 때는 원하는 문자열 앞뒤 모두 와일드카드(%)를 붙여줄 수 있다. 이름에 AM이라는 단어를 포함하는 사원을 조회할 때 SELECT문은 다음과 같이 작성할 수 있다.
SELECT * FROM EMP WHERE ENAME LIKE '%AM%';
- 이름에 AM이라는 단어가 포함된 데이터를 제외한 결과를 얻고자 할 때는 다음과 같이 LIKE 연산자 앞에 NOT을 붙여 사용할 수 있다.
SELECT * FROM EMP WHERE ENAME NOT LIKE '%AM%';
- 와일드 카드 문자가 데이터의 일부인 경우에는 ESCAPE절을 사용하여 _,%를 와일드 카드 기호가 아닌 데이터로서의 문자로 다루는 것이 가능하다. 예를 들어 LIKE문을 사용하여 데이터 앞에 A_A 문자를 가지고 있는 데이터를 찾으려면 다음과 같이 SQL문을 작성하면 된다.
SELECT * FROM SOME_TABLE
WHERE SOME_COLUMN LIKE 'A|_A%' ESCAPE '|';
// A|_A%에서 | 문자 바로 뒤에 있는 _는 와일드 카드 기호로서가 아닌 데이터에 포함된 문자로 인식하라는 의미이다.
// ESCAPE 문자 |는 ESCAPE절에서 지정할 수 있고 |외에 다른 문자도 지정하여 사용할 수 있다.
8) IS NULL 연산자
- 특정 열 또는 연산의 결과 값이 NULL인지 여부를 확인하려면 IS NULL 연산자를 사용해야 한다.
- 반대의 경우, 즉 NULL이 아닌 데이터만 조회하려면 IS NOT NULL 을 사용한다.
- IS NULL과 IS NOT NULL 연산자는 매우 자주 사용되므로 사용법을 꼭 기억해야한다.
SELECT * FROM EMP WHERE COMM IS NULL;
// EMP 테이블에서 커미션이 null인 행을 조회한다.
9) 집합 연산자
- SQL문에서는 SELECT문을 통해 데이터를 조회한 결과를 하나의 집합과 같이 다룰 수 있는 집합 연산자를 사용할 수 있다. 그리고 두 개 이상의 SELECT문의 결과 값을 연결할 때 사용한다.
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP WHERE DEPTNO = 20;
//집합 연산자 UNION을 사용하여 10번 부서에 근무하는 사원과 20번 부서에 근무하는 사원의 정보가 합쳐져 출력된다.
- 주의할 점은 집합 연산자로 두 개의 SELECT문의 결과 값을 연결할 때, 각 SELECT문이 출력하려는 열 개수와 각 열의 자료형이 순서별로 일치해야 한다는 것이다.
- 오라클 데이터베이스에서 사용하는 집합 연산자는 다음과 같이 4 종류가 있다.
종류 | 설명 |
UNION | 연결된 SELECT문의 결과 값을 합집합으로 묶어준다. 결과 값의 중복은 제거된다. |
UNION ALL | 연결된 SELECT문의 결과 값을 합집합으로 묶어준다. 중복된 결과 값도 제거 없이 모두 출력된다. |
MINUS | 먼저 작성한 SELECT문의 결과 값에서 다음 SELECT문의 결과 값을 차집합 처리한다. 먼저 작성한 SELECT문의 결과 값 중 다음 SELECT문에 존재하지 않는 데이터만 출력된다. |
INTERSECT | 먼저 작성한 SELECT문과 다음 SELECT문의 결과 값이 같은 데이터만 출력된다. 교집합과 같은 의미이다. |