Loading...
MySQL 9.5 Reference Manual 9.5의 11.5 Expressions의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
이 섹션에서는 MySQL에서 expression이 따라야 하는 구문 규칙을 나열하고, expression에 나타날 수 있는 term 유형에 대한 추가 정보를 제공합니다.
다음 구문 규칙은 MySQL의 expression 구문을 정의합니다. 여기에서 보여주는 구문은 MySQL 소스 배포의 sql/sql_yacc.yy 파일에 주어진 내용에 기반합니다. 일부 expression term에 대한 추가 정보는 Expression Term Notes를 참조하십시오.
1expr: 2 expr OR expr 3 | expr || expr 4 | expr XOR expr 5 | expr AND expr 6 | expr && expr 7 | NOT expr 8 | ! expr 9 | boolean_primary IS [NOT] {TRUE | FALSE | UNKNOWN} 10 | boolean_primary 11 12boolean_primary: 13 boolean_primary IS [NOT] NULL 14 | boolean_primary <=> predicate 15 | boolean_primary comparison_operator predicate 16 | boolean_primary comparison_operator {ALL | ANY} (subquery) 17 | predicate 18 19comparison_operator: = | >= | > | <= | < | <> | != 20 21predicate: 22 bit_expr [NOT] IN (subquery) 23 | bit_expr [NOT] IN (expr [, expr] ...) 24 | bit_expr [NOT] BETWEEN bit_expr AND predicate 25 | bit_expr SOUNDS LIKE bit_expr 26 | bit_expr [NOT] LIKE simple_expr [ESCAPE simple_expr] 27 | bit_expr [NOT] REGEXP bit_expr 28 | bit_expr 29 30bit_expr: 31 bit_expr | bit_expr 32 | bit_expr & bit_expr 33 | bit_expr << bit_expr 34 | bit_expr >> bit_expr 35 | bit_expr + bit_expr 36 | bit_expr - bit_expr 37 | bit_expr * bit_expr 38 | bit_expr / bit_expr 39 | bit_expr DIV bit_expr 40 | bit_expr MOD bit_expr 41 | bit_expr % bit_expr 42 | bit_expr ^ bit_expr 43 | bit_expr + interval_expr 44 | bit_expr - interval_expr 45 | simple_expr 46 47simple_expr: 48 literal 49 | identifier 50 | function_call 51 | simple_expr COLLATE collation_name 52 | param_marker 53 | variable 54 | simple_expr || simple_expr 55 | + simple_expr 56 | - simple_expr 57 | ~ simple_expr 58 | ! simple_expr 59 | BINARY simple_expr 60 | (expr [, expr] ...) 61 | ROW (expr, expr [, expr] ...) 62 | (subquery) 63 | EXISTS (subquery) 64 | {identifier expr} 65 | match_expr 66 | case_expr 67 | interval_expr
연산자 우선순위에 대해서는 Section 14.4.1, “Operator Precedence”를 참조하십시오. 일부 연산자의 우선순위와 의미는 SQL 모드에 따라 달라집니다:
기본적으로 ||는 논리 OR 연산자입니다. PIPES_AS_CONCAT가 활성화되면 ||는 문자열 연결이며, 우선순위는 ^와 단항 연산자 사이에 위치합니다.
기본적으로 !는 NOT보다 더 높은 우선순위를 가집니다. HIGH_NOT_PRECEDENCE가 활성화되면 !와 NOT은 동일한 우선순위를 가집니다.
Section 7.1.11, “Server SQL Modes”를 참조하십시오.
리터럴 값 구문에 대해서는 Section 11.1, “Literal Values”를 참조하십시오.
식별자 구문에 대해서는 Section 11.2, “Schema Object Names”를 참조하십시오.
Variable은 사용자 변수, 시스템 변수, 또는 저장 프로그램 지역 변수 혹은 매개변수가 될 수 있습니다:
User variables: Section 11.4, “User-Defined Variables”
System variables: Section 7.1.9, “Using System Variables”
Stored program local variables: Section 15.6.4.1, “Local Variable DECLARE Statement”
Stored program parameters: Section 15.1.21, “CREATE PROCEDURE and CREATE FUNCTION Statements”
_param_marker_는 플레이스홀더를 위한 prepared statement에서 사용하는 ? 입니다. Section 15.5.1, “PREPARE Statement”를 참조하십시오.
(subquery)는 단일 값을 반환하는 subquery, 즉 스칼라 subquery를 나타냅니다. Section 15.2.15.1, “The Subquery as Scalar Operand”를 참조하십시오.
{identifier expr} 는 ODBC 이스케이프 구문이며 ODBC 호환성을 위해 허용됩니다. 값은 expr 입니다. 구문의 { 와 } 중괄호는 문자 그대로 작성해야 하며, 다른 구문 설명에서 사용되는 메타구문이 아닙니다.
match_expr 는 MATCH expression을 나타냅니다. Section 14.9, “Full-Text Search Functions”를 참조하십시오.
case_expr 는 CASE expression을 나타냅니다. Section 14.5, “Flow Control Functions”를 참조하십시오.
interval_expr 는 시간 간격을 나타냅니다. Temporal Intervals를 참조하십시오.
expression에서 interval_expr 는 시간 간격을 나타냅니다. interval은 다음과 같은 구문을 가집니다:
1INTERVAL expr unit
expr 는 수량을 나타냅니다. unit 은 이 수량을 해석하기 위한 단위를 나타내며, HOUR, DAY, WEEK 와 같은 지정자입니다. INTERVAL 키워드와 unit 지정자는 대소문자를 구분하지 않습니다.
다음 표는 각 unit 값에 대해 expr 인자의 기대 형식을 보여줍니다.
Table 11.2 Temporal Interval Expression and Unit Arguments
unit Value | Expected expr Format |
|---|---|
MICROSECOND | MICROSECONDS |
SECOND | SECONDS |
MINUTE | MINUTES |
HOUR | HOURS |
DAY | DAYS |
WEEK | WEEKS |
MONTH | MONTHS |
QUARTER | QUARTERS |
YEAR | YEARS |
SECOND_MICROSECOND | 'SECONDS.MICROSECONDS' |
MINUTE_MICROSECOND | 'MINUTES:SECONDS.MICROSECONDS' |
MINUTE_SECOND | 'MINUTES:SECONDS' |
HOUR_MICROSECOND | 'HOURS:MINUTES:SECONDS.MICROSECONDS' |
HOUR_SECOND | 'HOURS:MINUTES:SECONDS' |
HOUR_MINUTE | 'HOURS:MINUTES' |
DAY_MICROSECOND | 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS' |
DAY_SECOND | 'DAYS HOURS:MINUTES:SECONDS' |
DAY_MINUTE | 'DAYS HOURS:MINUTES' |
DAY_HOUR | 'DAYS HOURS' |
YEAR_MONTH | 'YEARS-MONTHS' |
unit Value | Expected expr Format |
|---|
MySQL에서는 expr 형식에서 임의의 구두점 구분자를 허용합니다. 표에 표시된 구분자는 권장 구분자입니다.
시간 간격은 DATE_ADD() 및 DATE_SUB()와 같은 특정 함수에서 사용됩니다:
1mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY); 2 -> '2018-05-02' 3mysql> SELECT DATE_SUB('2018-05-01',INTERVAL 1 YEAR); 4 -> '2017-05-01' 5mysql> SELECT DATE_ADD('2020-12-31 23:59:59', 6 -> INTERVAL 1 SECOND); 7 -> '2021-01-01 00:00:00' 8mysql> SELECT DATE_ADD('2018-12-31 23:59:59', 9 -> INTERVAL 1 DAY); 10 -> '2019-01-01 23:59:59' 11mysql> SELECT DATE_ADD('2100-12-31 23:59:59', 12 -> INTERVAL '1:1' MINUTE_SECOND); 13 -> '2101-01-01 00:01:00' 14mysql> SELECT DATE_SUB('2025-01-01 00:00:00', 15 -> INTERVAL '1 1:1:1' DAY_SECOND); 16 -> '2024-12-30 22:58:59' 17mysql> SELECT DATE_ADD('1900-01-01 00:00:00', 18 -> INTERVAL '-1 10' DAY_HOUR); 19 -> '1899-12-30 14:00:00' 20mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); 21 -> '1997-12-02' 22mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002', 23 -> INTERVAL '1.999999' SECOND_MICROSECOND); 24 -> '1993-01-01 00:00:01.000001'
시간 연산은 INTERVAL과 + 또는 - 연산자를 함께 사용하는 expression에서도 수행할 수 있습니다:
1date + INTERVAL expr unit 2date - INTERVAL expr unit
INTERVAL expr unit 은 다른 쪽 expression이 date 또는 datetime 값인 경우 + 연산자의 어느 쪽에서도 허용됩니다. - 연산자의 경우, INTERVAL expr unit 은 오른쪽에서만 허용되는데, interval에서 date 또는 datetime 값을 빼는 것은 의미가 없기 때문입니다.
1mysql> SELECT '2018-12-31 23:59:59' + INTERVAL 1 SECOND; 2 -> '2019-01-01 00:00:00' 3mysql> SELECT INTERVAL 1 DAY + '2018-12-31'; 4 -> '2019-01-01' 5mysql> SELECT '2025-01-01' - INTERVAL 1 SECOND; 6 -> '2024-12-31 23:59:59'
EXTRACT() 함수는 DATE_ADD() 또는 DATE_SUB()와 동일한 종류의 unit 지정자를 사용하지만, 날짜 연산을 수행하는 대신 날짜에서 부분을 추출합니다:
1mysql> SELECT EXTRACT(YEAR FROM '2019-07-02'); 2 -> 2019 3mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03'); 4 -> 201907
시간 간격은 CREATE EVENT statement에서도 사용할 수 있습니다:
1CREATE EVENT myevent 2 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR 3 DO 4 UPDATE myschema.mytable SET mycol = mycol + 1;
너무 짧은 interval 값(해당 unit 키워드에서 기대되는 모든 interval 부분을 포함하지 않는 값)을 지정하면, MySQL은 interval 값의 가장 왼쪽 부분을 생략한 것으로 가정합니다. 예를 들어 unit 이 DAY_SECOND 인 경우, expr 의 값에는 day, hour, minute, second 부분이 있어야 합니다.
'1:10' 과 같은 값을 지정하면, MySQL은 day와 hour 부분이 누락되었고 이 값이 minute와 second를 나타낸다고 가정합니다. 즉, '1:10' DAY_SECOND 는 '1:10' MINUTE_SECOND 와 동일한 방식으로 해석됩니다. 이는 MySQL이 TIME 값을 하루 중 특정 시각이 아니라 경과 시간으로 해석하는 방식과 유사합니다.
expr 은 문자열로 처리되므로, INTERVAL을 사용할 때 비문자열 값을 지정하는 경우 주의해야 합니다. 예를 들어 interval 지정자가 HOUR_MINUTE 인 경우 '6/4'는 6시간 4분으로 처리되지만, 6/4 는 1.5000 으로 평가되며 1시간 5000분으로 처리됩니다:
1mysql> SELECT '6/4', 6/4; 2 -> 1.5000 3mysql> SELECT DATE_ADD('2019-01-01', INTERVAL '6/4' HOUR_MINUTE); 4 -> '2019-01-01 06:04:00' 5mysql> SELECT DATE_ADD('2019-01-01', INTERVAL 6/4 HOUR_MINUTE); 6 -> '2019-01-04 12:20:00'
interval 값이 예상한 대로 해석되도록 하려면 CAST() 연산을 사용할 수 있습니다. 6/4 를 1시간 5분으로 처리하려면, 소수 자릿수가 하나인 DECIMAL 값으로 캐스트하십시오:
1mysql> SELECT CAST(6/4 AS DECIMAL(3,1)); 2 -> 1.5 3mysql> SELECT DATE_ADD('1970-01-01 12:00:00', 4 -> INTERVAL CAST(6/4 AS DECIMAL(3,1)) HOUR_MINUTE); 5 -> '1970-01-01 13:05:00'
date 값에 time 부분을 포함하는 값을 더하거나 빼면, 결과는 자동으로 datetime 값으로 변환됩니다:
1mysql> SELECT DATE_ADD('2023-01-01', INTERVAL 1 DAY); 2 -> '2023-01-02' 3mysql> SELECT DATE_ADD('2023-01-01', INTERVAL 1 HOUR); 4 -> '2023-01-01 01:00:00'
MONTH, YEAR_MONTH, 또는 YEAR 을 더하여 결과 date의 일이 새로운 month에서 허용되는 최대 일보다 커지는 경우, 그 일은 새 month의 최대 일로 조정됩니다:
1mysql> SELECT DATE_ADD('2019-01-30', INTERVAL 1 MONTH); 2 -> '2019-02-28'
date 연산에는 완전한 date가 필요하며, '2016-07-00' 과 같은 불완전한 date나 잘못 형성된 date에서는 동작하지 않습니다:
1mysql> SELECT DATE_ADD('2016-07-00', INTERVAL 1 DAY); 2 -> NULL 3mysql> SELECT '2005-03-32' + INTERVAL 1 MONTH; 4 -> NULL
11.4 User-Defined Variables
11.6 Query Attributes