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 TABLEorALTER 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.11 节,“CREATE DATABASE 语句”, 第 13.1.22 节,“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。请参阅 第 24 章,INFORMATION_SCHEMA 表。的使用
LOAD DATA。在许多情况下,此语法与 Oracle 兼容LOAD DATA。请参阅 第 13.2.6 节,“加载数据语句”。使用 of
REPLACE而不是DELETEplusINSERT。请参阅 第 13.2.8 节,“REPLACE 语句”。在 语句中 使用、 、 或 。在语句中使用多个、 、或 子句 。请参阅第 13.1.8 节,“ALTER TABLE 语句”。
CHANGEcol_nameDROPcol_nameDROP INDEXIGNORERENAMEALTER TABLEADDALTERDROPCHANGEALTER TABLE索引名称的使用、列前缀上的索引以及语句中的
INDEXorKEY的使用。CREATE TABLE请参阅 第 13.1.18 节,“CREATE TABLE 语句”。使用
TEMPORARY或IF NOT EXISTS与CREATE TABLE。使用
IF EXISTSwithDROP TABLE和DROP DATABASE。使用单个
DROP TABLE语句删除多个表的能力。INSERT INTO句法。tbl_nameSETcol_name= ...在 语句中 使用
INTO OUTFILEor 。请参阅 第 13.2.9 节,“SELECT 语句”。INTO DUMPFILESELECT选项如
STRAIGHT_JOINorSQL_SMALL_RESULTinSELECTstatements。您不需要在
GROUP BY子句中命名所有选定的列。这为一些非常具体但非常正常的查询提供了更好的性能。请参阅 第 12.20 节,“聚合函数”。您可以指定
ASC和DESCwithGROUP 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(DISTINCTvalue_list)value_list字符串比较默认不区分大小写,排序顺序由当前字符集的排序规则决定,默认为
latin1(cp1252 West European)。要改为执行区分大小写的比较,您应该使用该BINARY属性声明您的列或使用BINARY强制转换,这会导致使用底层字符代码值而不是词汇顺序进行比较。运算符是的
%同义词MOD()。也就是说, 相当于 . 支持 C 程序员并与 PostgreSQL 兼容。N%MMOD(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.20 节,“聚合函数”。