WHERE절
SELECT문에서 테이터를 조회할 때 특정 조건, 기준으로 행을 출력하기 위해 'WHERE절'을 사용한다. 만약 부서 번호가 30인 데이터만 출력하고 싶다면 다음과 같은 SQL문과 함께 출력된다.
SELECT * FROM EMP
WHERE DEPTNO = 30;
WHERE절의 기본 형식은 다음과 같다.
SELECT [조회할 열 1 이름]. [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하기 위한 조건식];
여러 개 조건식을 사용하는 AND, OR 연산자
AND
두 개의 조건식을 동시에 사용할 때 AND연산자를 사용한다. 예를 들어 부서(DEPTNO)가 '30'이면서, 직업(JOB)이 'SALESMAN'인 조건식을 만든다면 AND연산자를 사용하여 다음과 같이 작성할 수 있다.
SELECT * FROM EMP WHERE DEPTNO = 30
AND JOB = 'SALESMAN';
OR
AND연산자는 모든 조건이 만족해야지만 출력되지만 OR연산자는 조건 중 하나만 조건이 충족돼도 출력된다. 부서(DEPTNO)가 30 '혹은' 직업(JOB)이 'CLERK'인 쿼리문을 출력해보자.
SELECT * FROM EMP WHERE DEPTNO = 30
OR JOB = 'CLERK';
쿼리문의 조건에서는 직업(JOB)을 'CLERK'인 데이터를 출력하기로 했다. 그런데 출력된 결과물을 보면, 'SALESMAN', 'MANAGER'이 포함된 데이터도 출력된 걸 볼 수 있다. 그 이유는 OR조건식에서 부서가 30인 데이터도 출력하기로 했기 떄문이다. 즉, 쿼리의 조건식에서 'CLERK'문을 만족하지 못해도 부서(DEPTNO)에서 30인 조건을 만족되면 데이터가 출력된다.
산술 연산자
산술 연산자는 사칙연산 더하기(+), 빼기(-), 곱하기(*), 나누기(-)를 사용한다. 대표적으로 곱셈 산술 연사자를 사용된 쿼리를 살펴보자.
SELECT * FROM EMP
WHERE SAL * 12 = 36000;
비교 연산자
대소 비교 연산자
연산자 | 사용법 | 설명 |
> | A > B | A값이 B값을 초과하는 경우 true |
>= | A >= B | A값이 B값 이상일 경우 true |
< | A < B | A값이 B값 미만일 경우 true |
<= | A <= B | A값이 B값 이하일 경우 true |
비교 연산자는 SQL문을 작성할 때 연산자 앞뒤에 있는 데이터 값을 비교할 때 사용한다. 대표적으로 월급(SAL)이 3000이상인 값을 출력해보겠다.
SELECT * FROM EMP
WHERE SAL >= 3000;
등가 비교 연산자
등가 비교 연산자는 연사자 양쪽 항목이 같은 값인지 아닌지 비교하는 연산자다. 등가 비교 연산자는 아래와 같다.
연산자 | 사용법 | 의미 |
= | A = B | A 값이 B값과 같을 경우 true, 다를 경우 false 변환 |
!= | A != B | A 값과 B 값이 다를 경우 true, 같을 경우 false 반환 |
<> | A <> B | - |
^= | A ^= B | - |
SELECT * FROM EMP
WHERE SAL != 3000;
SELECT * FROM EMP
WHERE SAL <> 3000;
SELECT * FROM EMP
WHERE SAL ^= 3000;
등가 비교 연사자중에서 특히 '!='와 '<>'를 많이 사용한다.
논리 부정 연산자
비교 연산자는 아니지만, 비교 연산자 중 부정하는 연산자(^=, !=, <>)와 같은 연산자를 논리 부정 연산자(NOT 연산자)라 한다. 보통 NOT 연산자를 IN, BETWEEN, IS NULL 연산자와 함께 복합적으로 사용하며 복잡한 여러 개 조건식이 AND, OR로 묶여 있는 상태에서 정반대 결과를 얻고자 할 떄 유용하게 사용한다. 예시로 급여(SAL)가 3000이 아닌 데이터들을 출력해보겠다.
SELECT * FROM EMP
WHERE NOT SAL = 3000;
IN 연산자
다양한 직업(JOB)의 데이터들을 뽑고싶다. 예를 들어 'MANAGER', 'SALESMAN', 'CLERK'가 포함된 데이터를 뽑고 싶다. 기존의 우리가 배운 연산자를 사용하면 다음과 같이 쿼리문을 작성할 수 있다.
SELECT * FROM EMP
WHERE JOB = 'MANAGER'
OR JOB = 'SALESMAN'
OR JOB = 'CLERK';
하지만 'OR'과 'JOB'을 반복해야 한다는 번거로움이 있다. 이러한 문제를 해결하기 위해 특정 열을 해당하는 조건을 여러개 출력할 수 있는 'IN 연산자'를 사용한다.
SELECT * FROM EMP
WHERE JOB IN ('MANAGER', 'SALESMAN', 'CLERK');
IN 연산자와 논리 부정 연산자를 함께 사용할 수 있다.
SELECT * FROM EMP
WHERE JOB NOT IN ('MANAGER', 'SALESMAN', 'CLERK');
BETWEEN A AND B 연산자
급여(SAL) 열 값이 2000이상 3000이하를 갖는 사원 데이터를 조회해보자. 앞에서 배운 대소 비교연산자와 AND 연산자를 사용하면 다음과 같이 쿼리문을 짤 수 있다.
SELECT * FROM EMP
WHERE SAL >= 2000
AND SAL <= 3000;
하지만 조건 사이의 값을 구할 때 비교 연산자와 AND연산자를 사용한다면 AND가 반복되고 일일이 비교연산자를 넣어줘야 한다는 불편함이 있다. SQL에서는 이러한 문제를 해결하기 위해 'BETWEEN A AND B' 연산자를 제공한다. 기본 형식은 아래와 같다.
SELECT [조회할 열 1 이름], [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE 열 이름 BETWEEN 최솟값 AND 최댓값;
대소 비교 연사자와 AND연산자를 사용하지 않고 BETWEEN연산자로만 사원의 급여 값이 2000이상 3000이하인 데이터를 구해보자.
SELECT * FROM EMP
WHERE SAL BETWEEN 2000 AND 3000;
IN 연산자와 마찬가지로 NOT 연산자를 앞에 붙이면 급여의 값이 2000~3000사이 이외의 값을 가진 데이터를 출력할 수 있다.
SELECT * FROM EMP
WHERE SAL NOT BETWEEN 2000 AND 3000;
LIKE 연산자와 와일드 카드
LIKE 연산자는 일부 문자열이 포함된 데이터를 조회할 떄 사용한다. 만약 직원의 이름(ENAME)중에 맨 앞에 'S'로 시작되는 데이터들을 출력한다면, LIKE 연산자를 통하여 다음과 같이 SQL문을 작성한다.
SELECT * FROM EMP
WHERE ENAME LIKE 'S%';
SQL출력된 데이터를 보면 사원의 이름(ENAME)이 모두 맨 앞에 'S'가 붙어있는 걸 확인할 수 있다. LIKE연산자는 홀로 쓰이지 않고 와일드 카드와 함께 사용할 수 있다. 와일드 카드는 '_'와 '%'이다. 앞에서 '%'의 사용에 대해 알아봤으니 '_'의 사용에 대해 알아보자.
종류 | 의미 |
_ | 어떤 값이든 상관없이 한 개의 문자 데이터를 의미 |
% | 길이와 상관없이(문자 없는 경우도 포함) 모든 문자 데이터를 의미 |
SELECT * FROM EMP
WHERE ENAME LIKE '_L%';
쿼리문에 와일드 카드를 사용하여 위와 같은 결과물이 출력된다. 데이터 첫 번째 문자가 와일드 카드(_)이기 때문에 문자 종류와 상관없이 L앞에는 단 하나의 문자가 오는 것을 의미한다. 두번째 글자가 L이고 L 이후 와일드 카드(%)를 지정했기 때문에 L 뒤에 올 문자는 어떤 종류의 문자가 몇 개가 오든 상관없다.
어떤 단어가 포함된 제목 또는 본문 검색과 같은 기능을 구현할 때는 원하는 문자열 앞뒤 모두 와일드 카드(%)를 붙여줄 수 있다. 앞뒤에 어떤 종류의 문자가 오건 상관없이 사원이름(ENAME) 중간에 'AM'이 포함되는 쿼리를 짤 떄는 다음과 같다.
SELECT * FROM EMP
WHERE ENAME LIKE '%AM%';
IS NULL 연산자
NULL은 데이터 값이 완전히 '비어 있는' 상태를 말한다. NULL을 이해할 때 유의해야 할 점은 숫자 0은 값 0이 존재한다는 뜻이므로 값 자체가 존재하지 않는다는 NULL과 혼동하지 말아야 한다. 따라서 NULL은 '현재 무슨 값인지 확정되지 않은 상태'이거나 '값 자체가 존재하지 않는 상태'를 나타내는 데이터에 사용한다.
의미 | 예 |
값이 존재하지 않음 | 통장을 개설한 적 없는 은행 고객의 계좌 번호 |
해당 사항 없음 | 미혼인 고객의 결혼기념일 |
노출할 수 없는 값 | 고객 비밀번호 찾기 같은 열람을 제한해야 하는 특정 개인 정보 |
확정되지 않은 값 | 미성년자의 출신 대학 |
NULL값을 사용할 때는 SQL문에 'NULL'을 사용하지 않는다. NULL을 사용하면 산술 연사자와 비교 연산자로 비교해도 결과 값이 NULL이 되기 떄문이다. 어떤 값인지 모르는 값에 숫자를 더해도 어떤 값인지 알 수 없고, 어떤 값인지 모르는 값이 특정 값보다 큰지 작은지 알 수 없는 것과 같은 이치다.
SELECT * FROM EMP
WHERE COMM = NULL;
NULL로는 값을 출력할 수 없기 때문에 쿼리문에는 'NULL'대신 'IS NULL'을 사용한다.
SELECT * FROM EMP
WHERE COMM IS NULL;
집합 연산자
관계형 데이터베이스 개념은 집합론에서 시작됐다. 그래서 합집합, 차집합, 교집합을 SQL문으로 표현할 수 있다.
UNION
'UNION'은 합집합을 의미한다. 10분 부서에 근무하는 사원과 20번 부서에 근무하는 사원 정보를 UNION으로 합쳐보자. UNION을 사용할 때 하는 SELECT문의 열 개수와 각 자료형이 순서별로 일치해야한다.
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 20;
UNION ALL
'UNION ALL'은 두 SELECT문의 중복된 값이 함께 출력된다.
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 10
UNION ALL
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 10;
MINUS
MINUS 연산자는 차집합을 의미한다. 두 SELECT문을 MINUS 연산자로 묶어 주면 두 SELECT문의 결과 값이 같은 데이터는 제외하고 첫 번째 SELECT문의 결과 값이 출력된다. EMP 테이블 전체 행을 조회한 첫 번째 SELECT문의 결과에서 10번 부서에 있는 사원 데이터를 제외한 결과값이 출력해보자.
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
MINUS
SELECT EMPNO, ENAME, SAL, DEPTNO FROm EMP
WHERE DEPTNO = 10;
INTERSECT
'INTERSECT' 연산자는 교집합을 의미하므로 두 SELECT문의 결과 값이 같은 데이터만 출력된다.
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
INTERSECT
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 10;
출처:Do it! 오라클 배우는 데이터베이스 입문(저자:이지훈, 출판사:이지스퍼블리싱)
'DB > Oracle' 카테고리의 다른 글
[오라클 함수] NULL 처리 함수 (0) | 2022.02.10 |
---|---|
[오라클 함수] 형 변환 함수 (0) | 2022.02.09 |
[오라클 함수] 날짜 함수 (0) | 2022.02.09 |
[오라클 함수] 문자함수 (0) | 2022.02.07 |
SELECT문의 기본 형식 (0) | 2022.01.25 |