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_QUOTESSQL模式,则字符串只能用'括起来,服务器将"括起来的字符串解释为标识符。\是字符串中的转义字符。在 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 函数”。