MySQL 服务器支持一些您不太可能在其他 SQL 数据库管理系统中找到的扩展。请注意,如果您使用它们,您的代码很可能无法移植到其他 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 服务器提供相同的功能,但将其称为用户空间
。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 语句”。可以通过使用SELECT
查询INFORMATION_SCHEMA
以更标准的方式获取许多特定于 MySQL 的SHOW
语句生成的信息。请参阅 第 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 语句”。将
TEMPORARY
或IF NOT EXISTS
与CREATE TABLE
一起使用。将
IF EXISTS
与DROP TABLE
和DROP DATABASE
一起使用。能够使用单个
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 节“聚合函数”。您不仅可以在
ORDER BY
中指定ASC
和DESC
,也可以在GROUP BY
中指定。能够使用
:=
赋值运算符在语句中设置变量。请参阅第 11.4 节“用户定义变量”。
数据类型
函数和运算符
为了方便从其他 SQL 环境迁移的用户,MySQL Server 支持许多函数的别名。例如,所有字符串函数都支持标准 SQL 语法和 ODBC 语法。
MySQL Server 将
||
和&&
运算符理解为逻辑 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 兼容。在
SELECT
语句的输出列列表(FROM
的左侧)中的表达式中,可以使用=
、<>
、<=
、<
、>=
、>
、<<
、>>
、<=>
、AND
、OR
或LIKE
运算符。例如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 节“聚合函数”。