MySQL Server 支持一些您不可能在其他 SQL DBMS 中找到的扩展。请注意,如果您使用它们,您的代码可能无法移植到其他 SQL 服务器。在某些情况下,您可以编写包含 MySQL 扩展但仍然可移植的代码,方法是使用以下形式的注释:
/*! MySQL-specific code */
在这种情况下,MySQL Server 会像处理任何其他 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 Server 将每个数据库映射到 MySQL 数据目录下的一个目录,并将数据库中的表映射到数据库目录中的文件名。这有一些含义:
在具有区分大小写文件名的操作系统(例如大多数 Unix 系统)上的 MySQL Server 中,数据库和表名称区分大小写。请参阅 第 9.2.3 节,“标识符区分大小写”。
您可以使用标准系统命令来备份、重命名、移动、删除和复制由
MyISAM
存储引擎管理的表。例如,可以MyISAM
通过重命名 表对应的 、 和 文件来.MYD
重.MYI
命名表。.frm
(尽管如此,最好使用RENAME TABLE
orALTER TABLE ... RENAME
并让服务器重命名文件。)
通用语言语法
默认情况下,字符串可以用
"
以及括起来'
。如果ANSI_QUOTES
启用了 SQL 模式,则字符串只能由 括起来'
,服务器将被括起来的字符串解释"
为标识符。\
是字符串中的转义字符。db_name.tbl_name
在 SQL 语句中,您可以使用语法 访问来自不同数据库的表 。一些 SQL 服务器提供相同的功能,但将其称为User space
. MySQL Server 不支持像这样的语句中使用的表空间:CREATE TABLE ralph.my_table ... IN my_tablespace
。
SQL语句语法
、
ANALYZE TABLE
、CHECK TABLE
和 语句OPTIMIZE TABLE
。REPAIR TABLE
、
CREATE DATABASE
和 语句DROP DATABASE
。ALTER DATABASE
参见第 13.1.10 节,“CREATE DATABASE 语句”, 第 13.1.21 节,“DROP DATABASE 语句”和 第 13.1.1 节,“ALTER DATABASE 语句”。DO
声明 。EXPLAIN SELECT
获取查询优化器如何处理表的描述。SET
声明 。 请参阅第 13.7.4.1 节,“变量赋值的 SET 语法”。SHOW
声明 。请参阅 第 13.7.5 节,“SHOW 语句”。许多特定于 MySQL 的SHOW
语句生成的信息可以通过使用SELECT
查询 以更标准的方式获得INFORMATION_SCHEMA
。请参阅 第 21 章,INFORMATION_SCHEMA 表。的使用
LOAD DATA
。在许多情况下,此语法与 Oracle 兼容LOAD DATA
。请参阅 第 13.2.6 节,“加载数据语句”。使用 of
REPLACE
而不是DELETE
plusINSERT
。请参阅 第 13.2.8 节,“REPLACE 语句”。在 语句中 使用、 、 或 。在语句中使用多个、 、或 子句 。请参阅第 13.1.7 节,“ALTER TABLE 语句”。
CHANGE
col_name
DROP
col_name
DROP INDEX
IGNORE
RENAME
ALTER TABLE
ADD
ALTER
DROP
CHANGE
ALTER TABLE
索引名称的使用、列前缀上的索引以及语句中的
INDEX
orKEY
的使用。CREATE TABLE
请参阅 第 13.1.17 节,“CREATE TABLE 语句”。使用
TEMPORARY
或IF NOT EXISTS
与CREATE TABLE
。使用
IF EXISTS
withDROP TABLE
和DROP DATABASE
。使用单个
DROP TABLE
语句删除多个表的能力。INSERT INTO
句法。tbl_name
SETcol_name
= ...在 语句中 使用
INTO OUTFILE
or 。请参阅 第 13.2.9 节,“SELECT 语句”。INTO DUMPFILE
SELECT
选项如
STRAIGHT_JOIN
orSQL_SMALL_RESULT
inSELECT
statements。您不需要在
GROUP BY
子句中命名所有选定的列。这为一些非常具体但非常正常的查询提供了更好的性能。请参阅 第 12.19 节,“聚合函数”。您可以指定
ASC
和DESC
withGROUP BY
,而不仅仅是 withORDER BY
。:=
使用赋值运算符 在语句中设置变量的能力 。请参阅 第 9.4 节,“用户定义的变量”。
数据类型
函数和运算符
为了方便从其他 SQL 环境迁移的用户,MySQL Server 支持许多函数的别名。例如,所有字符串函数都支持标准 SQL 语法和 ODBC 语法。
MySQL Server 将
||
and&&
运算符理解为逻辑 OR 和 AND,就像在 C 编程语言中一样。在 MySQL 服务器中,||
和OR
是同义词,就像&&
和一样AND
。由于这种良好的语法,MySQL 服务器不支持||
用于字符串连接的标准 SQL 运算符;改用CONCAT()
。因为CONCAT()
接受任意数量的参数,所以很容易将||
运算符的使用转换为 MySQL 服务器。使用where 有多个元素。
COUNT(DISTINCT
value_list
)value_list
字符串比较默认不区分大小写,排序顺序由当前字符集的排序规则决定,默认为
latin1
(cp1252 West European)。要改为执行区分大小写的比较,您应该使用该BINARY
属性声明您的列或使用BINARY
强制转换,这会导致使用底层字符代码值而不是词汇顺序进行比较。运算符是的
%
同义词MOD()
。也就是说, 相当于 . 支持 C 程序员并与 PostgreSQL 兼容。N
%M
MOD(
N
,M
)%
,
=
,<>
,<=
,<
,>=
,>
,<<
,>>
,<=>
,AND
,OR
或LIKE
运算符可用于语句中输出列列表(在 的左侧FROM
)的SELECT
表达式中。例如:mysql> SELECT col1=1 AND col2=2 FROM my_table;
该
LAST_INSERT_ID()
函数返回最近的AUTO_INCREMENT
值。请参阅 第 12.16 节,“信息功能”。LIKE
在数值上是允许的。The
REGEXP
和NOT REGEXP
扩展的正则表达式运算符。CONCAT()
或CHAR()
带有一个参数或两个以上的参数。(在 MySQL 服务器中,这些函数可以采用可变数量的参数。),
BIT_COUNT()
,CASE
,ELT()
,FROM_DAYS()
,FORMAT()
,IF()
,PASSWORD()
,ENCRYPT()
,MD5()
,ENCODE()
,DECODE()
,PERIOD_ADD()
,PERIOD_DIFF()
和 函数TO_DAYS()
。WEEKDAY()
使用 of
TRIM()
修剪子字符串。标准 SQL 仅支持删除单个字符。GROUP BY
函数STD()
、BIT_OR()
、BIT_AND()
、BIT_XOR()
和GROUP_CONCAT()
。 _ 请参阅 第 12.19 节,“聚合函数”。