MySQL Server支持某些您可能在其他SQL DBMS中找不到的扩展。请注意,如果使用它们,您的代码将无法移植到其他SQL Server。在某些情况下,可以使用以下形式的注释编写包含MySQL扩展但仍可移植的代码:
/*! <em class="replaceable">MySQL-specific code</em> */
在这种情况下,MySQL服务器将像其他任何SQL语句一样解析并执行注释中的代码,但是其他SQL Server将忽略这些扩展。例如,MySQL Server可以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节“标识符区分大小写”](https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html "9.2.3标识符区分大小写")。
通用语言语法
默认情况下,字符串可以被封闭 "以及'。如果ANSI_QUOTES启用了SQL模式,则只能用括住字符串, '并且服务器将用括起来的字符串解释"为标识符。
\ 是字符串中的转义字符。
在SQL语句中,可以使用db_name.tbl_name语法从不同数据库访问表 。某些SQL Server提供相同的功能,但称之为 User space。MySQL Server不支持诸如以下语句中使用的表空间CREATE TABLE ralph.my_table ... IN my_tablespace。
SQL语句语法
[EXPLAIN SELECT](https://dev.mysql.com/doc/refman/8.0/en/explain.html "13.8.2 EXPLAIN声明") 获取有关查询优化器如何处理表的描述。
使用[LOAD DATA](https://dev.mysql.com/doc/refman/8.0/en/load-data.html "13.2.7 LOAD DATA语句")。在许多情况下,此语法与Oracle兼容 [LOAD DATA](https://dev.mysql.com/doc/refman/8.0/en/load-data.html "13.2.7 LOAD DATA语句")。请参见 [第13.2.7节“ LOAD DATA语句”](https://dev.mysql.com/doc/refman/8.0/en/load-data.html "13.2.7 LOAD DATA语句")。
使用的, 或者 , 或者 在 声明。使用多个的, ,,或 在条款 声明。请参见[第13.1.9节“ ALTER TABLE语句”](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html "13.1.9 ALTER TABLE语句")。 CHANGE <em class="replaceable">col_name</em>``DROP <em class="replaceable">col_name</em>[DROP INDEX](https://dev.mysql.com/doc/refman/8.0/en/drop-index.html "13.1.27 DROP INDEX语句")IGNORE``RENAME[ALTER TABLE](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html "13.1.9 ALTER TABLE语句")ADD``ALTER``DROP``CHANGE[ALTER TABLE](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html "13.1.9 ALTER TABLE语句")
索引名称的使用,列前缀的索引以及INDEX或 KEYin [CREATE TABLE](https://dev.mysql.com/doc/refman/8.0/en/create-table.html "13.1.20 CREATE TABLE语句")语句的使用。请参见 [第13.1.20节“ CREATE TABLE语句”](https://dev.mysql.com/doc/refman/8.0/en/create-table.html "13.1.20 CREATE TABLE语句")。
使用的TEMPORARY或IF NOT EXISTS与[CREATE TABLE](https://dev.mysql.com/doc/refman/8.0/en/create-table.html "13.1.20 CREATE TABLE语句")。
INSERT INTO <em class="replaceable">tbl_name</em> SET <em class="replaceable">col_name</em> = ... 句法。
在 语句中 使用INTO OUTFILE或。请参见 [第13.2.10节“ SELECT语句”](https://dev.mysql.com/doc/refman/8.0/en/select.html "13.2.10 SELECT语句")。 INTO DUMPFILE[SELECT](https://dev.mysql.com/doc/refman/8.0/en/select.html "13.2.10 SELECT语句")
选项,例如STRAIGHT_JOIN或 SQL_SMALL_RESULTin [SELECT](https://dev.mysql.com/doc/refman/8.0/en/select.html "13.2.10 SELECT语句")语句。
您无需在GROUP BY子句中命名所有选定的列 。对于某些非常特定但非常普通的查询,这可以提供更好的性能。请参见 [第12.20节“集合函数”](https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions-and-modifiers.html "12.20汇总函数")。
您可以指定ASC并 DESC用GROUP BY,不仅仅是ORDER BY。
资料类型
功能和运算符
为了使从其他SQL环境迁移的用户更容易,MySQL Server支持许多功能的别名。例如,所有字符串函数都支持标准SQL语法和ODBC语法。
与C语言一样, MySQL Server将||and &&运算符理解为 逻辑OR和AND。在MySQL服务器, ||并且 OR是同义词,因为是 && 和AND。由于这种漂亮的语法,MySQL Server不支持||用于字符串连接的标准SQL 运算符。使用 CONCAT()代替。由于 CONCAT()采用任意数量的参数,因此很容易将||运算符的使用转换 为MySQL Server。
字符串比较默认情况下不区分大小写,排序顺序由当前字符集的排序规则确定utf8mb4(默认情况下)。要执行区分大小写的比较,您应该BINARY使用属性声明列 或使用 BINARY强制转换,这将导致使用基本字符代码值而不是词法顺序来完成比较。
该% 运营商的代名词 MOD()。即 等于 。 支持C程序员并与PostgreSQL兼容。 <em class="replaceable">N</em> % <em class="replaceable">M</em>MOD(<em class="replaceable">N</em>,<em class="replaceable">M</em>)%
mysql> SELECT col1=1 AND col2=2 FROM my_table;
LIKE 允许使用数值。
CONCAT()或 CHAR()带有一个或两个以上参数。(在MySQL Server中,这些函数可以使用可变数量的参数。)
使用的TRIM()修剪子。标准SQL仅支持删除单个字符。