MySQL对标准SQL的扩展

MySQL服务器支持一些其他SQL数据库管理系统中不太可能找到的扩展功能。请注意,如果您使用这些扩展功能,您的代码可能无法在其他SQL服务器上移植。在某些情况下,您可以编写包含MySQL扩展功能但仍然可移植的代码,通过使用以下形式的注释:

/*! MySQL-specific code */

在这种情况下,MySQL服务器解析并执行注释中的代码,就像处理任何其他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服务器将每个数据库映射到MySQL数据目录下的一个目录,并将数据库中的表映射到数据库目录中的文件名。因此,在具有区分大小写文件名的操作系统上(例如大多数Unix系统),MySQL服务器中的数据库和表名区分大小写。

  • 通用语言语法
    • 默认情况下,字符串可以用双引号 " 或单引号 ' 括起来。如果启用了ANSI_QUOTES SQL模式,则字符串只能用单引号 ' 括起来,而服务器将双引号括起来的字符串解释为标识符。
    • \ 是字符串中的转义字符。
    • 在SQL语句中,您可以使用db_name.tbl_name语法访问不同数据库中的表。一些SQL服务器提供相同的功能,但将其称为用户空间。MySQL服务器不支持类似以下语句中使用的表空间:CREATE TABLE ralph.my_table ... IN my_tablespace。
  • SQL语句语法
    • ANALYZE TABLE、CHECK TABLE、OPTIMIZE TABLE和REPAIR TABLE语句。
    • CREATE DATABASE、DROP DATABASE和ALTER DATABASE语句。
    • DO语句。
    • 使用EXPLAIN SELECT语句可以获取查询优化器处理表的描述。
    • FLUSH和RESET语句。
    • SET语句。
    • SHOW语句。许多MySQL特定的SHOW语句产生的信息可以通过使用SELECT查询INFORMATION_SCHEMA以更标准的方式获得。
    • LOAD DATA的用法。在许多情况下,此语法与Oracle的LOAD DATA兼容。
    • RENAME TABLE的用法。
    • 使用REPLACE而不是DELETE加INSERT的用法。
    • 在ALTER TABLE语句中使用CHANGE col_name、DROP col_name、DROP INDEX、IGNORE或RENAME的用法。在ALTER TABLE语句中使用多个ADD、ALTER、DROP或CHANGE子句的用法。
    • 在CREATE TABLE语句中使用索引名称、创建列前缀索引、以及使用INDEX或KEY的用法。
    • 在CREATE TABLE语句中使用TEMPORARY或IF NOT EXISTS的用法。
    • 使用IF EXISTS的用法在DROP TABLE和DROP DATABASE语句中。
    • 使用单个DROP TABLE语句删除多个表的功能。
    • UPDATE和DELETE语句中的ORDER BY和LIMIT子句的用法。
    • INSERT INTO tbl_name SET col_name = ...语法的用法。
    • INSERT和REPLACE语句的DELAYED子句的用法。
    • 在SELECT语句中使用INTO OUTFILE或INTO DUMPFILE的用法。
    • 在SELECT语句中使用STRAIGHT_JOIN或SQL_SMALL_RESULT等选项的用法。
    • 在GROUP BY子句中不需要为所有选择的列命名。这对于一些非常特定但相当常见的查询可以提供更好的性能。
    • 可以在GROUP BY子句中使用ASC和DESC来指定排序顺序,而不仅仅是在ORDER BY子句中使用。 
    • 使用:=赋值运算符在语句中设置变量的能力。
  • 数据类型
    • 中等整数类型(MEDIUMINT),集合类型(SET),枚举类型(ENUM),以及各种二进制大对象(BLOB)和文本(TEXT)类型。
    • AUTO_INCREMENT(自动递增)、BINARY(二进制)、NULL(空值)、UNSIGNED(无符号)和ZEROFILL(填充零)是数据类型的属性。 
  • 函数和运算符(Functions and operators)
    • 为了方便从其他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 兼容性保持一致。
    • 在SELECT语句中,可以在输出列列表(在FROM左侧)的表达式中使用=、<>, <=、<、>=、>、<<、>>、<=>、AND、OR或LIKE运算符。例如:
      mysql> SELECT col1=1 AND col2=2 FROM my_table;
      
    •  LAST_INSERT_ID() 函数返回最近插入的 AUTO_INCREMENT 值。
    • LIKE 运算符允许在数值上使用。
    • REGEXP和NOT REGEXP是扩展正则表达式运算符。它们用于在比较中使用正则表达式来匹配或排除模式。
    • CONCAT() 或者 CHAR() 函数可以接受一个或多个参数。在 MySQL Server 中,这些函数可以接受可变数量的参数。
    • BIT_COUNT()、CASE、ELT()、FROM_DAYS()、FORMAT()、IF()、MD5()、PERIOD_ADD()、PERIOD_DIFF()、TO_DAYS() 和 WEEKDAY() 是MySQL中可用的一些函数。
    • 使用 TRIM() 函数来修剪子字符串。标准 SQL 只支持删除单个字符。
    • GROUP BY 函数包括 STD()、BIT_OR()、BIT_AND()、BIT_XOR() 和 GROUP_CONCAT() 。

你可能感兴趣的:(MySQL,mysql)