PostgreSQL | PostgreSQL 기본 구성 | 비교 연산자 사용 (<, >, =, BETWEEN, IS NULL)

비교 연산자는 두 값을 비교하여 크거나 작거나 같은지 다른지 등의 비교 판단을 한다. 여기에서 비교 연산자의 사용법에 대해 설명한다.

크거나 작거나 같은지 비교

비교 연산자는 왼쪽과 오른쪽을 비교하여 결과로서 boolean 형의 값을 돌려준다.

크기를 비교하는 비교 연산자 <, <= , >, >= 이렇게 4가지가 준비되어 있다.

<    왼쪽은 오른쪽보다 작다
>    외쪽이 오른쪽보다 크다
<=   왼쪽은 오른쪽보다 작거나 같다
>=   왼쪽은 오른쪽보다 크거나 같다

같은지에 대한 비교 연산자 =, <>, != 이렇게 3가지가 준비되어 있다.

=    왼쪽과 오른쪽은 동일하다
<>   왼쪽과 오른쪽은 동일하지 않다
!=   왼쪽과 오른쪽은 동일하지 않다

그럼 실제로 해보도록 하자. 다음과 같은 테스트 테이블을 만든다.

mydb=# create table customer(name varchar(10),  old integer);
CREATE TABLE
mydb=#

다음과 같은 데이터를 테이블에 추가한다.

mydb=# insert into customer values  ( 'kimkc', 41),  ( 'devkuma', 20),  ( 'yunho', 32),  ( 'yongtea', 34),  ( 'jiwoo', 12);
INSERT 0 5
mydb=#

그러고 SELECT 명령을 사용하여 old 컬럼의 값이 20보다 크거나 작거나, 아니면 같은지에 대해 알아 보겠다.

mydb=# select name, old,
mydb-#   old <20 as "20보다 작다",
mydb-#   old > 20 as "20보다 크다",
mydb-#   old = 20 as "20와 같다."
mydb-# from customer;
  name   | old | 20보다 작다 | 20보다 크다 | 20와 같다.
---------+-----+-------------+-------------+------------
 kimkc   |  41 | f           | t           | f
 devkuma |  20 | f           | f           | t
 yunho   |  32 | f           | t           | f
 yongtea |  34 | f           | t           | f
 jiwoo   |  12 | t           | f           | f
(5개 행)

비교 연산자를 사용하여 컬럼에 저장되는 값을 평가한 결과를 가져 왔다.

범위 내에 있는지 비교 (BETWEEN)

between 조건은 비교 대상의 값이 지정된 범위 내에 있는지 여부를 비교하고 결과로서 boolean 형의 값을 반환한다.

a BETWEEN x AND y       x 이상 y 이하의 범위에 있다
a NOT BETWEEN x AND y   x 이상 y 이하의 범위에 없다

비교 대상 값 a가 x 이상이고 y 이하이면 TRUE이다. NOT이 있다면 x 이상이고 y 이하가 아닌 경우 TRUE이다.

between 조건은 비교 연산자와 논리 연산자를 사용하여 다음과 같이 작성할 수 있다. 아래 2개 식는 같은 의미이다.

a >= x AND a <= y
a BETWEEN x AND y

또한 not between 조건도 비교 연산자와 논리 연산자를 사용하여 다음과 같이 작성할 수 있다. 아래 2개 식는 같은 의미이다.

a <x OR a> y
a NOT BETWEEN x AND y

a BETWEEN x AND y와 같이 지정한 경우에 x가 y보다 큰 값이 지정되면, x 이상 y 이하의 값은 존재하지 않기 때문에 항상 FALSE이다. SYMMETRIC을 지정하면 x와 y의 값을 정렬하여, 작은 값에서 큰 값의 범위 내에 있는지를 판단한다.

a BETWEEN SYMMETRIC x AND y
a NOT BETWEEN SYMMETRIC x AND y

비교 대상 값인 a가 x 또는 y의 작은 값에서 큰 값의 범위 내에 있으면 TRUE이다. NOT을 가진 경우는 반대가 된다.

그러면 실제로 해보도록 하자. 앞에서 작성한 customer 테이블에 대해 old 컬럼의 값이 15에서 25의 범위 내에 있는지 확인한다.

mydb=# select name, old,
mydb-#   old between 15 and 33 as "15 이상 33 이하"
mydb-# from customer;
  name   | old | 15 이상 33 이하
---------+-----+-----------------
 kimkc   |  41 | f
 devkuma |  20 | t
 yunho   |  32 | t
 yongtea |  34 | f
 jiwoo   |  12 | f
(5개 행)

지정한 범위 내에 있는 경우는 TRUE, 그렇지 같은 경우는 FALSE가 되었다.

다음 between 조건의 범위를 나타내는 숫자를 바꿔보자.

mydb=# select name, old,
mydb-#   old between 33 and 15 as "33 이상 15 이하"
mydb-# from customer;
  name   | old | 33 이상 15 이하
---------+-----+-----------------
 kimkc   |  41 | f
 devkuma |  20 | f
 yunho   |  32 | f
 yongtea |  34 | f
 jiwoo   |  12 | f
(5개 행)

33 이상 15 이하의 범위는 존재하지 않기 때문에 모두 FALSE가 되었다.

여기에 SYMMETRIC을 지정하면 범위를 지정한 두 값을 정렬 범위 지정이 제대로 된 결과가 나온다.

mydb=# select name, old,
mydb-#   old between symmetric 33 and 15 as "15 이상 33 이하"
mydb-# from customer;
  name   | old | 15 이상 33 이하
---------+-----+-----------------
 kimkc   |  41 | f
 devkuma |  20 | t
 yunho   |  32 | t
 yongtea |  34 | f
 jiwoo   |  12 | f
(5개 행)

15과 33의 작은 값에서 큰 값까지의 범위 내에 있으면 TRUE, 그렇지 않으면 FALSE가 된다.

값이 NULL인지 비교 (IS NULL, IS NOT NULL)

IS NULL는 비교 대상의 값이 NULL인지 비교하고 결과로 boolean 형의 값을 돌려준다.

expression IS NULL       expression이 NULL이다.
expression IS NOT NULL   expression이 NULL이 아니다.

비교 대상의 값이 NULL이면 TRUE이다. NOT이 있다면 NULL이면 TRUE이다. 값을 NULL인지 확인 때 비교 연산자 = 로 비교하면 맞는 결과가 나오지 않는다.

또한 비표준 구문으로 다음과 같은 결과가 되는 다음의 조건도 준비되어 있다.

expression ISNULL       expression이 NULL이다.
expression NOTNULL      expression이 NULL이 아니다.

그럼 실제로 해보도록 하자. 다음과 같은 테스트 테이블을 만든다.

mydb=# create table friends(name varchar(10), old integer);
CREATE TABLE
mydb=#

다음과 같은 데이터를 테이블에 추가했습니다.

mydb=# insert into friends values ('kimkc', 39), ('devkuma', NULL), (NULL, 19);
INSERT 0 3
mydb=# \pset null 'NULL'
Null 값은 "NULL" 문자로 보여짐.
mydb=# select * from friends;
  name   | old
---------+------
 kimkc   |   39
 devkuma | NULL
 NULL    |   19
(3개 행)

※ 기본적으로 NULL을 검색하여 표시하면 아무것도 표시되지 않기 때문에, NULL 인 경우 ‘NULL’로 표시되도록 설정되어 있다.

그러면 SELECT 명령을 사용하여 name 컬럼 및 old 컬럼에 저장되는 값이 NULL인지 판별해 본다.

mydb=# select name, name is null as "NULL?", old, old is null as "NULL?" from friends;
  name   | NULL? | old  | NULL?
---------+-------+------+-------
 kimkc   | f     |   39 | f
 devkuma | f     | NULL | t
 NULL    | t     |   19 | f
(3개 행)

컬럼에 저장되는 값이 NULL이면 TRUE, 그렇지 않으면 FALSE가 되었다.

여기까지 PostgreSQL에서 제공되는 비교 연산자의 사용법에 대해 설명하였다.