Home 7. WHERE 절
Post
Cancel

7. WHERE 절

WHERE 절을 사용하면 행을 선택하여 조회할 수 있다. WHERE 절은 FROM 절 다음에 기술하고, FROM 절이 수행된 후 수행된다. WHERE 절에서 조건은 행마다 평가되며 TRUE, FALSE, UNKOWN 중 하나의 값을 반환한다. 그리고 SELECT 문은 평가 결과가 TRUE인 행만 반환한다.

7.1 비교 조건

| 비교 조건 | 설명 | |———–|———–| | = | 같음 | | > | 큼 | | >= | 크거나 같음 | | <>,!=,^= | 다름 | | < | 작음 | | <= | 작거나 같음 | | ALL | 목록 전체를 비교 | | ANY, SOME | 목록 일부를 비교 |

비교 조건은 데이터 타입이 동일한 값을 비교해야 한다. 데이터 타입이 다르면 암시적 데이터 변환이 발생한다.

7.2 논리 조건

논리 조건으로 조건을 결합하거나 부정할 수 있다.

  • AND - 조건이 모두 true인 경우 true이다.
  • OR - 조건이 하나라도 true인 경우 true이다.
  • NOT - true -> false, false -> true 로 조건을 부정한다.

7.3 BETWEEN 조건

expr1 [NOT] BETWEEN expr2 AND expr3 expr1이 expr2와 expr3의 범위에 해당하는 행을 반환한다.

1
2
3
SELECT enamd, sal
FROM emp
WHERE sal BETWEEN 2500 AND 3000; -- sal >= 2500 AND sal <= 3000

7.4 IN 조건

expr1 [NOT] IN (expr2 [, expr2]) expr1이 expr2의 목록에 포함되는 행을 반환한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT ename, job
FROM emp
WHERE job IN ('ANALYST', 'MANAGER'); -- job = 'ANALYST' OR job = 'MANAGER'

-- 아래와 같이 다중 열을 사용할 수도 있다.
SELECT ename, deptno, job
FROM emp
WHERE (deptno, job) IN ((10, 'MANAGER'), (20, 'ANALYST'));

-- NOT IN 조건은 AND 조건으로 평가된다.
SELECT ename, job
FROM emp
WHERE job NOT IN ('ANALYST', 'MANAGER'); -- job != 'ANALYST' AND job != 'MANAGER'

7.5 LIKE 조건

char [NOT] LIKE char2 [ESCAPE esc_char] char1이 char2패턴과 일치하는 행을 반환한다. char2에는 아래의 특수문자를 사용할 수 있다.

  • % : 0개 이상의 문자와 일치
  • _ : 하나의 문자와 일치
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-- A로 시작하는 행 조회
SELECT ename
FROM emp
WHERE ename LIKE 'A%';

-- A로 시작하고 S로 끝나는 행 조회
SELECT ename
FROM emp
WHERE ename LIKE 'A%S';

-- ON이 포함된 행 조회
SELECT ename
FROM emp
WHERE ename LIKE '%ON%';

-- ename의 세 번째 문자가 M이고 길이가 5자리인 행 조회
SELECT ename
FROM emp
WHERE ename LIKE '__M__;

-- A가 포함되지 않은 행 조회
SELECT ename
FROM emp
WHERE ename NOT LIKE '%A%';

-- 특수문자를 검색할 경우 ESCAPE 문자를 사용할 수 있다.
SELECT c1
FROM w1
WHERE c1 LIKE '_\%_' ESCAPE '\';

7.6 널 조건

expr IS [NOT] NULL expr이 널인 행을 반환한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT ename, comm
FROM emp
WHERE comm IS NULL;

SELECT ename, comm
FROM emp
WHERE comm IS NOT NULL;

-- comm이 널이거나 0인 행
SELECT ename, comm
FROM emp
WHERE (comm IS NULL OR comm = 0);

-- NVL 함수를 사용하여 동일한 결과를 얻을 수 있다.
SELECT ename, comm
FROM emp
WHERE NVL (comm, 0) = 0;

LENNVL 함수 LENNVL(condition) condition이 FALSE나 UNKOWN이면 TRUE, TRUE면 FALSE를 반환

1
2
3
SELECT ename, comm
FROM emp
WHERE LNNVL(comm <> 0);

7.7 조건 우선순위

|우선순위| 조건 | |—–|———————————-| |1| 연산자 | |2| 비교조건 | |3| IN 조건, LIKE 조건, BETWEEN 조건, 널 조건 | |4| 논리조건(NOT) | |5| 논리조건(AND) | |6| 논리조건(OR) |

7.8 활용 예제

열 가공

WHERE 절의 열을 가공하면 쿼리의 성능이 저하될 수 있다. 따라서 가급적 열을 가공하지 않는 편이 바람직하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-- 산술 연산이 행의 개수만큼 수행된다.
SELECT *
FROM emp
WHERE sal * 12 >= 36000;

-- 산술 연산을 수행한 결과로 조건을 평가할 수 있다
SELECT *
FROM emp
WHERE sal >= 36000 / 12;

-- 결합 연산자로 열을 가공한 경우
SELECT *
FROM emp
WHERE deptno || job = '10CLERK';

-- 열을 가공하지 말고 AND 조건을 사용하는 것이 좋다.
SELECT *
FROM emp
WHERE deptno = 10
AND job = 'CLERK';

-- ename이 A로 시작하는 행 조회
-- 1) 나쁜 예
SELECT *
FROM emp
WHERE SUBSTR(ename, 1, 1) = 'A';

-- 2) 바람직한 예
SELECT *
FROM emp
WHERE ename LIKE 'A%';

특정 단어가 포함된 행을 조회하는 경우에는 INSTR 함수를 사용하는 편이 LIKE 조건을 사용하는 것보다 성능 측면에서 유리하다.

동적 조건

바인드 변수의 인수에 따라 조건이 변경되는 것을 동적 조건이라고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
VAR v1 NUMBER = 10;

SELECT ename, deptno
FROM emp
WHERE deptno = :v1;

VAR v2 NUMBER;

SELECT ename, deptno
FROM emp
WHERE deptno = NVL(:v1, deptno);

날짜 기간 조회

날짜 값은 다양한 데이터 타입에 저장될 수 있다.

데이터 타입
VARCHAR2(8)YYYYMMDD 형식의 시분초가 포함되지 않은 값
VARCHAR2(14)YYYYMMDDHH24MISS 형식의 시분초가 포함된 문자 값
DATE시분초가 포함된 DATE 값
TIMESTAMP소수점 이하 초가 포함된 TIMESTAMP 값
This post is licensed under CC BY 4.0 by the author.