MySQL 服务器支持一些扩展,这些扩展在其他 SQL DBMS 中不太可能找到。请注意,如果您使用它们,您的代码很可能无法移植到其他 SQL 服务器。在某些情况下,您可以编写包含 MySQL 扩展但仍然可移植的代码,方法是使用以下形式的注释
/*! MySQL-specific code */
在这种情况下,MySQL 服务器会像解析和执行其他任何 SQL 语句一样解析和执行注释中的代码,但其他 SQL 服务器应该忽略这些扩展。例如,MySQL 服务器在以下语句中识别 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 服务器将每个数据库映射到 MySQL 数据目录下的一个目录,并将数据库中的表映射到数据库目录中的文件名。因此,在具有区分大小写文件名的操作系统(如大多数 Unix 系统)上,MySQL 服务器中的数据库和表名区分大小写。请参阅 第 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 节,“SET 语法用于变量赋值”.SHOW
语句。请参阅 第 15.7.7 节,“SHOW 语句”。许多 MySQL 特定SHOW
语句产生的信息可以通过使用SELECT
查询INFORMATION_SCHEMA
来以更标准的方式获取。请参阅 第 28 章,INFORMATION_SCHEMA 表.使用
LOAD DATA
。在许多情况下,此语法与 OracleLOAD DATA
兼容。请参阅 第 15.2.9 节,“LOAD DATA 语句”.使用
REPLACE
而不是DELETE
加INSERT
。请参阅 第 15.2.12 节,“REPLACE 语句”.在
ALTER TABLE
语句中使用CHANGE
、col_name
DROP
或col_name
DROP INDEX
、IGNORE
或RENAME
。在一个ALTER TABLE
语句中使用多个ADD
、ALTER
、DROP
或CHANGE
子句。请参阅 第 15.1.9 节,“ALTER TABLE 语句”.使用索引名,对列前缀进行索引,以及在
CREATE TABLE
语句中使用INDEX
或KEY
。请参阅 第 15.1.20 节,“CREATE TABLE 语句”.在
CREATE TABLE
中使用TEMPORARY
或IF NOT EXISTS
。在
DROP TABLE
和DROP DATABASE
中使用IF EXISTS
。使用单个
DROP TABLE
语句删除多个表的能力。INSERT INTO
语法。tbl_name
SETcol_name
= ...在
SELECT
语句中使用INTO OUTFILE
或INTO DUMPFILE
。请参阅 第 15.2.13 节,“SELECT 语句”.在
SELECT
语句中使用STRAIGHT_JOIN
或SQL_SMALL_RESULT
等选项。您不需要在
GROUP BY
子句中命名所有选定的列。这为某些非常具体但相当正常的查询提供了更好的性能。请参阅 第 14.19 节,“聚合函数”.您可以将
ASC
和DESC
与GROUP BY
一起使用,而不仅仅是与ORDER BY
一起使用。使用
:=
赋值运算符可以在语句中设置变量。请参见 第 11.4 节,“用户定义变量”。
数据类型
函数和运算符
为了方便从其他 SQL 环境迁移的用户,MySQL Server 支持许多函数的别名。例如,所有字符串函数都支持标准 SQL 语法和 ODBC 语法。
MySQL Server 理解
||
和&&
运算符表示逻辑 OR 和 AND,就像 C 编程语言一样。在 MySQL Server 中,||
和OR
是同义词,&&
和AND
也是同义词。由于这种不错的语法,MySQL Server 不支持标准 SQL||
字符串连接运算符;请改用CONCAT()
。由于CONCAT()
可以接受任意数量的参数,因此很容易将||
运算符的用法转换为 MySQL Server。在
value_list
包含多个元素的情况下使用COUNT(DISTINCT
。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
值。请参见 第 14.15 节,“信息函数”。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()
。请参见 第 14.19 节,“聚合函数”。