目录
- 1. 常量
- 1.1 数值常量
- 1.2 字符串常量
- 1.3 日期时间常量
- 1.4布尔值
- 1.5 NULL值
- 2. 变量
- 2.1 系统变量
- 2.2 用户变量
- 3. 运算符与表达式
- 3.1 赋值运算符
- 3.2 算术运算符
- 3.3 比较运算符
- 3.4 判断运算符
- 3.5 字符串匹配
- 3.6 逻辑运算符和位运算符
- 3.7 表达式和运算符的优先级
- 4. 系统函数
- 参考书籍
1. 常量
1.1 数值常量
-
十进制数常量
十进制数常量分为整数常量和浮点数常量,整数常量即不带小数点的十进制数,浮点数常量是使用小数点的数值常量。 -
非十进制数常量
非十进制数常量包括b(B)二进制表示和x(X)十六进制表示,它们只能表示整数。有两种表示方式:
- 以0打头,在进制表示符后跟进制数;
- 以进制表示符打头后跟进制数字符串,但十六进制数字需要双数。
1.2 字符串常量
字符串常量可以用引号括起来,也可以通过十六进制表达。
-
一般字符串常量
一般字符串常量用单引号括起来,例如:‘你好,How are you!’。其中,ASCII字符用一个字节存储,中文用2个字节存储。 -
Unicode字符串常量
Unicode字符串常量前面有一个N标志符,代表SQL-92标准的国际语言(National Language),用单引号括起字符串。例如:N’你好,How are you!'。其中,每个字符(中文或者英文)用两个字节存储。 -
字符串中特殊的字符表示
在字符串中不仅可以使用普通的字符,也可使用几个转义序列来表示特殊的字符,见下表。每个转义序列以一个反斜杠(“\”)开始。序列 含意 \0 一个ASCII零值字节(NUL)字符 \n 一个回车符 \r 一个换行符(Windows中使用\r\n作为新行标志) \t 一个定位符 \b 一个退格符 \Z 一个ASCII 为26字符(Ctrl+Z) \’ 一个单引号(“'”) \" 一个双引号(“"”) \\ 一个反斜线(“\”) \% 一个“%”符,用于在正文中搜索包含“%”字符,否则 “%”将解释为一个通配符。 \_ 一个“_”符,用于在正文中搜索包含“”字符,否则 “”将解释为一个通配符。 -
字符串中包含引号字符
字符串内包含单引号(‘),字符串需要用双引号("),否则需要用转义字符(’)表示单引号;字符串内包含双引号(“),字符串需要用单引号('),否则需要用转义字符(”)表示双引号。 -
十六进制、二进制表示字符串
每对(即2个)十六进制数字被转换为一个字符,不区分大小写。每8位(1个字节)二进制数字被转换为一个字符。
在输出显示时,十六进制和二进制表示被默认为表达字符,而在参与算术运算时则被认为是表达数值。
1.3 日期时间常量
满足日期时间要求的字符串它当然本身就是字符串,但当用于日期时间位置、符合日期时间格式要求并且有效时,就会被看成是日期时间常量。
日期型常量包括年、月、日,如“2023-09-20”格式。
时间型常量包括小时数、分钟数、秒数及微秒数,如“10:38:33.00025”格式。
日期时间型常量是日期时间组合,如“2023-09-20 10:38:33”。
注意,MySQL是按“年-月-日”的顺序表示日期的,中间的间隔符“-”也可以使用如“\”、“@”或“%”等特殊符号。此外,日期时间常量必须有效,如’2023-02-31’的字符串就是错误的日期时间常量。
1.4布尔值
布尔值只包含两个可能的值:TRUE
和 FALSE
。TRUE
的数字值为 1
,FALSE
的数字值为 0
。
1.5 NULL值
NULL
值可适用于各种列类型,它通常用来表示“没有值”、“无数据”等含义,并且不同于数字类型(0),或字符串类型的空字符串(‘’)。
2. 变量
2.1 系统变量
MySQL有一些特定的设置,例如,有些定义数据如何被存储,有些影响到处理速度,还有些与日期有关,这些设置就是系统变量。
-
系统变量获取和设置
系统变量在MySQL服务器启动时就被引入并初始化为默认值。例如:@@VERSION可获得当前使用的MySQL版本,像这样的系统变量的值是不可以改变的。大多数的系统变量应用于SQL语句中必须在名称前加两个@符号,而为了与其他SQL产品保持一致,某些特定的系统变量是要省略这@@符号的。如CURRENT_DATE(系统日期)、CURRENT_TIME(系统时间)、CURRENT_TIMESTAMP(系统时间戳)和CURRENT_USER(SQL用户名)。
有些系统变量是可以通过SET语句来修改的:
SET [GLOBAL| SESSION] 系统变量名 = 表达式
或者
SET @@GLOBAL.| @@SESSION.系统变量名 = 表达式
-
全局系统变量和会话系统变量
-
全局系统变量(指定GLOBAL):当MySQL启动的时候,全局系统变量就被初始化了,并且应用于此后每一个启动的会话。如果设置GLOBAL来系统变量(需要超级用户权限),则该值被记住,并被用于新的连接,直到服务器重新启动为止。
-
会话系统变量只适用于当前的会话。大多数会话系统变量的名字和全局系统变量的名字相同。当启动会话的时候,默认情况下每个会话系统变量都和同名的全局系统变量的值相同。一个会话系统变量的值是可以改变的,但是这个新的值仅适用于当前正在运行的会话。
-
若改变了全局系统变量的值,同名的会话系统变量的值也保持不变。
-
-
系统变量清单
SHOW VARIABLES [LIKE 条件] #显示系统变量清单。 SHOW GLOBAL VARIABLES [LIKE 条件] #显示所有全局系统变量 SHOW SESSION VARIABLES [LIKE 条件] #显示所有会话系统变量
2.2 用户变量
用户自己定义的变量叫用户变量,可在其中保存值,以后再引用它,这样在一个会话中可以将值从一个语句传递到另一个语句。
用户变量可用下列语句定义和赋值:
SET @变量名 = 表达式, ...
说明:
-
变量名由当前字符集的文字和数字字符、“.”、“_”和“$”组成。当变量名中需要包含一些特殊符号(如空格、#等)时,可以使用双引号或单引号将整个变量括起来。@必须放在一个用户变量的前面,以便将它和列名区分开。
-
用户变量的数据类型取决于赋予它的表达式值。表达式可以是常量、已经赋值的用户变量或它们通过运算符组成的式子,也可以是NULL值。
-
没有初始化的用户变量的值为NULL。
-
只有当一个用户变量已经被创建并初始化后,它才可以用于其他SQL语句中,变量名前必须加上@符号。
-
用其他语句代替SET语句来为用户变量分配一个值,分配符必须为“:=”,而不能用“=”,因为在非SET语句中“=”被视为比较操作符。
-
用户变量可以用于存放数据库的查询结果。
3. 运算符与表达式
3.1 赋值运算符
因“=”只有在SET语句中才被作为赋值运算符使用,其他上下文情形下都被视作等于比较运算符,而“:=”则在任何合法的SQL语句中都是赋值运算符,故实际应用中要进行赋值运算,建议优先采用“:=”形式。
3.2 算术运算符
算术运算符是用于数值型数据运算的,常用的算术运算符见下表。
运算符 | 作用 | 实例 |
---|---|---|
DIV | 整数除法 | 5 DIV 2 = 2 |
/ | 除法 | 5 / 2 = 2.5 |
%,MOD | 取模运算 | 5 % 2 = 1 |
* | 乘法 | 5 * 2 = 10 |
- | 减法或负号 | -5-2 = -7 |
+ | 加法 | -5 + 2 = -3 |
3.3 比较运算符
运算符 | 作用 |
---|---|
= | 等于 |
<=> | 安全等于 |
<>.!= | 不等于 |
<= | 小于等于 |
< | 小于 |
>= | 大于等于 |
> | 大于 |
等于(=
)时的一些注意事项:
- 若两个参数均为数值或者数值表达式,则按照数值进行比较。
- 若用数值字符串和数字进行比较,则自动将字符串转换为数字后用数值进行比较。
- 用非数值字符串和数字进行比较,字符串转换为0,然后进行比较。
- 若两个都是(单引号或双引号括起)字符串,则按照字符串进行比较。只有字符串顺序和个数完全相同,字符串才相等。注意,空格也是字符。
- ASCII码字符在不同的字符集中存储的代码是相同的,中文在不同的中文字符集中存储的代码是相同的,但在中文字符集和其他非中文字符集代码是不同的。
- 大小写字符是否相等取决于当前字符排序规则。
- 元组比较两项对应列的数据项是否相等。
- 若有一个或两个参数为NULL,则比较运算的结果为NULL。
- 半角字符和全角字符是不相等的。
3.4 判断运算符
IS NULL(ISNULL)
和IS NOT NULL
- 值是否在范围内:
BETWEEN...AND...
- 值是否在其中:
IN、NOT IN
3.5 字符串匹配
-
字符串通配符匹配:
LIKE
表达式 LIKE 匹配条件
如果表达式满足匹配条件,返回值为1;如果不匹配,则返回0。表达式或匹配条件中任何一个为空,则结果为NULL。
可以使用下面两种通配符:
- ‘%’:匹配任何数目的字符,甚至包括’'字符。
- ‘_’:只能匹配一个字符。
-
字符串是否匹配正则表达式规范:
REGEXP
通过正则表达式可实现更复杂的字符串匹配。
表达式 REGEXP 匹配条件
如果表达式满足匹配条件,返回1;如果不满足,则返回0。若表达式或匹配条件任意一个为空,则结果为
NULL
。REGEXP运算符在进行匹配时,常用的有下面几种通配符:
- ‘^’:匹配以该字符后面的字符开头的字符串;
- ‘$’:匹配以该字符后面的字符结尾的字符串;
- ‘.’:匹配任何一个单字符;
- ‘[…]’:匹配在方括号内的任何字符。
- ‘*’:匹配零个或多个在它前面的字符,例如,'x*‘匹配任何数量的’x’字符,’[0-9]*‘匹配任何数量的数字,而’*'匹配任何数量的任何字符。
3.6 逻辑运算符和位运算符
-
逻辑运算符
运算符 作用 NOT,! 逻辑非 AND,&& 逻辑与 OR,|| 逻辑或 XOR 逻辑异或 -
位逻辑运算符和位移动运算符
运算符 作用 ~ 按位取反 & 按位与 | 按位或 ^ 按位异或 << 左移 >> 右移
3.7 表达式和运算符的优先级
-
表达式
所谓“表达式”就是操作数(包括常量和变量)、列名函数通过运算符进行有机组合的式子。 -
运算符的优先级
当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序,会影响所得到的运算结果。MySQL运算符的优先级如下表所示,级别数字越小表示优先级越高。
运算符 级别 ! 0 -,~ 1 ^ 2 *,/,DIV,%,MOD 3 +,- 4 <<, >> 5 & 6 | 7 =,<=>,<>,!=,<=,<,>=,>,IS NULL,IN,LIKE,REGEXP 8 BETWEEN AND 9 NOT 10 AND,&& 11 XOR 12 OR,|| 13 =,:= 14
4. 系统函数
见 菜鸟教程。
参考书籍
《MySQL实用教程(第4版)》
上一篇文章:【数据库——MySQL】(4)表记录操作——增、删、改
下一篇文章:【数据库——MySQL】(6)查询(1)