目录
1、导入导出、备份恢复
1.1 导入一个纯数据文件
数据文件导入,可以把一个文件里的数据保存进一张表。导入语句格式为:
LOAD DATA INFILE '文件路径和文件名' INTO TABLE 表名字;
TERMINATED BY '\r\n';
(在运行 OS X 的苹果电脑上,应使用行结束符\r
。)
如果你愿意,你能明确地在 LOAD DATA
语句中指出列值的分隔符和行尾标记
比如,自定义字段间分隔符为逗号,
LOAD DATA INFILE '/var/lib/mysql-files/pet.txt' INTO TABLE pet FIELDS TERMINATED BY ',';
上诉语句支持类似如下格式的数据导入:
Fulffy,Harold,cat,f,1993-02-04,\N
Claws,Gwen,cat,m,1994-03-17,\N
Fulffy,Harold,cat,f,1993-02-04,\N
Fulffy,Harold,cat,f,1993-02-04,\N
Fulffy,Harold,cat,f,1993-02-04,\N
Fulffy,Harold,cat,f,1993-02-04,\N
现在 SQL6 目录下有一个名为 in.txt 的文件,我们尝试把这个文件中的数据导入数据库 mysql_shiyan 的 employee 表中。
由于导入导出大量数据都属于敏感操作,根据 mysql 的安全策略,导入导出的文件都必须在指定的路径下进行,在 mysql 终端中查看路径变量:
mysql -uroot
mysql> show variables like '%secure%';
+--------------------------+-----------------------+
| Variable_name | Value |
+--------------------------+-----------------------+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | /var/lib/mysql-files/ |
+--------------------------+-----------------------+
3 rows in set (0.00 sec)
注意到 secure_file_priv 变量指定安全路径为 /var/lib/mysql-files/
,要导入数据文件,需要将该文件移动到安全路径下。
打开 Xfce 终端,输入命令拷贝 SQL6 文件夹到 /var/lib/mysql-files/
目录:
sudo cp -a /home/shiyanlou/Desktop/SQL6 /var/lib/mysql-files/
使用命令 sudo vim /var/lib/mysql-files/SQL6/in.txt
查看 in.txt
文件中的内容:
可以看到其中仅仅包含了数据本身,没有任何的 SQL 语句
再使用以下命令以 root 用户登录数据库,再连接 mysql_shiyan 数据库:
# 在Xfce 终端输入命令
mysql -u root
# 在 MySQL 控制台中输入命令
use mysql_shiyan
查看一下没有导入数据之前,employee 表中的数据:
现在执行导入语句,文件中的数据成功导入 employee 表:
1.2 导出
导出与导入是相反的过程,是把数据库某个表中的数据保存到一个文件之中。导出语句基本格式为:
SELECT 列1,列2 INTO OUTFILE '文件路径和文件名' FROM 表名字;
注意:语句中 “文件路径” 之下不能已经有同名文件。
现在我们把整个 employee 表的数据导出到 /var/lib/mysql-files/ 目录下,导出文件命名为 out.txt具体语句为:
SELECT * INTO OUTFILE '/var/lib/mysql-files/out.txt' FROM employee;
用 gedit 可以查看导出文件 /var/lib/mysql-files/out.txt
的内容:
也可以使用
sudo cat /var/lib/mysql-files/out.txt
命令查看。
1.3 备份
数据库中的数据十分重要,出于安全性考虑,在数据库的使用中,应该注意使用备份功能。
备份与导出的区别:导出的文件只是保存数据库中的数据;而备份,则是把数据库的结构,包括数据、约束、索引、视图等全部另存为一个文件。
mysqldump 是 MySQL 用于备份数据库的实用程序。它主要产生一个 SQL 脚本文件,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等。
使用 mysqldump 备份的语句:
mysqldump -u root 数据库名>备份文件名; #备份整个数据库
mysqldump -u root 数据库名 表名字>备份文件名; #备份整个表
mysqldump 是一个备份工具,因此该命令是在终端中执行的,而不是在 mysql 交互环境下
我们尝试备份整个数据库 mysql_shiyan
,将备份文件命名为 bak.sql
,先 Ctrl+D
退出 MySQL 控制台,再打开 Xfce 终端,在终端中输入命令:
cd /home/shiyanlou/
mysqldump -u root mysql_shiyan > bak.sql;
使用命令 “ls” 可见已经生成备份文件 bak.sql
:
你可以用 gedit 查看备份文件的内容,可以看见里面不仅保存了数据,还有所备份的数据库的其他信息。
1.4 恢复
source /tmp/SQL6/MySQL-06.sql
这就是一条恢复语句,它把 MySQL-06.sql 文件中保存的mysql_shiyan
数据库恢复。
还有另一种方式恢复数据库,但是在这之前我们先使用命令新建一个空的数据库 test:
mysql -u root #因为在上一步已经退出了MySQL,现在需要重新登录
CREATE DATABASE test; #新建一个名为test的数据库
再次 Ctrl+D 退出 MySQL,然后输入语句进行恢复,把刚才备份的 bak.sql 恢复到 test 数据库:
mysql -u root test < bak.sql
我们输入命令查看 test 数据库的表,便可验证是否恢复成功:
mysql -u root #因为在上一步已经退出了MySQL,现在需要重新登录
use test #连接数据库test
SHOW TABLES; #查看test数据库的表
可以看见原数据库的4张表和1个视图,现在已经恢复到 test 数据库中:
再查看 employee 表的恢复情况:
1.5 使用用户变量
通过使用用户变量找出价格最高或者最低的物品:
mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
2、mysql语言结构
2.1 文字值
-
字符串
字符串指用单引号(‘'’)或双引号(‘"’)引用起来的字符序列。例如:
'a string'
"another string"
如果 SQL 服务器模式启用了 ANSI_QUOTES
,可以只用单引号引用字符串,此时用双引号引用的字符串被解释为一个识别符。
字符串可以有一个可选的介绍字符 _charset_name
和 COLLATE
子句:
[_charset_name]'string' [COLLATE collation_name]
例如:
SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;
在字符串中,某些序列具有特殊含义。这些序列均以反斜线(\
)开始,即所谓的转义字符。 MySQL 识别以下转义序列:
这些序列对大小写敏感。例如,\b
为退格,但 \B
为字符B
。
下面的 SELECT 语句显示了引用和转义如何工作:
mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
mysql> SELECT 'This\nIs\nFour\nLines';
mysql> SELECT 'disappearing\ backslash';
查看输出结果,有没有理解一点?
如果你想要在字符串列内插入二进制数据(例如BLOB),必须通过转义序列表示下面的字符:
当编写应用程序时,在将包含这些特殊字符的字符串发送到 MySQL 服务器的 SQL 语句中的数据值之前,必须对它们正确进行转义。可以用两种方法来完成:
- 用转义特殊字符的函数处理字符串。例如,在 C 程序中,可以使用 C 语言的 API 函数 mysql_real_escape_string() 来转义字符。
- 显式转义特殊字符,许多 MySQL API 提供了占位符功能,允许你在查询字符串中插入特殊标记,然后当你发出查询时将数据值同这些标记绑定起来。在这种情况下,API关注转义值中的特殊字符。
-
数值型
整数用一系列阿拉伯数字表示,浮点数使用 .
作为十进制间隔符,以上两种类型的数值均可以在前面加一个-
来表示负值。
合法整数的例子:
1221 0 -32
合法浮点数的例子:
294.42 -32032.6809e+10 148.00
整数可以用在浮点环境中;它被认为与浮点数等效。
-
日期类型
内容比较简单,内容建议阅读官方原文:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html
-
十六进制
MySQL 支持十六进制。在数值文本中,十六进制数如同整数(64位精度)。在字符串文本中,如同二进制字符串,每对十六进制数字被转换为一个字符:
mysql> SELECT x'4D7953514C';
-> 'MySQL'
mysql> SELECT 0xa+0;
-> 10
mysql> SELECT 0x5061756c;
-> 'Paul'
十六进制值的默认类型是字符串。如果想要确保该值能作为数字处理,可以使用 CAST(...AS UNSIGNED)
:
mysql> SELECT 0x41,CAST(0x41 AS UNSIGNED);
-> 'A',65
0x
语法基于 ODBC
。十六进制字符串通常用于ODBC 以便为 BLOB
列提供值。x’hexstring’
语法基于标准 SQL
。
可以用 HEX()
函数将一个字符串或数字转换为十六进制格式的字符串
mysql> SELECT HEX('cat');
-> '636174'
mysql> SELECT 0x636174;
-> 'cat'
-
布尔值
常量 TRUE
等于 1
,常量 FALSE
等于 0
。常量名的大小写随意。
mysql> SELECT TRUE,true,FALSE,false;
-> 1,1,0,0
-
NULL值
NULL
值表示“没有数据”。NULL
可以任意大小写。
请注意 NULL
值不同于数字类型的 0
或字符串类型的空字符串。
对于用 LOAD DATA INFILE
或 SELECT ...INTO OUTFILE
执行的文本文件导入或导出操作, NULL
用序列 \N
表示。
2.2 识别符
数据库、表、索引、列和别名是识别符。
下面的表描述了每类识别符的最大长度和允许的字符:
除了表内注明的限制,识别符不可以包含 ASCII 0
或值为 255
的字节。数据库、表和列名不应以空格结尾。在识别符中可以使用引号识别符,但是应尽可能避免这样使用。
识别符用 Unicode(UTF8)
保存。在 .frm
文件中保存的对表进行定义的识别符和在mysql数据库中的授权表保存的识别符也用 Unicode(UTF8)
保存。在 MySQL 5.1 中授权表(和其它表)的字符串列的大小等于字符个数;这说明(不象以前版本的 MySQL )你可以在这些列保存的值中使用多字节字符而不需要降低字符个数。
识别符可以使用引号引起来也可以不引起来。如果识别符是一个保留字或包含特殊字符,无论何时使用,必须将它引起来。
识别符的引用符是反勾号(‘`’):
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
如果 SQL 服务器模式包括 ANSI_QUOTES
模式选项,还可以用双引号将识别符引起来:
mysql> CREATE TABLE "test" (col INT);
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
如果你引用识别符,可以在识别符内包含识别符引用符。如果识别符内包括的字符与引用识别符的字符相同,则需要用双字符。下面的语句创建一个名为 a`b 包含列 c"d 的表:
mysql> CREATE TABLE `a``b` (`c"d` INT);
-
识别符限制条件
MySQL 允许使用由单个识别符或多个识别符组成的名字。多部分名各组件之间应以句点(‘.’)间隔开。多部分名的开头部分作为限定词,后面的识别符才具有对该名字的解释意义。
在 MySQL 中可以引用下面形式的列:
如果多部分名的组件需要被引用,应分别将它们引起来而不要将整个名字引起来。例如,`my-tables`.`my-column` 有效,而`my-tables.my-column`无效。
不需要在语句中为列指定 tbl_name
或 db_name.tbl_name
前缀,除非列本身很模糊。
举个例子:假定表t1
和t2
各包含一个列c
,你使用 SELECT
语句在 t1
和 t2
中搜索 c
。在这种情况下,c
很模糊,因为它在语句中使用的表内不唯一。你必须用表名 t1.c
或 t2.c
限定它,表示指哪个表。同样,要想用同一语句搜索数据库 db1
中的表 t
和数据库 db2
中的表 t
,你必须将那些表中的列指为 db1.t.col_name
和 db2.t.col_name
。
限定名中句点后面的字必须为一个识别符,因此不需要将它引起来,即使是一个保留字。
语法 .tbl_name
表示当前数据库中的 tbl_name
。该语法与 ODBC
兼容,因为某些 ODBC
程序在表名前面加前缀‘.’字符。
-
识别符大小写敏感
列、索引、存储子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感。
默认情况,表别名在 Unix
中对大小写敏感,但在 Windows
或 Mac OS X
中对大小写不敏感。
在 MySQL 中如何在硬盘上保存和使用表名和数据库名由 lower_case_tables_name
这个系统变量确定,可以在启动 mysqld 时设置。 lower_case_tables_name
可以采用下面的任一值:
在 Unix
上的 lower_case_tables_name
默认值是0,在 Windows
上的 lower_case_tables_name
默认值是 1,Mac OS X
上的默认值是 2。
如果只在一个平台上使用 MySQL,通常不需要更改 lower_case_tables_name
变量。然而,如果你想要在对大小写敏感不同的文件系统的平台之间使用同一个表会遇到困难。例如,在 Unix
中,my_tables
和 MY_tables
是两个不同的表,但在 Windows 中,这两个表名相同,属于同一张表。要想避免由于数据库或表名的大小写造成的数据转移问题,你拥有以下两个选择:
-
在任何系统中设置
lower_case_tables_name=1
。使用该选项的缺点是当使用SHOW TABLES
或SHOW DATABASES
时,看不出原来的名字是用大写还是小写。 -
在
Unix
中使lower_case_tables_name=0
,在Windows
中使lower_case_tables_name=2
。这样了可以保留原数据库名和表名的大小写。缺点是如果将查询转移到Unix
中,必须确保在Windows
中查询的时候总是用正确大小写引用数据库名和表名,原因是在Unix
中大小写很重要,如果大小写不正确,它们将不会生效。
此外:如果你正使用 InnoDB
表,在任何平台上均应将 lower_case_tables_name
设置为 1,以强制将名转换为小写。
请注意在 Unix
中将 lower_case_tables_name
设置为 1 之前,每次重启 mysqld 服务之前必须先将旧的数据库名和表名转换为小写,这样避免重启 mysqld 服务的时候有新的变量名出现。
-
用户自定义变量
可以先在用户自己定义的变量中存储一个值然后在后面引用它;这样可以将该值从一个语句传递到另一个语句。用户自定义变量具有会话专一性,也就是说,一个客户端定义的变量不能被其它客户端看到或使用,当客户端退出时,该客户端连接的所有变量将自动释放。
用户变量的形式为 @var_name
,其中变量名 var_name
可以由当前字符集中的字母数字字符
、.
、_
和 $
组成。 默认字符集是 cp1252 (Latin1)
。可以用 mysqld
的 --default-character-set
选项更改字符集。
设置用户变量的一个途径是执行 SET 语句:
SET @var_name = expr [, @var_name = expr] ...
对于 SET
语句,可以使用 =
或 :=
作为分配符,分配给每个变量的 expr
可以为整数、实数、字符串或者 NULL
值。
除了使用 SET
语句也可以为用户变量分配一个值。在这种情况下,分配符必须为 :=
而不能用 =
,因为在非 SET
语句中 =
被视为比较操作符:
# 尝试输入以下语句观察结果
mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
用户变量可以用于表达式中。目前不包括明显需要文字值的语句,例如 SELECT
语句的 LIMIT
子句,或者 LOAD DATA
语句的 IGNORE number LINES
子句。
如果使用没有初始化的变量,其值是 NULL
。
注:在 SELECT
语句中,表达式是在被发送到客户端后才进行计算。这说明在 HAVING
、GROUP BY
或者 ORDER BY
子句中,在 SELECT
列表中不能使用将值赋值到变量的表达式。例如,下面的语句不能按期望进行:
mysql> SELECT (@aa:=id) AS a,(@aa+3) AS b FROM tbl_name HAVING b=5;
上面 HAVING
子句中使用 @aa
这个变量引用了 b
,但是这并不能按期望生效:@aa
并不是当前行的值,而是前面所选定的行的 id 值。因此一般情况下是不建议在语句的一个部分为用户变量分配一个值而在同一语句的其它部分又使用该变量,这可能会得到期望的结果,当然也可能不会。
另一种情况是,先使用 SET
语句将值赋值到一个用户自定义变量,再在另一个非 SET
语句中,重新读取该用户自定义变量并在该语句中对原来的变量的值进行更改,此时该自定义用户的变量的值取决于表达式本身出现的先后顺序。下面的例子说明了该点:
mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name;
对于该 SELECT
语句,MySQL 在第一行向客户端报告 @a
是一个字符串 'test',并且将 @a
的所有访问结果转换为字符串,即使 @a
在第2行中设置为一个数字。只有在执行完 SELECT
语句后,@a
的值在下一语句中才是数字20。
要想避免这种问题,要么不在同一个语句中设置并使用相同的变量,要么在使用前将变量设置为0
、0.0
或者''来定义其类型。
-
注释语句
MySQL服务器支持3种注释风格:
-
以
#
字符开始到行尾。 -
以
--
序列开始到行尾。请注意--
(双破折号)注释风格要求第 2 个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。该语法与标准 SQL 注释语法稍有不同。 -
以
/*
序列开始到*/
序列结束。结束序列不一定在同一行中,因此该语句允许注释跨越多行
3、mysql数据类型
下面将学习 Mysql 的各个数据类型,它们大体可以分为三个大类,数值型、日期型和文本型,三大类下方又分多个子类,如数值型可分为整数型,浮点型。一些类型比较特别,如枚举型,也将其一并归入意思相近的大类中。
3.1 数值类型
下面为数值类型的概述
如果为一个数值列指定 ZEROFILL
,MySQL 将自动为该列添加 UNSIGNED
属性,其中数值型数据允许为 UNSIGNED
属性和 SIGNED
属性,然而由于这种数据类型默认的属性是 SIGNED
,因此没有必要额外声明 SIGNED
属性;
SERIAL
是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
的一个别名;
在给整数类型的列定义时,SERIAL DEFAULT VALUE
是NOT NULL AUTO_INCREMENT UNIQUE
的一个别名。
注意:在进行两个整数的减法运算时,如果其中一个整数的属性为 UNSIGNED
,那么减法的结果也是无符号的.
字段中包含的可选参数 M 指的是整型数据的最小显示宽度,不足按 0 补足,超过宽度不做处理,且最大有效显示宽度是 255。
注意区分显示宽度与存储大小或类型包含的值的范围无关。
BIT[(M)]
位域类型。M 表示每个值的位数,范围为从 1 到 64 。如果 M 被省略,默认为 1。
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
很小的整数。带符号的范围是 -128 到 127。无符号的范围是 0 到 255。
BOOL,BOOLEAN
是TINYINT(1) 的同义词。0
值被视为假。非 0
值视为真。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
小的整数。带符号的范围是 -32768 到 32767。无符号的范围是 0 到 65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
中等大小的整数。带符号的范围是 -8388608 到8388607 。无符号的范围是 0 到 16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]
普通大小的整数。带符号的范围是 -2147483648 到 2147483647。无符号的范围是 0 到 4294967295
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
这是 INT 的同义词。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
大整数。带符号的范围是 -9223372036854775808 到 9223372036854775807。无符号的范围是 0 到 18446744073709551615。
应清楚 BIGINT
类型列的下述内容:
- 所有的算术都是使用带符号的
BIGINT
或DOUBLE
类型的数值,因此除了位函数,不应使用大于9223372036854775807(63位)的无符号的大整数! 如果这样做,结果中的最后几位可能出错,这是由于将BIGINT
值转换为DOUBLE
进行四舍五入时造成的错误。
MySQL 可以在以下情况下处理 BIGINT
:
-
在
BIGINT
列中使用整数保存大的无符号的值时。 -
在
MIN(col_name)
或MAX(col_name)
中,其中col_name
指BIGINT
列。 -
使用操作符(
+
,-
,*
等等)并且两边操作数均为整数时。 -
也可以在
在BIGINT
列中使用一个字符串保存一个固定的整数值。在这种情况下,MySQL执行字符串到数字之间的转换,其间不存在双精度表示。 -
当两个操作数均为整数值时,
-
、+
和*
操作符使用BIGINT
算数。这说明如果乘两个大整数(函数返回的整数值),当结果大于 9223372036854775807 时,会得到意想不到的结果。 -
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
小(单精度)浮点数。允许的值是 -3.402823466E+38 到 -1.175494351E-38、0 和 1.175494351E-38 到 3.402823466E+38。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。
M 是浮点数的总位数,D 是小数点后面的位数。如果 M 和 D 被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约 7 位小数位。
如果指定 UNSIGNED
,不允许负值。
使用浮点数可能会遇到意想不到的问题,因为在 MySQL 中的所有计算用双精度完成。
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
普通大小(双精度)浮点数。允许的值 -1.7976931348623157E+308 到 -2.2250738585072014E-308
2.2250738585072014E-308 到 1.7976931348623157E+308。
这些是理论限制,基于 IEEE 标准。实际的范围根据硬件或操作系统的不同可能稍微小些。 M 是小数总位数,D 是小数点后面的位数。如果 M 和 D 被省略,根据硬件允许的限制来保存值。双精度浮点数精确到大约 15 位小数位。 如果指定 UNSIGNED,不允许负值。
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]
,REAL[(M,D)] [UNSIGNED] [ZEROFILL]
为 DOUBLE
的同义词。除非:如果 SQL 服务器模式启动 REAL_AS_FLOAT
选项,REAL
是 FLOAT
的同义词而不是 DOUBLE
的同义词。
FLOAT(p) [UNSIGNED] [ZEROFILL]
浮点数 .p
表示精度,但 MySQL 只使用该值来确定列的数据类型是否为 FLOAT
或 DOUBLE
。如果p
取值在 0 到 24 之间,数据类型将变为没有 M
或 D
值的 FLOAT
类型。如果 p
取值为 25
到 53
,数据类型将变为没有 M
或 D
值的 DOUBLE
型。这种情况下列范围与本节前面描述的单精度 FLOAT
或双精度 DOUBLE
数据类型相同。
FLOAT(p)
语法与ODBC兼容。
3.2 日期和时间类型
DATE
日期。支持的范围为 1000-01-01
到 9999-12-31
。MySQL 以 YYYY-MM-DD
格式显示 DATE
值,但允许使用字符串或数字类型数据为 DATE
列赋值。
DATETIME[(fsp)]
日期和时间的组合。支持的范围是 1000-01-01 00:00:00
到 9999-12-31 23:59:59
。MySQL 以 YYYY-MM-DD HH:MM:SS
格式显示 DATETIME
值,但允许使用字符串或数字为 DATETIME
列赋值。
其中,可选参数 fsp
取值范围是 0-6 可以指定精确到秒的分位数,默认的是 0,指精确到秒。
TIMESTAMP[(fsp)]
时间戳。范围是 1970-01-01 00:00:00
到 2038-01-19 03:14:07.999999
。
TIMESTAMP
列用于执行 INSERT
或 UPDATE
操作时记录日期和时间。如果你不分配一个值,表中的第一个 TIMESTAMP
列自动设置为最近操作的日期和时间。也可以通过分配一个 NULL
值,将 TIMESTAMP
列设置为当前的日期和时间。
TIME
时间。范围是 -838:59:59
到 838:59:59
。MySQL 以 HH:MM:SS
格式显示 TIME
值,但允许使用字符串或数字为 TIME 列分配值。
YEAR[(2|4)]
两位或四位格式的年。默认是四位格式。在四位格式中,允许的值是 1901
到 2155
和 0000
。在两位格式中,允许的值是 70
到 69
,表示从1970
年到 2069
年。MySQL以 YYYY
格式显示 YEAR
值,但允许使用字符串或数字为 YEAR
分配值。
4、函数--补充
4.1 操作符优先级
以下列表显示了操作符优先级的由低到高的顺序。排列在同一行的操作符具有相同的优先级。
其中,部分操作符的优先级取决于 SQL 的模式:
- 默认情况下,
||
是逻辑运算符OR
。当启用 PIPES_AS_CONCAT 模式时,||
就是一个字符串连接符,优先级处于^
与一元运算符之间。 - 默认情况下,
!
的优先级高于NOT
。但当启用HIGH_NOT_PRECEDENCE
模式时,!
和NOT
拥有相同的优先级。
4.2 比较函数和操作符
MySQL 按照以下规则进行数值比较:
- 若函数中有一个或两个参数都是
NULL
,则比较运算的结果为NULL
,除非是等号比较运算符<=>
。 - 若同一个比较运算中的两个参数都是字符串类型,则作为字符串进行比较。
- 若两个参数均为整数,则按照整数进行比较。
- 十六进制值在不作为数字进行比较时,则按照二进制字符串处理。
- 假如参数中的一个为
TIMESTAMP
或DATETIME
数据类型,而其它参数均为常数,则在进行比较前应该将常数转为timestamp
类型。这样做的目的是为了使ODBC
的进行更加顺利。注意: 这不用于IN()
中的参数!
为了更加可靠,在进行对比时通常使用完整的datetime/date/time
字符串。 - 在其它情况下,参数作为浮点数(实数)进行比较。
在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为 cp1252 Latin1
,同时也适用于英语)。
为了达到比较的目的,可使用 CAST()
函数将某个值转为另外一种类型。使用 CONVERT()
可以将字符串值转为不同的字符集。
下面对各类操作符的使用进行示例:
-
<=>
空值安全的等号:这个操作符与
=
操作符执行相同的比较操作,不过在两个操作码均为NULL
时,其返回至为1
而不为NULL
,而当一个操作码为NULL
时,其所得值为0
而不为NULL
。对于行比较,(a, b) <=> (x, y)相当于:(a <=> x) AND (b <=> y)。
-
<>
或!=
不等于: -
expr BETWEEN min AND max
假如expr
大于或等于min
且expr
小于或等于max
, 则BETWEEN
的返回值为1
,否则是0
。若所有参数都是同一类型,则上述关系相当于表达式 :min <= expr AND expr <= max
。其它类型的转换 根据本章开篇所述规律进行,且适用于 3 种参数中任意一种。expr NOT BETWEEN min AND max
这相当于NOT(expr BETWEEN min AND max)
。
-
COALESCE(value,...)
返回参数列表当中的第一个非NULL
值,在没有非NULL
值的情况下返回值为NULL
。
-
GREATEST(value1,value2,...)
当有2个或2个以上参数时,返回值为最大(最大值的)参数。比较参数所依据的规律同LEAST()相同。
在所有参数为NULL
的情况下,GREATEST()
的返回值为NULL
。
-
expr NOT IN (value,...)
这与NOT (expr IN (value,...))
相同。ISNULL(expr)
如果expr
为NULL
,那么ISNULL()
的返回值为1
,否则返回值为0
。mysql> SELECT ISNULL(1+1); mysql> SELECT ISNULL(1/0);
通常使用ISNULL()来判断一个值是否为
NULL
。(使用=
比较符对比一个值与NULL
值是错误的)。
-
INTERVAL(N,N1,N2,N3,...)
假如N < N1
,则返回值为0
;假如N < N2
等,则返回值为1
;假如N
为NULL,则返回值为-1
。所有的参数均按照整数处理。为了这个函数的正确运行,必须满足N1 < N2 < N3 < ……< Nn
。其原因是使用了二分查找(极快速)。mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
4.3 逻辑操作符
-
NOT
,!
:逻辑NOT
。当操作数为
0
时,所得值为1
;当操作数为非零值时,所得值为0
,而当操作数为NOT NULL
时,所得的返回值为NULL
。尝试运行上面的语句,发现最后一个例子产生的结果为
1
,原因是表达式的计算方式和(!1)+1
相同。
-
AND
,&&
:逻辑AND
。当所有操作数均为非零值、并且不为
NULL
时,计算所得结果为1
,当一个或多个操作数为0
时,所得结果为0
,其余情况返回值为NULL
。
-
OR
,||
:逻辑OR
。当两个操作数均为非
NULL
值时,如有任意一个操作数为非零值,则结果为1
,否则结果为0
。当有一个操作数为NULL
时,如另一个操作数为非零值,则结果为1
,否则结果为NULL
。假如两个操作数均为NULL
,则所得结果为NULL
。
-
XOR
:逻辑XOR
。当任意一个操作数为
NULL
时,返回值为NULL
。对于非NULL
的操作数,假如有奇数个操作数为非零值,则计算所得结果为 1 ,否则为 0 。a XOR b
的计算等同于(a AND (NOT b)) OR ((NOT a)和 b)
。