1.8.1 MySQL 对标准 SQL 的扩展
MySQL Server 支持某些您可能在其他 SQL DBMS 中找不到的扩展。请注意,如果使用它们,您的代码将无法移植到其他 SQL Server。在某些情况下,可以使用以下形式的 Comments 编写包含 MySQL 扩展但仍可移植的代码:
/*! MySQL-specific code */
在这种情况下,MySQL 服务器将像其他任何 SQL 语句一样解析并执行 Comments 中的代码,但是其他 SQL Server 将忽略这些扩展。例如,MySQL 服务器在以下语句中识别出STRAIGHT_JOIN
关键字,而其他服务器则不能:
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
如果在!
字符后添加版本号,则仅当 MySQL 版本大于或等于指定的版本号时,才会执行 Comments 中的语法。以下 Comments 中的KEY_BLOCK_SIZE
子句仅由 MySQL 5.1.10 或更高版本的服务器执行:
CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;
以下描述列出了按类别组织的 MySQL 扩展。
- 磁盘上数据的组织
MySQL Server 将每个数据库 Map 到 MySQL 数据目录下的目录,并将数据库内的 tableMap 到数据库目录中的文件名。这有一些含义:
-
在具有区分大小写的文件名的 os(例如大多数 Unix 系统)上的 MySQL Server 中,数据库和 table 名区分大小写。参见第 9.2.3 节“标识符区分大小写”。
- 您可以使用标准的系统命令来备份,重命名,移动,删除和复制由
MyISAM
存储引擎 Management 的 table。例如,可以通过重命名该 table 所对应的.MYD
,.MYI
和.frm
文件来重命名MyISAM
table。 (不过,最好使用RENAME TABLE或ALTER TABLE ... RENAME
并让服务器重命名文件。)
- 您可以使用标准的系统命令来备份,重命名,移动,删除和复制由
-
通用语言语法
-
默认情况下,字符串可以用
"
和'
括起来。如果启用了ANSI_QUOTES SQL 模式,则字符串只能用'
括起来,并且服务器会将"
括起来的字符串解释为标识符。-
\
是字符串中的转义字符。 -
在 SQL 语句中,您可以使用*
db_name.tbl_name
*语法访问来自不同数据库的 table。某些 SQL Server 提供相同的功能,但称为User space
。 MySQL Server 不支持 table 空间,例如CREATE TABLE ralph.my_table ... IN my_tablespace
这样的语句中使用的 table 空间。
-
-
SQL 语句语法
-
ANALYZE TABLE,CHECK TABLE,OPTIMIZE TABLE和REPAIR TABLE语句。
-
CREATE DATABASE,DROP DATABASE和ALTER DATABASE语句。参见第 13.1.11 节“ CREATE DATABASE 语句”,第 13.1.22 节“ DROP DATABASE 语句”和第 13.1.1 节“ ALTER DATABASE 语句”。
-
DO语句。
-
EXPLAIN SELECT获取有关查询优化器如何处理 table 的描述。
-
SHOW语句。参见第 13.7.5 节“ SHOW 语句”。通过使用SELECT查询
INFORMATION_SCHEMA
,可以更标准的方式获取许多特定于 MySQL 的SHOW语句产生的信息。参见第 24 章,INFORMATION_SCHEMAtable。 -
使用LOAD DATA。在许多情况下,此语法与 Oracle LOAD DATA兼容。参见第 13.2.6 节“ LOAD DATA 语句”。
-
在ALTER TABLE语句中使用
CHANGE col_name
,DROP col_name
或DROP INDEX,IGNORE
或RENAME
。在ALTER TABLE语句中使用多个ADD
,ALTER
,DROP
或CHANGE
子句。参见第 13.1.8 节“ ALTER TABLE 语句”。 -
使用索引名称,在列前缀上进行索引,以及在CREATE TABLE语句中使用
INDEX
或KEY
。参见第 13.1.18 节“ CREATE TABLE 语句”。 -
将
TEMPORARY
或IF NOT EXISTS
与CREATE TABLE一起使用。 -
将
IF EXISTS
与DROP TABLE和DROP DATABASE一起使用。 -
使用单个DROP TABLE语句删除多个 table 的功能。
-
INSERT INTO tbl_name SET col_name = ...
语法。 -
在SELECT语句中使用
INTO OUTFILE
或INTO DUMPFILE
。参见第 13.2.9 节“ SELECT 语句”。 -
诸如SELECT语句中的
STRAIGHT_JOIN
或SQL_SMALL_RESULT
之类的选项。 -
您无需在
GROUP BY
子句中命名所有选定的列。对于某些非常特定但非常普通的查询,这可以提供更好的性能。参见第 12.20 节“聚合函数”。 -
您可以使用
GROUP BY
而不是ORDER BY
来指定ASC
和DESC
。 -
使用
:=
赋值运算符在语句中设置变量的能力。参见第 9.4 节“用户定义的变量”。
-
-
Data types
-
MEDIUMINT,SET和ENUM数据类型,以及各种BLOB和TEXT数据类型。
AUTO_INCREMENT
,BINARY
,NULL
,UNSIGNED
和ZEROFILL
数据类型属性。
-
功能和运算符
-
为了使从其他 SQL 环境迁移的用户更容易,MySQL Server 支持许多功能的别名。例如,所有字符串函数都支持标准 SQL 语法和 ODBC 语法。
-
与 C 编程语言一样,MySQL Server 理解||和&&运算符 table 示逻辑 OR 和 AND。在 MySQL Server 中,||和OR是同义词,&&和AND也是同义词。由于这种漂亮的语法,MySQL Server 不支持用于字符串连接的标准 SQL ||运算符。使用CONCAT()代替。由于CONCAT()接受任意数量的参数,因此很容易将||运算符的使用转换为 MySQL Server。
-
使用COUNT(DISTINCT value_list),其中*
value_list
*具有多个元素。 -
字符串比较默认情况下不区分大小写,排序 Sequences 由当前字符集的排序规则确定,默认情况下为
latin1
(cp1252 西欧)。要执行区分大小写的比较,应使用BINARY
属性声明列或使用BINARY
强制转换,这将导致使用基础字符代码值而不是词法 Sequences 来进行比较。 -
%运算符是MOD()的同义词。也就是说,
N % M
等效于MOD(N,M)。 C 程序员和 PostgreSQL 与%的支持。 -
=,<>,<=,<,>=,>,<<,>>,<=>,AND,OR或LIKE运算符可用于SELECT语句中输出列列 table(在
FROM
的左侧)中的 table 达式。例如:
-
mysql> SELECT col1=1 AND col2=2 FROM my_table;
-
LAST_INSERT_ID()函数返回最新的
AUTO_INCREMENT
值。参见第 12.15 节“信息功能”。 -
数值允许LIKE。
-
REGEXP和NOT REGEXP扩展了正则 table 达式运算符。
-
带有一个参数或两个以上参数的CONCAT()或CHAR()。 (在 MySQL Server 中,这些函数可以使用可变数量的参数.)
-
BIT_COUNT(),CASE,ELT(),FROM_DAYS(),FORMAT(),IF(),PASSWORD(),ENCRYPT(),MD5(),ENCODE(),DECODE(),PERIOD_ADD(),PERIOD_DIFF(),TO_DAYS()和WEEKDAY()功能。
-
使用TRIM()修剪子字符串。标准 SQL 仅支持删除单个字符。
-
GROUP BY
函数STD(),BIT_OR(),BIT_AND(),BIT_XOR()和GROUP_CONCAT()。参见第 12.20 节“聚合函数”。