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_QUOTESSQL 模式,则字符串只能用'引起来,并且服务器会将用"引起来的字符串解释为标识符。\是字符串中的转义字符。在 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_nameDROP或col_nameDROP 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_nameSETcol_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%MMOD(。支持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 节“聚合函数”。