本节列出MySQL中表达式必须遵循的语法规则,并提供关于表达式中可能出现的术语类型的附加信息。
下面的语法规则定义了MySQL中的表达式语法。这里显示的语法是基于sql / sql_yacc.yy
MySQL源发行版文件。有关某些表达式术语的其他信息,请参见表达式词汇笔记.
expr:expr或expr|expr||expr|exprXORexpr|expr和expr|expr& &expr|不expr| !expr|boolean_primary[not] {true | false |未知}|boolean_primaryboolean_primary:boolean_primary是否[not] null |boolean_primary<=>谓词|boolean_primarycomparison_operator谓词|boolean_primarycomparison_operator{所有|任何}(子查询) |谓词comparison_operator: = | >= | > | <= | < | <> | !=谓词:bit_expr(不)(子查询) |bit_expr(不)(expr(,expr]…)|bit_expr(不)之间bit_expr和谓词|bit_expr听起来像bit_expr|bit_expr(不)一样simple_expr(逃避simple_expr) |bit_expr[不]REGEXPbit_expr|bit_exprbit_expr:bit_expr|bit_expr|bit_expr&bit_expr|bit_expr<<bit_expr|bit_expr>>bit_expr|bit_expr+bit_expr|bit_expr-bit_expr|bit_expr*bit_expr|bit_expr/bit_expr|bit_exprDIVbit_expr|bit_expr国防部bit_expr|bit_expr%bit_expr|bit_expr^bit_expr|bit_expr+interval_expr|bit_expr-interval_expr|simple_exprsimple_expr:文字|标识符|function_call|simple_expr核对collation_name|param_marker|变量|simple_expr||simple_expr| +simple_expr| -simple_expr| ~simple_expr| !simple_expr|二进制simple_expr| (expr(,expr…)| row (expr,expr(,expr…)| (子查询) |存在(子查询) | {标识符expr} |match_expr|case_expr|interval_expr
有关运算符优先级,请参见第12.4.1节,“运算符优先级”.某些操作符的优先级和含义取决于SQL模式:
默认情况下,
||
是一个逻辑或
操作符。与PIPES_AS_CONCAT
启用,||
是否字符串连接,与之间的优先级^
一元运算符。默认情况下,
!
优先级高于不
.与HIGH_NOT_PRECEDENCE
启用,!
而且不
具有相同的优先级。
有关文字值语法,请参见第9.1节,“文字值”.
有关标识符语法,请参见第9.2节“模式对象名称”.
变量可以是用户变量、系统变量或存储程序局部变量或参数:
用户变量:第9.4节,“自定义变量”
系统变量:第5.1.8节“使用系统变量”
存储程序局部变量:第13.6.4.1节“局部变量DECLARE语句”
param_marker
是?
用于占位符的预处理语句。看到第13.5.1节,“PREPARE语句”.
(
指示返回单个值的子查询;也就是说,一个标量子查询。看到第13.2.10.1节“作为标量操作数的子查询”.子查询
)
{
是ODBC转义语法,为ODBC兼容性而接受。这个值是标识符
expr
}expr
.的{
而且}
语法中的花括号应该按字面意思写;它们不是语法描述中其他地方使用的元异步。
match_expr
表明匹配
表达式。看到第12.10节“全文查册功能”.
case_expr
表明情况下
表达式。看到第12.5节“流量控制功能”.
interval_expr
表示时间间隔。看到时间间隔.
interval_expr
In表达式表示时间间隔。间隔有这样的语法:
时间间隔expr单位
expr
代表一个数量。单位
表示解释数量的单位;它是一个说明符,例如小时
,一天
,或周
.的时间间隔
关键字和单位
说明符不区分大小写。
的期望形式expr
参数为每个单位
价值。
表9.2时间间隔表达式和单位参数
单位 价值 |
预期expr 格式 |
---|---|
微秒 |
微秒 |
第二个 |
秒 |
一分钟 |
分钟 |
小时 |
小时 |
一天 |
天 |
周 |
周 |
月 |
个月 |
季度 |
季度 |
一年 |
年 |
SECOND_MICROSECOND |
的秒。微秒的 |
MINUTE_MICROSECOND |
分:秒。微秒的 |
MINUTE_SECOND |
“分:秒” |
HOUR_MICROSECOND |
小时:分钟:秒。微秒的 |
HOUR_SECOND |
“小时:分钟:秒” |
HOUR_MINUTE |
“小时:分钟” |
DAY_MICROSECOND |
“天小时:分钟:秒。微秒的 |
DAY_SECOND |
“天小时:分钟:秒” |
DAY_MINUTE |
“天小时:分钟” |
DAY_HOUR |
“天小时” |
YEAR_MONTH |
“YEARS-MONTHS” |
中允许任何标点分隔符expr
格式。表中显示的是建议的分隔符。
时间间隔用于某些功能,例如DATE_ADD ()
而且DATE_SUB ()
:
mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY);—> '2018-05-02' mysql> SELECT DATE_SUB('2018-05-01',INTERVAL 1 YEAR);-> '2017-05-01' mysql> SELECT DATE_ADD('2020-12-31 23:59:59', -> INTERVAL 1 SECOND);-> ' 21-01-01 00:00:00' mysql> SELECT DATE_ADD('2018-12-31 23:59:59', -> INTERVAL 1 DAY);-> ' 19-01-01 23:59:59' mysql> SELECT DATE_ADD(' 21-12-31 23:59:59', -> INTERVAL '1:1' MINUTE_SECOND);-> '2101-01-01 00:01:00' mysql> SELECT DATE_SUB(' 25-01-01 00:00:00', -> INTERVAL '1 1:1:1' DAY_SECOND);-> ' 24-12-30 22:58:59' mysql> SELECT DATE_ADD('1900-01-01 00:00:00', -> INTERVAL '-1 10' DAY_HOUR);SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);-> '1997-12-02' mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002', -> INTERVAL '1.999999' SECOND_MICROSECOND);——>“1993-01-01 00:00:01.000001”
日期+时间间隔expr单位日期-时间间隔expr单位
时间间隔
是允许在expr
单位
+
如果另一侧的表达式是date或datetime值,则为操作符。为-
运营商,时间间隔
只允许在右侧,因为从间隔中减去date或datetime值没有意义。expr
单位
mysql> SELECT '2018-12-31 23:59:59' + INTERVAL 1 SECOND;-> '2019-01-01 00:00:00' mysql> SELECT INTERVAL 1 DAY + '2018-12-31';—> '2019-01-01' mysql> SELECT '2025-01-01' - INTERVAL 1秒;——>“2024-12-31 23:59:59”
的提取()
函数使用相同的类型单位
说明符,DATE_ADD ()
或DATE_SUB ()
,但从日期中提取部分,而不是执行日期算术:
SELECT SELECT (FROM '2019-07-02');-> 2019 mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03');- > 201907
时间间隔可用于创建事件
声明:
在当前时间戳+时间间隔1小时内创建事件。SET mycol = mycol + 1;
如果指定的间隔值太短(不包括预期从单位
关键字),MySQL认为您已经删除了interval值的最左边的部分。例如,如果指定a单位
的DAY_SECOND
的价值。expr
预计有天、小时、分钟和秒的部分。如果你指定一个值,比如“1:10”
, MySQL假设天和小时部分丢失,值表示分钟和秒。换句话说,1:10的DAY_SECOND
被解释为1:10的MINUTE_SECOND
.这类似于MySQL的解释方式时间
值表示经过的时间,而不是一天中的时间。
expr
作为字符串处理,因此如果使用时间间隔
.例如,使用的间隔说明符HOUR_MINUTE
,“6/4”被视为6小时4分钟,而6/4
计算结果为1.5000
并被视为1小时5000分钟:
mysql> SELECT '6/4', 6/4;SELECT DATE_ADD('2019-01-01', INTERVAL '6/4' HOUR_MINUTE);-> ' 19-01-01 06:04:00' mysql> SELECT DATE_ADD(' 19-01-01', INTERVAL 6/4 HOUR_MINUTE);——>“2019-01-04 12:20:00”
为了确保按照预期解释区间值,a把()
可使用操作。治疗6/4
1小时5分钟,转换成小数
用单个小数表示的值:
mysql> SELECT (6/4 AS DECIMAL(3,1));-> 1.5 mysql> SELECT DATE_ADD('1970-01-01 12:00:00', -> INTERVAL CAST(6/4 AS DECIMAL(3,1)) HOUR_MINUTE);——>“1970-01-01 13:05:00”
如果在日期值中添加或减去包含时间部分的内容,结果将自动转换为datetime值:
mysql> SELECT DATE_ADD('2023-01-01',间隔1天);SELECT DATE_ADD('2023-01-01', INTERVAL 1 HOUR);——>“2023-01-01 01:00:00”
如果你加入月
,YEAR_MONTH
,或一年
并且生成的日期的日期大于新月份的最大天数,该日期将调整为新月份的最大天数:
mysql> SELECT DATE_ADD('2019-01-30', INTERVAL 1 MONTH);——>“2019-02-28”
日期算术运算需要完整的日期,不能处理不完整的日期,例如“2016-07-00”
或者严重畸形的日期:
mysql> SELECT DATE_ADD('2016-07-00', INTERVAL 1 DAY);-> NULL mysql> SELECT '2005-03-32' + INTERVAL 1 MONTH;- >零