MySql 中文参考指南

1.7.1 MySQL Extensions to Standard SQL

MySQL Server 支持一些其他 SQL DBMS 中不太可能找到的扩展。需要注意的是,如果您使用这些扩展,那么您的代码极有可能不能移植到其他 SQL 服务器。在某些情况下,您可以通过使用如下形式的注释编写包含 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 扩展,并按类别组织。

  1. 磁盘上的数据组织

MySQL Server 将每个数据库映射到 MySQL 数据目录下的一个目录,并将数据库中的表映射到数据库目录中的文件名称。因此,在文件名称区分大小写的操作系统(如大多数 Unix 系统)上的 MySQL Server 中,数据库名称和小写字母敏感。请参阅 Section 11.2.3, “Identifier Case Sensitivity”

  1. General language syntax

默认情况下,字符串可以用 "' 括起来。如果启用了 ANSI_QUOTES SQL 模式,则字符串只能用 ' 括起来,并且服务器会将用 " 括起来的字符串解释为标识符。

_\_是字符串中的转义符。

在 SQL 语句中,你可以使用 db_name.tbl_name 语法访问来自不同数据库的表。一些 SQL 服务器提供相同的功能,但称之为 User space 。MySQL Server 不支持此类语句中使用的表空间: CREATE TABLE ralph.my_table …​ IN my_tablespace

  1. 默认情况下,字符串可以用 "' 括起来。如果启用了 ANSI_QUOTES SQL 模式,则字符串只能用 ' 括起来,并且服务器会将用 " 括起来的字符串解释为标识符。

  2. _\_是字符串中的转义符。

  3. 在 SQL 语句中,您可以使用 db_name.tbl_name_语法访问不同数据库的表。一些 SQL 服务器提供相同的功能,但称其为 _User space。在类似如下语句: _CREATE TABLE ralph.my_table …​ IN my_tablespace_的语句中,MySQL Server 不支持使用表空间。

  4. SQL statement syntax

DO 语句。

EXPLAIN SELECT ,用于获取有关查询优化器如何处理表的说明。

FLUSHRESET 语句。

SHOW 语句。请参阅 Section 15.7.7, “SHOW Statements” 。可以通过使用 SELECT 查询 INFORMATION_SCHEMA 以更标准的方式来获取许多特定于 MySQL 的 SHOW 语句产生的信息。请参阅 Chapter 28, INFORMATION_SCHEMA Tables

LOAD DATA 的用法。在很多情况下,此语法与 Oracle LOAD DATA 兼容。请参阅 Section 15.2.9, “LOAD DATA Statement”

ALTER TABLE 语句中使用 REPLACE 代替 DELETEINSERT 。请参阅 Section 15.2.12, “REPLACE Statement”

ALTER TABLE 语句中使用 CHANGE _col_name, DROP _col_name, or DROP INDEXIGNORERENAME 。在 link:alter-table.html[ALTER TABLE 语句中使用多个 ADDALTERDROPCHANGE 子句。请参阅 Section 15.1.9, “ALTER TABLE Statement”

CREATE TABLE 语句中使用索引名称、前缀部分列上的索引,以及使用 INDEXKEY 。请参阅 Section 15.1.20, “CREATE TABLE Statement”

CREATE TABLE 中使用 TEMPORARYIF NOT EXISTS

DROP TABLEDROP DATABASE 中使用 IF EXISTS

通过单个 DROP TABLE 语句来删除多表的可能性。

UPDATEDELETE 语句的 ORDER BYLIMIT 子句。

INSERT INTO _tbl_name SET col_name = …​ 语法。

INSERTREPLACE 语句的 DELAYED 子句。

INSERTREPLACEDELETEUPDATE 语句的 LOW_PRIORITY 子句。

SELECT 语句中使用 INTO OUTFILEINTO DUMPFILE 。请参阅 Section 15.2.13, “SELECT Statement”

SELECT 语句中如 STRAIGHT_JOINSQL_SMALL_RESULT 等选项。

无需在 GROUP BY 子句中命名所有选定的列。针对一些非常具体但相当正常的查询,这样做可以提供更好的性能。请参阅 Section 14.19, “Aggregate Functions”

可以将 ASCDESCGROUP BY 配合使用,而不仅限于 ORDER BY

能够在包含 := 赋值运算符的语句中设置变量。请参阅 Section 11.4, “User-Defined Variables”

  1. ANALYZE TABLECHECK TABLEOPTIMIZE TABLEREPAIR TABLE 语句。

  2. CREATE DATABASEDROP DATABASEALTER DATABASE 语句。请参阅 Section 15.1.12, “CREATE DATABASE Statement”Section 15.1.24, “DROP DATABASE Statement”Section 15.1.2, “ALTER DATABASE Statement”

  3. The DO statement.

  4. EXPLAIN SELECT ,用于获取有关查询优化器如何处理表的说明。

  5. FLUSHRESET 语句。

  6. SET 语句。请参阅 Section 15.7.6.1, “SET Syntax for Variable Assignment”

  7. SHOW 语句。请参阅 Section 15.7.7, “SHOW Statements” 。可以通过使用 SELECT 查询 INFORMATION_SCHEMA 以更标准的方式来获取许多特定于 MySQL 的 SHOW 语句产生的信息。请参阅 Chapter 28, INFORMATION_SCHEMA Tables

  8. LOAD DATA 的用法。在很多情况下,此语法与 Oracle LOAD DATA 兼容。请参阅 Section 15.2.9, “LOAD DATA Statement”

  9. RENAME TABLE 的用法。请参阅 Section 15.1.36, “RENAME TABLE Statement”

  10. ALTER TABLE 语句中使用 REPLACE 代替 DELETEINSERT 。请参阅 Section 15.2.12, “REPLACE Statement”

  11. ALTER TABLE 语句中使用 CHANGE _col_name, DROP _col_name, or DROP INDEXIGNORERENAME 。在 link:alter-table.html[ALTER TABLE 语句中使用多个 ADDALTERDROPCHANGE 子句。请参阅 Section 15.1.9, “ALTER TABLE Statement”

  12. CREATE TABLE 语句中使用索引名称、前缀部分列上的索引,以及使用 INDEXKEY 。请参阅 Section 15.1.20, “CREATE TABLE Statement”

  13. CREATE TABLE 中使用 TEMPORARYIF NOT EXISTS

  14. DROP TABLEDROP DATABASE 中使用 IF EXISTS

  15. 通过单个 DROP TABLE 语句来删除多表的可能性。

  16. UPDATEDELETE 语句的 ORDER BYLIMIT 子句。

  17. INSERT INTO _tbl_name SET col_name = …​ 语法。

  18. INSERTREPLACE 语句的 DELAYED 子句。

  19. INSERTREPLACEDELETEUPDATE 语句的 LOW_PRIORITY 子句。

  20. SELECT 语句中使用 INTO OUTFILEINTO DUMPFILE 。请参阅 Section 15.2.13, “SELECT Statement”

  21. SELECT 语句中如 STRAIGHT_JOINSQL_SMALL_RESULT 等选项。

  22. 无需在 GROUP BY 子句中命名所有选定的列。这对某些非常具体但相当正常的查询而言性能更佳。请参阅 Section 14.19, “Aggregate Functions”

  23. 可以将 ASCDESCGROUP BY 配合使用,而不仅限于 ORDER BY

  24. 能够在包含 := 赋值运算符的语句中设置变量。请参阅 Section 11.4, “User-Defined Variables”

  25. Data types

MEDIUMINTSETENUM 数据类型,以及各种 BLOBTEXT 数据类型。

AUTO_INCREMENTBINARYNULLUNSIGNEDZEROFILL 数据类型属性。

  1. MEDIUMINTSETENUM 数据类型,以及各种 BLOBTEXT 数据类型。

  2. AUTO_INCREMENTBINARYNULLUNSIGNEDZEROFILL 数据类型属性。

  3. Functions and operators

为了方便从其他 SQL 环境迁移的用户,MySQL Server 支持许多函数的别名。例如,所有字符串函数均支持标准 SQL 语法和 ODBC 语法。

MySQL Server 将 ||&& 运算符理解为逻辑 OR 和 AND,如 C 编程语言中。在 MySQL Server 中, ||OR 是同义词, &&AND 也是同义词。由于此语法很好,因此 MySQL Server 不支持表示字符串连接的标准 SQL || 运算符;改用 CONCAT() 。由于 CONCAT() 接受任意数量的参数,因此可轻松将 || 运算符的使用转换为 MySQL Server。

使用链接:aggregate-functions.html#function_count[ COUNT(DISTINCT _value_list ) ] where _value_list 具有多个元素。

字符串比较默认情况下不区分大小写,排序取决于当前字符集的排序规则,默认情况下为 utf8mb4。要改为执行区分大小写的比较,应使用 BINARY 属性声明列或使用 BINARY 强制转换,这会导致使用基础字符代码值而非词汇顺序进行比较。

% 运算符是 MOD() 的同义词。也就是说, N % M 等效于 MOD(_N,M). %_ ,这对于 C 程序员以及与 PostgreSQL 的兼容性来说都是支持的。

[role="bare"]comparison-operators.html#operator_equal, <><>=><< link:bit-functions.html#operator_right-shift[,>>] 、 <⇒ANDORLIKE 运算符可在 SELECT 语句中输出列列表中的表达式(在 FROM 的左侧)中使用。例如: mysql> SELECT col1=1 AND col2=2 FROM my_table; LAST_INSERT_ID() 函数返回最新的 AUTO_INCREMENT 值。请参阅 Section 14.15, “Information Functions”

LIKE 允许用于数值。

REGEXPNOT REGEXP 扩展正则表达式运算符。

CONCAT()CHAR() 伴有一个或多个参数。(在 MySQL Server 中,这些函数可以采用可变数量的参数。)

BIT_COUNT()CASEELT()FROM_DAYS()FORMAT()IF()MD5()PERIOD_ADD()PERIOD_DIFF()TO_DAYS()WEEKDAY() 函数。

使用 TRIM() 修剪子字符串。标准 SQL 仅支持删除单个字符。

  1. 为了方便从其他 SQL 环境迁移的用户,MySQL Server 支持许多函数的别名。例如,所有字符串函数均支持标准 SQL 语法和 ODBC 语法。

  2. MySQL Server 理解 ||&amp;&amp; 运算符表示逻辑或和 and,就像在 C 编程语言中一样。在 MySQL Server 中, ||OR 是同义词, &amp;&amp;AND 也是同义词。由于这种良好的语法,MySQL Server 不支持用于字符串连接的标准 SQL || 运算符;请改用 CONCAT() 。由于 CONCAT() 接受任意数量的参数,因此可以轻松地将 || 运算符的使用转换到 MySQL Server。

  3. 使用链接:aggregate-functions.html#function_count[ COUNT(DISTINCT _value_list ) ] where _value_list 具有多个元素。

  4. 字符串比较默认情况下不区分大小写,排序取决于当前字符集的排序规则,默认情况下为 utf8mb4。要改为执行区分大小写的比较,应使用 BINARY 属性声明列或使用 BINARY 强制转换,这会导致使用基础字符代码值而非词汇顺序进行比较。

  5. % 运算符是 MOD() 的同义词。也就是说, N % M 等效于 MOD(_N,M). %_ ,这对于 C 程序员以及与 PostgreSQL 的兼容性来说都是支持的。

  6. [role="bare"]comparison-operators.html#operator_equal、 &lt;&gt;&#8656;&lt;&gt;=&gt;<< link:bit-functions.html#operator_right-shift[,>>] 、 &lt;&#8658;ANDORLIKE 运算符可以在 SELECT 语句的输出列列表(在 FROM 的左侧)中的表达式中使用。例如: mysql&gt; SELECT col1=1 AND col2=2 FROM my_table;

  7. LAST_INSERT_ID() 函数返回最近的 AUTO_INCREMENT 值。请参阅 Section 14.15, “Information Functions”

  8. LIKE 允许用于数值。

  9. REGEXPNOT REGEXP 扩展正则表达式运算符。

  10. CONCAT()CHAR() 伴有一个或多个参数。(在 MySQL Server 中,这些函数可以采用可变数量的参数。)

  11. BIT_COUNT()CASEELT()FROM_DAYS()FORMAT()IF()MD5()PERIOD_ADD()PERIOD_DIFF()TO_DAYS()WEEKDAY() 函数。

  12. 使用 TRIM() 修剪子字符串。标准 SQL 仅支持删除单个字符。

  13. GROUP BY 函数 STD()BIT_OR()BIT_AND()BIT_XOR()GROUP_CONCAT() 。请参阅 Section 14.19, “Aggregate Functions”