MySQL 服务器支持一些其他 SQL DBMS 不具备的扩展。请注意,如果您使用它们,您的代码可能无法在其他 SQL 服务器上移植。在某些情况下,您可以编写包含 MySQL 扩展的代码,但仍然是可移植的,方法是使用以下形式的注释:
/*! MySQL-specific code */
在这种情况下,MySQL 服务器将解析和执行注释中的代码,就像任何其他 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_QUOTES
SQL 模式,字符串只能用'
包围,服务器将用"
包围的字符串解释为标识符。 -
\
是字符串中的转义字符。 -
在 SQL 语句中,您可以使用
db_name.tbl_name
语法访问不同数据库中的表。一些 SQL 服务器提供了相同的功能,但称其为User space
。MySQL 服务器不支持像CREATE TABLE ralph.my_table ... IN my_tablespace
语句中的表空间。
-
-
SQL 语句语法
-
The
ANALYZE TABLE
、CHECK TABLE
、OPTIMIZE TABLE
和REPAIR TABLE
语句。 -
The
CREATE DATABASE
、DROP DATABASE
和ALTER DATABASE
语句。见 第 15.1.12 节,“CREATE DATABASE 语句”、第 15.1.24 节,“DROP DATABASE 语句” 和 第 15.1.2 节,“ALTER DATABASE 语句”。 -
The
DO
语句。 -
EXPLAIN SELECT
以获取查询优化器处理表的描述。 -
The
SET
语句。见 第 15.7.6.1 节,“SET 变量赋值语法”。 -
该
SHOW
语句。见 第 15.7.7 节,“显示语句”。许多 MySQL 特有的SHOW
语句产生的信息可以通过使用SELECT
查询INFORMATION_SCHEMA
来获得。见 第 28 章,INFORMATION_SCHEMA 表。 -
使用
LOAD DATA
。在许多情况下,该语法与 OracleLOAD DATA
兼容。见 第 15.2.9 节,“LOAD DATA 语句”。 -
使用
REPLACE
而不是DELETE
加INSERT
。见 第 15.2.12 节,“REPLACE 语句”。 -
使用
CHANGE
、col_name
DROP
或col_name
DROP INDEX
、IGNORE
或RENAME
在ALTER TABLE
语句中。使用多个ADD
、ALTER
、DROP
或CHANGE
子句在ALTER TABLE
语句中。见 第 15.1.9 节,“ALTER TABLE 语句”。 -
使用索引名称、列的前缀索引和
INDEX
或KEY
在CREATE TABLE
语句中。见 第 15.1.20 节,“CREATE TABLE 语句”。 -
使用
TEMPORARY
或IF NOT EXISTS
与CREATE TABLE
。 -
使用
IF EXISTS
与DROP TABLE
和DROP DATABASE
。 -
使用单个
DROP TABLE
语句删除多个表的能力。 -
INSERT INTO
语法。tbl_name
SETcol_name
= ... -
使用
INTO OUTFILE
或INTO DUMPFILE
在SELECT
语句中。见 第 15.2.13 节,“SELECT 语句”。 -
选项,如
STRAIGHT_JOIN
或SQL_SMALL_RESULT
在SELECT
语句中。 -
您不需要在
GROUP BY
子句中命名所有选定的列。这可以提高某些非常具体但非常正常的查询的性能。见 第 14.19 节,“聚合函数”。 -
您可以在
GROUP BY
中指定ASC
和DESC
,不仅仅是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。 -
使用
COUNT(DISTINCT
,其中value_list
)value_list
有多个元素。 -
字符串比较默认情况下是不区分大小写的,排序顺序由当前字符集的排序规则确定,默认为
utf8mb4
。要执行区分大小写的比较,可以将列声明为BINARY
属性或使用BINARY
转换,这将使比较使用基础字符代码值而不是词汇顺序。 -
操作符
%
是MOD()
的同义词。也就是说,
等同于N
%M
MOD(
。N
,M
)%
是为 C 程序员和与 PostgreSQL 兼容性而支持的。 -
该
=
、<>
、<=
、<
、>=
、>
、<<
、>>
、<=>
、AND
、OR
或LIKE
运算符可以在输出列列表(FROM左侧)中使用,例如在SELECT
语句中。mysql> SELECT col1=1 AND col2=2 FROM my_table;
-
该
LAST_INSERT_ID()
函数返回最新的AUTO_INCREMENT
值。请参阅 第 14.15 节,“信息函数”。 -
LIKE
在数字值上是允许的。 -
该
REGEXP
和NOT REGEXP
扩展的正则表达式运算符。 -
该
CONCAT()
或CHAR()
函数带有一个或多个参数。(在 MySQL 服务器中,这些函数可以接受可变数量的参数。) -
该
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 节,“聚合函数”。
-