필요한 데이터만 출력하는 WHERE절
SELECT [조회할 열1 이름], [조회할 열2 이름], ...
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하기 위한 조건식];
- WHERE절은 SELECT문으로 데이터를 조회할 때 특정 조건을 기준으로 원하는 행을 출력하는 데 사용
- 여러 연산자를 함께 사용하면 더욱 세밀하게 데이터 검색을 할 수 있음
여러 개 조건식을 사용하는 AND, OR 연산자
SELECT [조회할 열1 이름], [조회할 열2 이름], ...
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하기 위한 조건식1]
AND [조회할 행을 선별하기 위한 조건식2]
OR [조회할 행을 선별하기 위한 조건식3]
...
;
- AND : 조건식의 결과값이 모두 TRUE인 행만 출력
- OR : 조건식에 하나라도 충족되는(TRUE)인 행 모두 출력
WHERE절 조건식의 갯수
- WHERE절에 사용할 수 있는 조건식의 개수는 제한이 없음
- 조건식을 두 개 이상 사용 할 경우에도 각 조건식 사이에 AND, OR 연산자를 추가하여 사용할 수 있음
실무에서의 AND, OR 연산자
- 보통 실무에서 사용하는 SELECT문은 OR 연산자보다 AND 연산자를 많이 사용하는 경향이 있음 → 다양한 조건을 한 번에 만족시키는 데이터만을 추출해야 할 때가 많기 때문
연산자 종류와 활용방법
산술연산자
-- 곱셈 산술 연산자를 사용한 예
SELECT *
FROM EMP
WHERE SAL * 12 = 36000;
- 더하기 +, 빼기 -, 곱하기 *, 나누기 /
비교 연산자
- 대소 비교 연산자 : SQL문을 작성할 때 자주 사용하는 연산자로 연산자 앞뒤에 있는 데이터 값을 비교하는데 사용(>, <, >=, <=) / 비교 대상이 숫자가 아닌 문저열일 때도 사용가능('A' → 이렇게 문자열을 작은따옴표로 묶어서)
-- 급여가 3000 이상인 사원을 조회
SELECT *
FROM EMP
WHERE SAL >= 3000;
-- 문자를 대소 비교 연산자로 비교하기(비교 문자열이 한 개일 때)
-- 사원 이름의 첫 문자가 F와 같거나 뒤쪽인 것만 검색
SELECT *
FROM EMP
WHERE ENAME >= 'F';
-- 문자를 대소 비교 연산자로 비교하기(비교 문자열이 여러개일 때)
-- ENAME 열 값이 FORZ를 포함한 문자열보다 알파벳 순서로 앞에 있는 행을 출력
SELECT *
FROM EMP
WHERE ENAME <= 'FORZ';
- 등가 비교 연산자 : 연산자 양쪽 항목이 같은 값인지 비교하는 연산자 / 실무에서는 !=와 <>를 많이 사용
연산자 | 사용법 | 의미 |
= | A = B | A와 B 값이 같을 경우 ture, 다를 경우 false 반환 |
!= | A != B | A와 B 값이 다를 경우 true, 같을 경우 false 반환 |
<> | A <> B | |
^= | A ^= B |
-- 만약 급여가 3000이 아닌 사원의 데이터를 조회할 때 아래와 같이 작성할 수 있고,
-- 세 가지 방식 모두 같은 결과 값을 출력함
-- 1. !=
SELECT *
FROM EMP
WHERE SAL != 3000;
-- 2. <>
SELECT *
FROM EMP
WHERE SAL <> 3000;
-- 3. ^=
SELECT *
FROM EMP
WHERE SAL ^= 3000;
논리 부정 연산자(NOT 연산자)
-- 급여가 3000이 아닌 사원 출력
SELECT *
FROM EMP
WHERE NOT SAL = 3000;
- 보통 NOT 연산자를 IN, BETWEEN, IS NULL 연산자와 함께 복합적으로 사용하는 경우가 많음
- 하지만 복잡한 여러 개 조건식이 AND, OR로 묶여 있는 상태에서 정반대 결과를 얻고자 할 때 유용하게 사용 가능
IN 연산자
-- 기본 형식
SELECT [조회할 열1 이름], [조회할 열2 이름], ...
FROM [조회할 테이블 이름]
WHERE 열 이름 IN (데이터1, 데이터2, ...);
- 출력하고 싶은 열의 조건이 여러 가지일 때 OR 연산자로 여러 조건식을 묶어 주는 것도 하나의 방법이지만, 조건이 늘어날수록 조건식을 많이 작성해야 하기 때문에 번거로움 → 이 때 IN 연산자를 사용하면 특정 열에 해당하는 조건을 여러 개 지정할 수 있음
-- 예제 1
-- 테이블에서 직업이 MANAGER, SALESMAN, CLERK인 사원 출력
SELECT *
FROM EMP
WHERE JOB IN ('MANAGER', 'SALESMAN', 'CLERK');
-- 예제 2
-- IN 연산자와 논리 부정 연산자를 활용하여 출력
-- 테이블에서 직업이 MANAGER, SALESMAN, CLERK이 아닌 사원 출력
SELECT *
FROM EMP
WHERE JOB NOT IN('MANAGER', 'SALESMAN', 'CLERK');
BETWEEN A AND B
SELECT [조회할 열1 이름], [열2 이름], ...
FROM [조회할 테이블 이름]
WHERE 열 이름 BETWEEN 최솟값 AND 최댓값;
- 특정 열 값의 최소, 최고 범위를 지정하여 해당 범위 내의 데이터만 조회할 경우에 대소 비교 연산자 대신 사용하기
-- 예제 1
-- 급여가 2000 ~ 3000 사이인 사원 출력
SELECT *
FROM EMP
WHERE SAL BETWEEN 2000 AND 3000;
-- 예제 2
-- BETWEEN A AND B 연산자와 NOT 연산자를 사용해서
-- 급여가 2000 ~ 3000이 아닌 사원 출력
SELECT *
FROM EMP
WHERE SAL NOT BETWEEN 2000 AND 3000;
LIKE 연산자와 와일드 카드
-- 예제 1
-- ENAME의 열 값이 대문자 S로 시작하는 데이터를 출력
SELECT *
FROM EMP
WHERE ENAME LIKE 'S%';
-- 예제 2
-- 사원 이름의 두 번째 글자가 L인 사원 데이터만 출력
SELECT *
FROM EMP
WHERE ENAME LIKE '_L%';
-- 예제 3
-- 사원 이름에 AM이 포함되어 있는 사원 데이터만 출력
SELECT *
FROM EMP
WHERE ENAME LIKE '%AM%';
-- 예제 4
-- 사원 이름에 AM이 포함되어 있지 않은 사원 데이터만 출력
SELECT *
FROM ENP
WHERE ENAME NOT LIKE '%AM%';
- 이메일이나 게시판 제목 또는 내용 검색 기능처럼 일부 문자열이 포함된 데이터를 조회할 때 사용
- % → 와일드 카드(특정 문자 또는 문자열을 대체하거나 문자열 데이터의 패턴을 표기하는 특수 문자)
- LIKE 연산자와 함께 사용할 수 있는 와일드 카드는 _와 %
종류 | 의미 |
_ | 어떤 값이든 상관없이 한 개의 문자 데이터를 의미 |
% | 길이와 상관없이(문자 없는 경우도 포함) 모든 문자 데이터를 의미 |
- 와일드 카드 문자가 데이터 일부일 경우
- 데이터에 와일드 카드 기호로 사용되는 _나 % 문자가 데이터로 포함된 경우가 간혹 있음
→ 이 경우 ESCAPE절 사용할 것
-- 데이터 앞에 A_A 문자를 가지고 있는 데이터를 출력
-- A\_A%에서 \문자 바로 뒤에 있는 _는 와일드 카드 기호가 아닌 데이터에 포함된 문자로 의식하라는 의미
SELECT *
FROM SOME_TABLE
WHERE SOME_COLUMN LIKE 'A\_A%' ESCAPE '\';
IS NULL 연산자
- NULL은 '현재 무슨 값인지 확정되지 않은 상태'이거나 '값 자체가 존재하지 않는 상태'를 나타내는 데이터에 사용
- 특정 열 또는 연산의 결과 값이 NULL인지 여부를 확인할 때 사용 → IS NULL
- 특정 열 또는 연산의 결과 값이 NULL이 아닌 열 출력 → IS NOT NULL
-- IS NULL
SELECT *
FROM EMP
WHERE ENAME IS NULL;
-- IS NOT NULL
SELECT *
FROM EMP
WHERE ENAME IS NOT NULL;
집합 연산자
종류 | 설명 |
UNION | 연결된 SELECT문의 결과 값을 합집합으로 묶어줌, 결과 값의 중복은 제거됨 |
UNION ALL | 연결된 SELECT문의 결과 값을 합집합으로 묶어줌, 중복된 결과 값도 제거 없이 모두 출력 |
MINUS | 먼저 작성한 SELECT문의 결과 값에서 다음 SELECT문의 결과 값을 차집합(겹치는 부분을 제외한 원소의 집합) 처리, 먼저 작성한 SELECT문의 결과 값 중 다음 SELECT문에 존재하지 않는 데이터만 출력 |
INTERSECT | 먼저 작성한 SELECT문과 다음 SELECT문의 결과 값이 같은 데이터만 출력, 교집합과 같은 의미 |
-- UNION(모두 출력/중복 제거)
-- EMP 테이블에서 부서번호 10번인 사원을 중복을 제거하고 모두 출력
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;
-- ALL UNION(모두 출력/중복 포함)
-- EMP 테이블에서 부서번호 10번과 사원을 중복을 포함하여 모두 출력
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION ALL
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;
-- 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(교집합 출력)
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
INTERSECT
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;
연산자 우선순위
- 먼저 수행해야하는 연산식을 소괄호로 묶어 주면 연산자의 기본 우선순위와는 별개로 괄호 안의 연산식을 먼저 수행
- 연산자의 기본 우선순위
우선순위 | 연산자 | 설명 |
높음 | *, / | 산술 연산자 곱하기, 나누기 |
+, - | 산술 연산자 더하기, 빼기 | |
=, !=, ^=, <>, <, <=, >, >= | 대소 비교 연산자 | |
IS (NOT) NULL, (NOT) LIKE, (NOT) IN | (그 외) 비교 연산자 | |
BETWEEN A AND B | BETWEEN 연산자 | |
NOT | 논리 부정 연산자 NOT | |
AND | 논리 연산자 AND | |
낮음 | OR | 논리 연산자 OR |
실습
-- 01
-- EMP 테이블을 사용하여 사원이름이 S로 끝나는 사원 데이터를 모두 출력하는 SQL문 작성
SELECT *
FROM EMP
WHERE ENAME LIKE '%S';
-- 02
-- EMP 테이블을 사용하여 30번 부서(DEPTNO)에서 근무하고 있는 사원 중에
-- 직책(JOB)이 SALESMAN인 사원의 사원번호, 이름, 직책, 급여, 부서번호를 출력
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30
AND JOB = 'SALESMAN';
-- 03
-- EMP 테이블을 사용하여 20번, 30번 부서에 근무하고 있는 사원 중
-- 급여(SAL)가 2000 초과인 사원을 집합연산자를 사용한 방식과,
-- 집합연산자를 사용하지 않은 방식 두 가지로
-- 사원 번호, 이름, 급여, 부서 번호를 출력
-- 집합연산자를 사용하지 않은 방식
SELECT EMPNO, ENAME, JOB, SAL,DEPTNO
FROM EMP
WHERE DEPTNO IN (20, 30)
AND SAL > 2000;
-- 집합연산자를 사용한 방식
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20
AND SAL > 2000
UNION
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30
AND SAL > 2000;
-- 04
-- NOT BETWEEN A AND B 연산자를 쓰지 않고, 급여(SAL) 열 값이
-- 2000 이상 3000 이하 범위 이외의 값을 가진 데이터만 출력
SELECT *
FROM EMP
WHERE SAL >= 2000
OR SAL <= 3000;
-- 05
-- 사원 이름에 E가 포함되어 있는 30번 부서의 사원 중 급여가 1000~2000 사이가 아닌
-- 사원 이름, 번호, 급여, 부서 번호를 출력
SELECT ENAME, EMPNO, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30
AND ENAME LIKE '%E%'
AND SAL NOT BETWEEN 1000 AND 2000;
-- 06
-- 추가 수당이 존재하지 않고 상급자가 있고 직책이 MANAGER, CLERK인 사원 중에서
-- 사원 이름의 두 번째 글자가 L이 아닌 사원의 정보를 출력
SELECT *
FROM EMP
WHERE COMM IS NULL
AND MGR IS NOT NULL
AND JOB IN('MANAGER', 'CLERK')
AND ENAME NOT LIKE '_L%';
'DEV > └ ORACLE' 카테고리의 다른 글
02. SELECT문의 기본 형식 (0) | 2022.04.28 |
---|---|
01. 데이터 베이스 (0) | 2022.04.10 |