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_QUOTESSQL 模式,则字符串只能用'括起来,服务器将用"括起来的字符串解释为标识符。\是字符串中的转义字符。在 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_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 语句”.在
CREATE TABLE中使用TEMPORARY或IF NOT EXISTS。在
DROP TABLE和DROP DATABASE中使用IF EXISTS。使用单个
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 节,“聚合函数”.您可以将
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%MMOD(。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 节,“聚合函数”。