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 扩展,并按类别组织。
-
磁盘上的数据组织
MySQL Server 将每个数据库映射到 MySQL 数据目录下的一个目录,并将数据库中的表映射到数据库目录中的文件名称。因此,在文件名称区分大小写的操作系统(如大多数 Unix 系统)上的 MySQL Server 中,数据库名称和小写字母敏感。请参阅 Section 11.2.3, “Identifier Case Sensitivity”
-
General language syntax
默认情况下,字符串可以用 " 和 ' 括起来。如果启用了 ANSI_QUOTES SQL 模式,则字符串只能用 ' 括起来,并且服务器会将用 " 括起来的字符串解释为标识符。
_\_是字符串中的转义符。
在 SQL 语句中,你可以使用 db_name.tbl_name 语法访问来自不同数据库的表。一些 SQL 服务器提供相同的功能,但称之为 User space 。MySQL Server 不支持此类语句中使用的表空间: CREATE TABLE ralph.my_table … IN my_tablespace 。
-
默认情况下,字符串可以用 " 和 ' 括起来。如果启用了 ANSI_QUOTES SQL 模式,则字符串只能用 ' 括起来,并且服务器会将用 " 括起来的字符串解释为标识符。
-
_\_是字符串中的转义符。
-
在 SQL 语句中,您可以使用 db_name.tbl_name_语法访问不同数据库的表。一些 SQL 服务器提供相同的功能,但称其为 _User space。在类似如下语句: _CREATE TABLE ralph.my_table …​ IN my_tablespace_的语句中,MySQL Server 不支持使用表空间。
-
SQL statement syntax
ANALYZE TABLE 、 CHECK TABLE 、 OPTIMIZE TABLE 和 REPAIR TABLE 语句。
CREATE DATABASE 、 DROP DATABASE 和 ALTER DATABASE 语句。请参阅 Section 15.1.12, “CREATE DATABASE Statement” 、 Section 15.1.24, “DROP DATABASE Statement” 和 Section 15.1.2, “ALTER DATABASE Statement” 。
DO 语句。
EXPLAIN SELECT ,用于获取有关查询优化器如何处理表的说明。
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 代替 DELETE 加 INSERT 。请参阅 Section 15.2.12, “REPLACE Statement” 。
在 ALTER TABLE 语句中使用 CHANGE _col_name, DROP _col_name, or DROP INDEX 、 IGNORE 或 RENAME 。在 link:alter-table.html[ALTER TABLE 语句中使用多个 ADD 、 ALTER 、 DROP 或 CHANGE 子句。请参阅 Section 15.1.9, “ALTER TABLE Statement” 。
在 CREATE TABLE 语句中使用索引名称、前缀部分列上的索引,以及使用 INDEX 或 KEY 。请参阅 Section 15.1.20, “CREATE TABLE Statement” 。
在 CREATE TABLE 中使用 TEMPORARY 或 IF NOT EXISTS 。
在 DROP TABLE 和 DROP DATABASE 中使用 IF EXISTS 。
通过单个 DROP TABLE 语句来删除多表的可能性。
INSERT INTO _tbl_name SET col_name = … 语法。
在 SELECT 语句中使用 INTO OUTFILE 或 INTO DUMPFILE 。请参阅 Section 15.2.13, “SELECT Statement” 。
SELECT 语句中如 STRAIGHT_JOIN 或 SQL_SMALL_RESULT 等选项。
无需在 GROUP BY 子句中命名所有选定的列。针对一些非常具体但相当正常的查询,这样做可以提供更好的性能。请参阅 Section 14.19, “Aggregate Functions” 。
可以将 ASC 和 DESC 与 GROUP BY 配合使用,而不仅限于 ORDER BY。
能够在包含 := 赋值运算符的语句中设置变量。请参阅 Section 11.4, “User-Defined Variables”。
-
ANALYZE TABLE 、 CHECK TABLE 、 OPTIMIZE TABLE 和 REPAIR TABLE 语句。
-
CREATE DATABASE 、 DROP DATABASE 和 ALTER DATABASE 语句。请参阅 Section 15.1.12, “CREATE DATABASE Statement” 、 Section 15.1.24, “DROP DATABASE Statement” 和 Section 15.1.2, “ALTER DATABASE Statement” 。
-
The DO statement.
-
EXPLAIN SELECT ,用于获取有关查询优化器如何处理表的说明。
-
SET 语句。请参阅 Section 15.7.6.1, “SET Syntax for Variable Assignment” 。
-
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” 。
-
RENAME TABLE 的用法。请参阅 Section 15.1.36, “RENAME TABLE Statement” 。
-
在 ALTER TABLE 语句中使用 REPLACE 代替 DELETE 加 INSERT 。请参阅 Section 15.2.12, “REPLACE Statement” 。
-
在 ALTER TABLE 语句中使用 CHANGE _col_name, DROP _col_name, or DROP INDEX 、 IGNORE 或 RENAME 。在 link:alter-table.html[ALTER TABLE 语句中使用多个 ADD 、 ALTER 、 DROP 或 CHANGE 子句。请参阅 Section 15.1.9, “ALTER TABLE Statement” 。
-
在 CREATE TABLE 语句中使用索引名称、前缀部分列上的索引,以及使用 INDEX 或 KEY 。请参阅 Section 15.1.20, “CREATE TABLE Statement” 。
-
在 CREATE TABLE 中使用 TEMPORARY 或 IF NOT EXISTS 。
-
在 DROP TABLE 和 DROP DATABASE 中使用 IF EXISTS 。
-
通过单个 DROP TABLE 语句来删除多表的可能性。
-
INSERT INTO _tbl_name SET col_name = … 语法。
-
在 SELECT 语句中使用 INTO OUTFILE 或 INTO DUMPFILE 。请参阅 Section 15.2.13, “SELECT Statement” 。
-
SELECT 语句中如 STRAIGHT_JOIN 或 SQL_SMALL_RESULT 等选项。
-
无需在 GROUP BY 子句中命名所有选定的列。这对某些非常具体但相当正常的查询而言性能更佳。请参阅 Section 14.19, “Aggregate Functions”。
-
可以将 ASC 和 DESC 与 GROUP BY 配合使用,而不仅限于 ORDER BY。
-
能够在包含 := 赋值运算符的语句中设置变量。请参阅 Section 11.4, “User-Defined Variables”。
-
Data types
AUTO_INCREMENT、BINARY、NULL、UNSIGNED 和 ZEROFILL 数据类型属性。
为了方便从其他 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 强制转换,这会导致使用基础字符代码值而非词汇顺序进行比较。
[role="bare"]comparison-operators.html#operator_equal, <> 、 ⇐ 、 < 、 >= 、 > 、 << link:bit-functions.html#operator_right-shift[,>>] 、 <⇒ 、 AND 、 OR 或 LIKE 运算符可在 SELECT 语句中输出列列表中的表达式(在 FROM 的左侧)中使用。例如: mysql> SELECT col1=1 AND col2=2 FROM my_table; LAST_INSERT_ID() 函数返回最新的 AUTO_INCREMENT 值。请参阅 Section 14.15, “Information Functions” 。
LIKE 允许用于数值。
REGEXP 和 NOT REGEXP 扩展正则表达式运算符。
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() 。请参阅 Section 14.19, “Aggregate Functions” 。
-
为了方便从其他 SQL 环境迁移的用户,MySQL Server 支持许多函数的别名。例如,所有字符串函数均支持标准 SQL 语法和 ODBC 语法。
-
MySQL Server 理解 || 和 && 运算符表示逻辑或和 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[,>>] 、 <⇒ 、 AND 、 OR 或 LIKE 运算符可以在 SELECT 语句的输出列列表(在 FROM 的左侧)中的表达式中使用。例如: mysql> SELECT col1=1 AND col2=2 FROM my_table;
-
LAST_INSERT_ID() 函数返回最近的 AUTO_INCREMENT 值。请参阅 Section 14.15, “Information Functions” 。
-
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() 。请参阅 Section 14.19, “Aggregate Functions” 。