1.7.1标准SQL的MySQL扩展
MySQL服务器支持您可能在其他SQL DBMS中找不到的一些扩展。请注意,如果您使用它们,您的代码将不能移植到其他SQL服务器。在某些情况下,您可以使用以下形式的注释编写包含MySQL扩展名的代码,但仍可移植。
/ *!MySQL-specific code* /
在这种情况下,MySQL Server解析并执行注释中的代码,就像其他SQL语句一样,但其他SQL服务器将忽略这些扩展。例如,MySQL ServerSTRAIGHT_JOIN
在以下语句中识别关键字,但其他服务器将不会:
选择 /*!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.2节“识别符大小写敏感度”。
您可以使用标准系统命令备份,重命名,移动,删除和复制由
MyISAM
存储引擎管理的表。例如,有可能重命名MyISAM
通过重命名表.MYD
,.MYI
和.frm
文件,其中表对应。(不过,最好使用RENAME TABLE
或ALTER TABLE ... RENAME
让服务器重命名文件。)
一般语言语法
默认情况下,字符串可以通过封闭
"
和'
。如果ANSI_QUOTES
启用了SQL模式,字符串只能被包围,'
并且服务器解释由"
标识符包围的字符串。\
是字符串中的转义字符。在SQL语句中,您可以使用
db_name.tbl_name
语法访问来自不同数据库的表。一些SQL服务器提供相同的功能,但称之为User space
。MySQL Server不支持像这样的语句中使用的表空间:CREATE TABLE ralph.my_table ... IN my_tablespace
。
SQL语句语法
的
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节“变量赋值的设置语法”。该
SHOW
声明。请参见第13.7.5节“显示语法”。许多MySQL特定SHOW
语句产生的信息可以通过使用SELECT
查询以更标准的方式获得INFORMATION_SCHEMA
。请参见第21章INFORMATION_SCHEMA表。使用
LOAD DATA INFILE
。在很多情况下,这种语法与Oracle兼容LOAD DATA INFILE
。请参见第13.2.6节“加载数据INFILE语法”。使用
REPLACE
而不是DELETE
加号INSERT
。请参见第13.2.8节“REPLACE语法”。使用的,或者,或者在声明。使用多个的,,,或在条款声明。请参见第13.1.7节“ALTER TABLE语法”。
CHANGE
col_name
DROP
col_name
DROP INDEX
IGNORERENAME
ALTER TABLE
ADDALTERDROPCHANGE
ALTER TABLE
使用索引名称,索引在列的前缀上,以及使用
INDEX
或KEY
在CREATE TABLE
语句中。请参见第13.1.17节“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
声明中。请参见第13.2.9节“选择语法”。诸如
STRAIGHT_JOIN
或SQL_SMALL_RESULT
在SELECT
语句中的选项。您不需要在
GROUP BY
子句中列出所有选定的列。这为一些非常具体但相当正常的查询提供了更好的性能。参见第12.18节“聚合(GROUP BY)功能”。您可以指定
ASC
和DESC
使用GROUP BY
,而不仅仅是与ORDER BY
。在
:=
赋值运算符的语句中设置变量的能力。请参见第9.4节“用户定义的变量”。
数据类型
功能和运算符
为了使从其他SQL环境迁移的用户更容易,MySQL Server支持许多功能的别名。例如,所有字符串函数都支持标准SQL语法和ODBC语法。
MySQL服务器了解
||
和操作&&
符意味着逻辑OR和AND,如C编程语言。在MySQL服务器,||
并且OR
是同义词,因为是&&
和AND
。由于这个很好的语法,MySQL Server不支持||
用于字符串连接的标准SQL运算符;使用CONCAT()
代替。因为CONCAT()
需要任意数量的参数,所以很容易将||
运算符的使用转换为MySQL Server。使用哪里有多个元素。
COUNT(DISTINCT
value_list
)value_list
字符串比较默认情况下不区分大小写,排序顺序由当前字符集的排序确定,
latin1
默认为(cp1252西欧)。要执行区分大小写的比较,您应该BINARY
使用属性声明列或使用BINARY
转换,这样可以使用底层字符代码值而不是词法排序来完成比较。的
=
,<>
,<=
,<
,>=
,>
,<<
,>>
,<=>
,AND
,OR
,或LIKE
操作者可以在输出列列表中的表达式中使用(到的左侧FROM
)的SELECT
语句。例如:mysql> SELECT col1=1 AND col2=2 FROM my_table;
该
LAST_INSERT_ID()
函数返回最近的AUTO_INCREMENT
值。请参见第12.14节“信息功能”。LIKE
允许使用数值。的
REGEXP
和NOT REGEXP
扩展正则表达式运算符。的
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.18节“聚合(GROUP BY)功能”。