제3장 SQL 연산

내용 목차

3.1. 개요
3.2. 연산자
3.2.1. 일반 연산자
3.2.2. 조건식에 포함되는 연산자
3.3. 연산식
3.3.1. 연산식의 변환
3.3.2. 단순 연산식
3.3.3. 복합 연산식
3.3.4. CASE 연산식
3.3.5. 함수
3.3.6. 부질의 연산식
3.3.7. 변수
3.3.8. 리스트
3.4. 조건식
3.4.1. 단순 조건식
3.4.2. 그룹 조건식
3.4.3. 복합 조건식
3.4.4. BETWEEN 조건식
3.4.5. EXISTS 조건식
3.4.6. IN 조건식
3.4.7. IS NULL 조건식
3.4.8. LIKE 조건식
3.4.9. REGEXP_LIKE 조건식

본 장에서는 SQL 연산에 대해 설명한다. 먼저 연산자에 대해 설명하고 다음으로 일반 연산식과 조건식에 대해 설명한다. 각 연산식을 설명할 때는 도식적 문법을 사용하여 설명한다.

SQL 문장 내에는 여러 가지 연산식이 포함된다. 연산식은 연산자(Operator), 피연산자(Operand), 함수(Function) 등으로 구성된다. 연산식은 연산식 내의 모든 피연산자에 어떤 값을 대입하면 해당 연산 결과를 반환한다.

연산식은 크게 두 가지로 구분할 수 있는데, 일반 연산식과 조건식이 이에 해당한다.

  • 일반 연산식

    • 논리(Logical) 연산자와 비교(Comparison) 연산자를 제외한 모든 연산자가 포함된다.

    • 결과 값으로 임의의 산술 값, 문자열, 리스트 등이 반환된다.

  • 조건식

    • 논리 연산자 또는 비교 연산자가 포함된다.

    • 결과 값으로 TRUE, FALSE, UNKNOWN이 반환된다.

다음은 연산식의 문법을 나타내는 그림이다.


위의 그림을 통해 도식을 해석하는 방법을 설명하면 다음과 같다.

도형설명

전체 문법을 대표하는 이름은 왼쪽 위에 나타낸다.

[그림 3.1]의 문법을 대표하는 이름은 example이다.

사각형 내의 문자는 문장에 포함된 문법 요소를 나타내며, 적절한 다른 문자열로 대치되어야 한다.

[그림 3.1]에서는 option, value, choice1, choice2 등이 여기에 해당한다.

동그라미 안의 문자는 키워드(Keyword) 또는 연산식 기호로, 반드시 문장 내에 그대로 포함되어야 한다.

[그림 3.1]에서는 소괄호(( ))와 콤마(,)가 여기에 해당한다.

문장을 완성하는 순서는 화살표를 따라가면 된다.

뒤쪽으로 향하는 화살표는 0번 이상 포함됨을 의미한다. 여러 갈래로 갈라지는 화살표는 여러 가지 중에 하나를 선택해야 함을 의미한다.

[그림 3.1]에서는 option은 반드시 포함되어야 하며, 콤마(,)는 포함되지 않거나 한 번 이상 포함될 수 있다. 소괄호(( ))는 반드시 포함된다. value는 반드시 한 번 이상 포함되어야 하며, 콤마가 포함되면 value는 한 번 더 포함된다. choice1과 choice2 중의 하나만 문장에 포함된다.

다음에 나열된 문장은 위의 [그림 3.1]의 도식을 바탕으로 완성된 유효한 연산식의 예이다.

option1 (value1) choice1
option1 (value1, value2) choice1
option1 (value1, value2) choice2
option1 (value1) choice2

본 절에서는 SQL 문장 내에서 사용되는 연산자에 대해 설명한다.

각 연산자를 포함한 연산식에 대해서는 “3.3. 연산식”“3.4. 조건식”에서 설명한다.

SQL 문장 내에서 사용되는 일반 연산자는 산술(Arithmetic) 연산자, 문자열(String) 연산자, 집합(Set) 연산자 등이 있다.

조건식에 포함되는 연산자는 논리 연산자와 비교 연산자가 있다.

연산식은 여러 가지 SQL 문장 내에서 사용된다. 본 장의 개요 부분에서 설명했듯이 연산식은 연산자와 피연산자, 함수 등으로 구성된다.

다음은 연산식을 포함하는 SQL 문장이다.

  • SELECT 문 내의 SELECT 절(리스트)

  • SELECT, UPDATE, DELETE 문 내의 WHERE 절(조건식)

  • SELECT 문 내의 HAVING 절(조건식)

  • SELECT 문 내의 ORDER BY 절(리스트)

  • INSERT 문 내의 VALUES 절(리스트)

  • UPDATE 문 내의 SET 절(할당 연산식)

리스트 형태의 연산식인 경우에 SELECT 문의 SELECT 절과 ORDER BY 절에서는 괄호로 묶여지지 않으나, INSERT 문의 VALUES 절에서는 반드시 괄호로 묶어야 한다. UPDATE 문의 SET 절에 포함되는 할당 연산식은 등호(=)를 이용한 비교 연산식과 동일한 문법을 가지나, 등호의 왼쪽에는 반드시 컬럼의 이름이 와야 한다.

Tibero에서 사용할 수 있는 연산식은 단순 연산식(Simple Expression), 복합 연산식(Compound Expression), 함수(Function), 부질의 연산식(Subquery Expression), 리스트(List) 등이 있다.

연산식의 세부 내용은 다음과 같다.

연산식 내의 피연산자의 데이터 타입이 연산자가 요구하는 타입이 아닌 경우 Tibero에서는 가능하면 데이터 타입의 변환을 수행한다.

다음의 두 라인은 데이터 타입의 변환의 예이다.

'30' + 50 = 80

'YEAR' || 2004 = 'YEAR2004'

첫 번째 라인에서 덧셈(+) 연산자의 피연산자는 NUMBER 타입이어야 하나 문자열 '30'이 온 경우 이를 먼저 NUMBER 타입으로 변환한 후에 계산하게 된다. 두 번째 라인에서 접합(||) 연산자의 피연산자는 문자열 타입이어야 하나 NUMBER 타입의 2004가 온 경우 이를 먼저 문자열로 변환한 후에 연산을 수행한다.

모든 데이터 타입 간의 변환이 가능한 것은 아니며, 연산식의 계산 과정에서 데이터 타입의 변환이 불가능한 경우에는 에러를 반환한다. 데이터 타입의 변환이 가능하더라도 실제 값에 따라 에러가 발생할 수 있다. 예를 들어 문자열 '1234'는 NUMBER 타입으로 변환 가능하나, 'ABC'는 변환 불가능하다. 대용량 객체는 데이터 타입의 변환이 불가능하다.

다음의 표는 데이터 타입의 변환이 가능한 조합을 보여주고 있다. 세로로 나열된 타입이 변환 전의 타입이며, 가로로 나열된 타입이 변환 후의 타입이다.

데이터

타입

NUMBERCHARVARCHARRAWDATETIMETIMESTAMPINTERVALLONGLONG RAWBLOBCLOBROWIDBINARY_ FLO ATBINARY_ DOU BLE
NUMBER-OO-----O--O-OO
CHARO-OOOOOOOOOOOOO
VARCHAROO-OOOOOOOOOOOO
RAW-OO-----OOOO---
DATE-OO---O-O------
TIME-OO-----O------
TIMESTAMP-OO-O---O------
INTERVAL-OO-----O------
LONG-OOO-----O-O---
LONG RAW-OOO----O-O----
BLOB---O-----O-----
CLOB-OO-----O------
ROWID-OO-----O------
BINARY_ FLOATOOO-----------O
BINARY_ DOUBLEOOO----------O-

CASE 연산식은 SQL 문장에서 IF... THEN ... ELSE 로직을 표현한다. simple_when_clause를 사용하면 expr, comparison_expr, return_expr 그리고 else_clause를 합해서 최대 65535까지 표현식을 사용할 수 있다. searched_when_clause를 사용하면 condition, return_expr, else_clause를 합해서 최대 65535까지 표현식을 사용할 수 있다.

CASE 연산식의 세부 내용은 다음과 같다.

  • 문법

  • 구성요소

    구성요소설명
    simple_when_clause

    WHEN ... THEN 쌍에서 명시된 순서대로 comparison_expr과 expr을 비교하고 결과가 같다면 해당 THEN 절의 return_expr을 반환한다.

    모든 comparison_expr과의 비교가 실패한다면. else_clause에 있는 else_expr이 반환된다. else_clause가 없다면 NULL이 반환된다.

    searched_when_clause

    WHEN ... THEN 쌍에 대해서 명시된 순서대로 condition을 평가하게 되고 결과가 TRUE이면 해당 THEN 절의 return_expr을 반환한다.

    TRUE로 평가되는 condition이 없다면 else_clause에 명시된 else_expr이 반환된다. else_clause가 없다면 NULL이 반환된다.

    comparison_expr비교 연산자를 의미한다. expr과 모든 comparison_expr은 동일한 타입이어야 한다. 자세한 내용은 “3.2.2. 조건식에 포함되는 연산자”를 참고한다.
    condition조건식을 의미한다. 자세한 내용은 “3.4. 조건식”을 참고한다.
    return_exprsimple_when_cluase의 비교 결과와 searched_when_clause의 조건식을 만족할 경우에 return_expr을 반환한다. 모든 return_expr과 else_expr도 동일한 타입이어야 한다.
    else_clausesimple_when_clause의 비교 결과와 searched_when_cluase의 조건식을 만족하지 못할 경우에 else_clause에 있는 else_expr이 반환된다.
  • 예제

    다음은 CASE 연산식의 예이다.

    SELECT CASE WHEN age > 19 THEN 'adult' ELSE 'minor' END FROM people;

조건식은 SELECT, UPDATE, DELETE 문장의 WHERE 절과 SELECT 문의 HAVING 절에 포함된다. Tibero에서 사용할 수 있는 조건식은 단순 조건식(Simple Condition), 그룹 조건식(Group Condition), 복합 조건식(Compound Condition), 비교 조건식(Comparison Condition) 등이 있다. 비교 조건식은 비교 연산자에 따라 BETWEEN, EXISTS, IN, IS NULL, LIKE 조건식 등이 있다.

조건식의 세부 내용은 다음과 같다.

그룹 조건식은 하나의 데이터 값과 리스트에 포함된 값을 비교하는 연산을 수행한다.

그룹 조건식의 세부 내용은 다음과 같다.

  • 문법

  • 구성요소

    구성요소설명
    exprexpr은 일반적인 연산식을 의미한다. 자세한 내용은 “3.3. 연산식”을 참고한다.
    expr_listexpr_list는 리스트를 의미한다. 자세한 내용은 “3.3.8. 리스트”를 참고한다.
    subquery부질의를 의미한다. 자세한 내용은 “3.3.6. 부질의 연산식”을 참고한다.
    ANYANY가 포함된 그룹 조건식의 경우 왼쪽의 데이터 값이 오른쪽의 리스트 내의 값 중 최소한 하나만 단순 비교 연산자를 만족하면 그룹 조건식은 TRUE를 반환한다.
    SOMESOME이 포함된 그룹 조건식의 경우 ANY와 마찬가지로 왼쪽의 데이터 값이 오른쪽의 리스트 내의 값 중 최소한 하나만 단순 비교 연산자를 만족하면 그룹 조건식은 TRUE를 반환한다.
    ALLALL이 포함된 그룹 조건식의 경우 왼쪽의 데이터 값이 오른쪽의 리스트 내의 모든 값에 대해 단순 비교 연산자를 만족해야 그룹 조건식이 TRUE를 반환한다.
  • 예제

    다음은 그룹 조건식의 예이다.

    EMPNO = ANY (35, 54, 27, 69)
    SALARY * 1.05 >= ALL (SELECT SALARY FROM EMP WHERE DEPTNO = 5)

    위의 예에서 첫 번째 줄은 컬럼 EMPNO 값이 리스트 내의 값 중 하나라도 동일하면 TRUE, 그렇지 않으면 FALSE를 반환한다. 두 번째 줄은 컬럼 SALARY 값에 1.05를 곱한 값이 오른쪽 부질의 결과로 반환되는 모든 값보다 크거나 같으면 TRUE, 그렇지 않으면 FALSE를 반환한다.

    오른쪽 리스트 내에 NULL이 포함된 경우 ANY 연산자가 포함된 그룹 조건식은 항상 TRUE 또는 UNKNOWN을 반환하고, ALL 연산자가 포함된 그룹 조건식은 항상 FALSE 또는 UNKNOWN을 반환한다.

    예를 들어 다음의 두 줄은 같은 결과를 반환한다.

    DEPTNO != ALL (4, 5, NULL)
    (DEPTNO != 4) AND (DEPTNO != 5) AND (DEPTNO != NULL)

    만약 컬럼 DEPTNO 값이 4 또는 5인 경우, 두 번째 줄에서 NULL과 비교하는 마지막 단순 조건식의 결과가 UNKNOWN이 되고, 전체 조건식의 결과도 AND 연산자로 연결되어 있으므로 UNKNOWN이 된다.

IN 연산자는 왼쪽의 데이터 값이 오른쪽의 리스트 내에 포함되어 있는지 비교하는 연산자이다. IN 조건식의 문법은 다음의 도식과 같다. expr, expr_list, subquery는 “3.3. 연산식”에서 정의하였다.

IN 조건식의 세부 내용은 다음과 같다.

  • 문법

  • 구성요소

    구성요소내용
    exprexpr은 일반적인 연산식을 의미한다. 자세한 내용은 “3.3. 연산식”을 참고한다.
    NOT

    논리 연산자 NOT을 의미한다. 자세한 내용은 “3.2.2. 조건식에 포함되는 연산자”를 참고한다.

    IN 앞에 NOT이 오면 IN 연산 결과에 NOT 연산을 수행한 결과를 반환한다.

    ININ 연산자는 왼쪽의 데이터 값이 오른쪽의 리스트 내에 포함되어 있는지 비교하는 연산자이다.
    expr_list

    expr 리스트를 의미한다. 자세한 내용은 “3.3.8. 리스트”를 참고한다.

    expr_list 자체는 괄호에 둘러싸여 있어서는 안 된다.

    subquerysubquery는 부질의를 의미한다. 자세한 내용은 “3.3.6. 부질의 연산식”을 참고한다.
  • 예제

    IN 조건식은 ' = ANY' 또는 '= SOME' 연산자를 이용한 그룹 조건식으로 변환할 수 있다.

    예를 들어 다음의 두 줄은 같은 결과를 반환한다.

    EMPNO IN (35, 54, 27, 69)
    EMPNO = ANY (35, 54, 27, 69)

    IN 조건식이 = ANY 연산자가 포함된 그룹 조건식으로 변환될 수 있으므로, IN 연산자의 오른쪽 리스트 내에 NULL이 포함되어 있다면 IN 조건식은 항상 TRUE 또는 UNKNOWN을 반환한다. 반면에, NOT IN 조건식은 항상 FALSE 또는 UNKNOWN을 반환한다.

LIKE 조건식은 문자열 데이터 간의 패턴을 비교한다. LIKE 연산자는 등호 연산자와 마찬가지로 영문 대문자와 소문자를 구분한다. 예를 들어 문자열 'ABCDE'와 'abcde'는 서로 다른 문자열이며, 문자열 패턴 'A%'에 대하여 문자열 'ABCDE'는 대응되지만, 'abcde'는 대응되지 않는다.

LIKE 조건식의 세부 내용은 다음과 같다.

  • 문법

  • 구성요소

    구성요소설명
    str_expr1, str_expr2str_exp1, str_exp2는 문자열을 반환하는 임의의 연산식이며, 0 이상의 길이를 갖는다.
    esc_charesc_char는 이스케이프 문자를 반환하는 길이가 1인 임의의 문자이다.
    LIKELIKE 연산자는 문자열 데이터 간의 패턴을 비교하는 연산자이다. LIKE 연산자는 왼쪽에 오는 문자열이 오른쪽에 오는 문자열 패턴에 일치하면 TRUE를 반환한다. 만약 str_expr1, str_expr2 중의 어떤 하나라도 NULL이면, LIKE 연산자는 UNKNOWN을 반환한다.
    ESCAPE와일드 카드(Wild Card)로 사용된 문자를 비교할 때는 이스케이프 문자를 사용한다.

    두 문자열이 완전히 일치하는지 비교하는 데에는 등호(=) 연산자를 사용하는 반면, LIKE 연산자는 임의의 문자 또는 문자열에 대응되는 와일드 카드 문자열을 포함할 수 있다.

    와일드 카드설명
    % (Percent)

    길이가 0 이상인 임의의 문자열에 대응된다.

    예를 들어 문자열 패턴 'A%'에 대응되는 문자열은 'A', 'Allen', 'Alice' 등이 있다.

    _(Underscore)

    '_'는 1개의 문자에 대응된다.

    예를 들어 문자열 패턴 'A_'에 대응되는 문자열은 'AB', 'A1' 등이 있다. 문자열 'A', 'ABC', 'Allen' 등은 문자열 패턴 'A_'에 대응되지 않는다.

    와일드 카드의 특징은 다음과 같다.

    • 하나의 문자열 패턴에 하나 이상의 와일드 카드 문자를 포함할 수 있다.

    • 와일드 카드로 사용된 문자를 비교할 때는 이스케이프 문자(escape character)를 사용한다.

      예를 들어 'A_'로 시작되는 모든 문자열을 찾을 때는 문자열 패턴으로 'A\_%'를 사용한다. 이때, 백슬래시(\)가 이스케이프 문자로 사용된다. 이스케이프 문자로 사용된 백슬래시(\)를 비교하려면 이스케이프 문자를 두 번 반복해서 사용한다. 예를 들어 'C:\'로 시작되는 모든 문자열을 찾고자 한다면, 문자열 패턴으로 'C:\\%'를 사용한다.

      이스케이프 문자는 정해져 있지 않으며 LIKE 연산자를 사용할 때마다 이스케이프 문자를 다르게 지정할 수 있다. 이스케이프 문자는 항상 길이가 1이어야 한다.