신입 개발자가 되기 위해 공부했던 독학 자료들/Oracle

CH5. 더 정확하고 다양하게 결과를 출력하는 WHERE절과 연산자

Seojoo21 2022. 2. 18. 15:59

*출처: <비전공자도 기초부터 확실하게! 오라클로 배우는 데이터베이스 입문>, 이지훈, 이지스퍼블리싱 

 

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문의 결과 값이 같은 데이터만 출력된다. 교집합과 같은 의미이다.