1.7.1 MySQL 对标准 SQL 的扩展
MySQL Server 支持一些您不太可能在其他 SQL DBMSs 中找到的一些扩展。请注意,如果您使用它们,您的代码很可能不具备跨平台性。在某些情况下,您可以编写包含 MySQL 扩展的代码,但仍然是可移植的,通过以下形式的注释:
/*! MySQL-specific code */
在这种情况下,MySQL Server 解析和执行注释中的代码,就像对任何其他 SQL 语句一样,但是其他服务器应该忽略扩展。例如,MySQL Server 认识以下语句中的 STRAIGHT_JOIN
关键字,但其他服务器不应该:
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
如果您在注释中添加版本号,语句只在 MySQL 版本大于或等于指定版本号时执行。以下注释中的 KEY_BLOCK_SIZE
子句只有 MySQL 5.1.10 或更高版本的服务器才能执行:
CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;
以下描述列举了 MySQL 扩展,按类别组织。
-
磁盘数据组织
MySQL Server 将每个数据库映射到 MySQL 数据目录下的一个目录,并将数据库中的表名映射到数据库目录下的文件名。因此,在具有区分大小写的文件名操作系统(如大多数 Unix 系统)上,数据库和表名在 MySQL Server 中是区分大小写的。见第11.2.3节,“标识符大小写敏感性”。
-
通用语言语法
-
默认情况下,字符串可以用
"
和'
括起来。如果启用了ANSI_QUOTES
SQL 模式,字符串只能用'
括起来,服务器将以"
括起来的字符串解释为标识符。 -
\
在字符串中是转义字符。 -
在 SQL 语句中,您可以使用
db_name.tbl_name
语法访问来自不同数据库的表。一些 SQL 服务器提供了相同的功能,但称之为User space
。MySQL 服务器不支持像这样语句中的表空间:CREATE TABLE ralph.my_table ... IN my_tablespace
。
-
-
SQL 语句语法
-
CREATE DATABASE
、DROP DATABASE
和ALTER DATABASE
语句。见第15.1.12节,“CREATE DATABASE 语句”、第15.1.24节,“DROP DATABASE 语句” 和 第15.1.2节,“ALTER DATABASE 语句”。 -
DO
语句。 -
EXPLAIN SELECT
以获取查询优化器对表的处理描述。 -
SET
语句。见第15.7.6.1节,“变量赋值语法”。 -
SHOW
语句。见第15.7.7节,“SHOW 语句”。许多 MySQL特定的SHOW
语句的信息可以通过使用SELECT
查询INFORMATION_SCHEMA
获得。见第28章,INFORMATION_SCHEMA 表。 -
使用
LOAD DATA
。许多情况下,这种语法与 OracleLOAD DATA
兼容。见第15.2.9节,“LOAD DATA 语句”。 -
使用
CHANGE
、col_name
DROP
、col_name
DROP INDEX
、IGNORE
或RENAME
在ALTER TABLE
语句中。使用多个ADD
、ALTER
、DROP
或CHANGE
子句在ALTER TABLE
语句中。见第15.1.9节,“ALTER TABLE 语句”. -
使用索引名称、对列的前缀索引和在
CREATE TABLE
语句中使用INDEX
或KEY
。见第15.1.20节,“CREATE TABLE 语句”. -
使用
TEMPORARY
或IF NOT EXISTS
与CREATE TABLE
。 -
使用
IF EXISTS
与DROP TABLE
和DROP DATABASE
。 -
单个
DROP TABLE
语句删除多个表的能力。 -
INSERT INTO
语法。tbl_name
SETcol_name
= ... -
INTO OUTFILE
或INTO DUMPFILE
在SELECT
语句中使用。见第15.2.13节,“SELECT 语句”。 -
STRAIGHT_JOIN
或SQL_SMALL_RESULT
在SELECT
语句中使用。 -
不需要在
GROUP BY
子句中命名所有选择的列。这对某些非常特定的,但正常查询,提供了更好的性能。见第14.19节,“聚合函数”。 -
可以使用
ASC
和DESC
与GROUP BY
,而不仅限于ORDER BY
。 -
可以在语句中使用
:=
赋值运算符来设置变量。见第11.4节,“用户定义变量”。
-
数据类型
-
函数和操作符
-
为了方便来自其他 SQL 环境的用户,MySQL 服务器支持许多函数的别名。例如,所有字符串函数都支持标准 SQL 语法和 ODBC 语法。
-
MySQL 服务器理解
||
和&&
运算符,意思是逻辑或和与,类似于C语言。MySQL 服务器中||
和OR
是同义词,同样&&
和AND
。由于这种语法,MySQL 服务器不支持标准SQL||
运算符用于字符串连接;使用CONCAT()
而不是。因为CONCAT()
可以接受任意多个参数,所以可以轻松地将||
运算符转换为 MySQL 服务器。 -
使用
COUNT(DISTINCT
,其中value_list
)value_list
中有多个元素。 -
默认情况下,字符串比较是大小写不敏感的,排序顺序由当前字符集的排序规则确定,当前字符集为
utf8mb4
。要执行大小写敏感比较,可以将列声明为BINARY
属性或使用BINARY
转换,导致比较使用底层字符代码值,而不是词法顺序。 -
%
运算符是MOD()
的同义词,即
等价于N
%M
MOD(
。N
,M
)%
支持C语言程序员和与PostgreSQL兼容性。 -
=
,<>
,<=
,<
,>=
,>
,<<
,>>
,<=>
,AND
,OR
或LIKE
运算符可以在SELECT 语句的输出列列表(FROM 子句左侧)中使用。例如:mysql> SELECT col1=1 AND col2=2 FROM my_table;
-
LAST_INSERT_ID() 函数返回最近的自增值。见第14.15节,“信息函数”。
-
LIKE
允许在数值上使用。 -
扩展正则表达式操作符
REGEXP
和NOT REGEXP
。 -
BIT_COUNT()、
CASE
、ELT()
、FROM_DAYS()
、FORMAT()
、IF()
、MD5()
、PERIOD_ADD()
、PERIOD_DIFF()
、TO_DAYS()
和WEEKDAY()
函数。 -
使用
TRIM()
函数来截断子串。标准SQL只支持删除单个字符。 -
GROUP BY
函数:STD()
、BIT_OR()
、BIT_AND()
、BIT_XOR()
和GROUP_CONCAT()
。见第14.19节,“聚合函数”。
-