1.6.1 MySQL 对标准 SQL 的扩展
MySQL Server 支持一些在其他 SQL DBMS 中不太可能找到的扩展。请注意,如果你你用它们,你的代码很可能无法移植到其他 SQL Server。在某些情况下,你可以使用以下形式的注释编写包含 MySQL 扩展但仍可移植的代码:
/*! MySQL-specific code */
在这种情况下,MySQL Server 解析并执行注释中的代码,就像它解析和执行任何其他 SQL 语句一样,但是其他 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中,数据库和表名区分大小写。参阅章节 9.2.3,“标识符区分大小写”。
通用语言语法
默认情况下,字符串可以用
"
以及'
括起来。如果启用了ANSI_QUOTES
SQL模式,则字符串只能用'
括起来,服务器将"
括起来的字符串解释为标识符。\
是字符串中的转义字符。在 SQL 语句中,可以使用 db_name.tbl_name 语法访问不同数据库中的表。某些 SQL Server 提供相同的功能,但称此为
User space
。MySQL Server 不支持v如以下语句中使用的表空间:CREATE TABLE ralph.my_table ... IN my_tablespace
。
SQL 语句语法
ANALYZE TABLE
,CHECK TABLE
,OPTIMIZE TABLE
和REPAIR TABLE
语句。CREATE DATABASE
,DROP DATABASE
和ALTER DATABASE
语句。参阅章节 13.1.12,“CREATE DATABASE 语句”,章节 13.1.24,“DROP DATABASE 语句” 和 章节 13.1.2,“ALTER DATABASE 语句”。EXPLAIN SELECT
获取查询优化器如何处理表的说明。SHOW
语句。参阅章节 13.7.7,“SHOW 语句”。通过使用SELECT
查询INFORMATION_SCHEMA
,可以以更标准的方式获得许多特定于 MySQL 的SHOW
语句生成的信息。参阅 章节 26,“INFORMATION_SCHEMA 表”。LOAD DATA
的使用。在许多情况下,此语法与 Oracle 的LOAD DATA
兼容。参阅章节 13.2.7,“LOAD DATA 语句”。REPLACE
用于替代DELETE
加INSERT
。参阅章节 13.2.9,“REPLACE 语句”。在
ALTER TABLE
语句中使用CHANGE col_name
、DROP col_name
、DROP INDEX
、IGNORE
或RENAME
。在ALTER TABLE
语句中使用多个子语句ADD
、ALTER
、DROP
或CHANGE
。参阅章节 13.1.9,“ALTER TABLE 语句”。在
CREATE TABLE
语句中使用索引名、列前缀上的索引以及INDEX
或KEY
。参阅章节 13.1.20,“CREATE TABLE 语句”。和
CREATE TABLE
一起使用TEMPORARY
或IF NOT EXISTS
。和
DROP TABLE
和DROP DATABASE
一起使用IF EXISTS
。使用单个
DROP TABLE
语句删除多个表的功能。语法
INSERT INTO tbl_name SET col_name = ...
。SELECT
语句的可选项,如STRAIGHT_JOIN
或SQL_SMALL_RESULT
。在
GROUP BY
子句中不需要命名所有选中的列。这为一些非常特定但非常正常的查询提供了更好的性能。参阅章节 12.20,“Aggregate 函数”。你可以在
GROUP BY
中指定DESC
和ASC
,但不能在ORDER BY
中使用。可在语句中使用赋值操作符
:=
设置变量。参阅章节 9.4,“用户定义变量”。
数据类型
函数和操作符
为了方便从其他 SQL 环境迁移的用户,MySQL Server 为许多函数支持别名。例如,所有字符串函数都支持标准 SQL 语法和 ODBC 语法。
MySQL服务器将
||
和&&
运算符理解为逻辑 OR 和 AND,就像在 C 编程语言中一样。在 MySQL Server 中,||
和OR
是同义词,就像&&
和AND
。由于这种良好的语法,MySQL Server 不支持用于字符串连接的标准 SQL||
运算符;改为使用CONCAT()
。因为CONCAT()
接受任意数量的参数,所以很容易转换为 MySQL Server 使用的||
运算符。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()
返回最近的AUTO_INCREMENT
值。参阅章节 12.16,“信息函数”。对数值可使用
LIKE
。REGEXP
和NOT REGEXP
扩展了正则表达式操作符。CONCAT()
或CHAR()
带一个或两个以上参数。(在 MySQL Server 中,这些函数可以接受数量可变的参数。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()
。参阅章节 12.20,“Aggregate 函数”。