MySQL 语句:工具语句

来自Wikioe
跳到导航 跳到搜索


DESCRIBE 语句

“DESCRIBE”和“EXPLAIN”语句是同义词。

EXPLAIN 语句

{EXPLAIN | DESCRIBE | DESC}
    tbl_name [col_name | wild]

{EXPLAIN | DESCRIBE | DESC}
    [explain_type]
    {explainable_stmt | FOR CONNECTION connection_id}

explain_type: {
    EXTENDED
  | PARTITIONS
  | FORMAT = format_name
}

format_name: {
    TRADITIONAL
  | JSON
}

explainable_stmt: {
    SELECT statement
  | DELETE statement
  | INSERT statement
  | REPLACE statement
  | UPDATE statement
}

DESCRIBE 和 EXPLAIN 语句是同义词。实际上,DESCRIBE 关键字通常用于获取有关表结构的信息,而 EXPLAIN 则用于获取查询执行计划(即,有关 MySQL 如何执行查询的说明)。

获取表结构信息:“DESCRIBE”

DESCRIBE提供有关 table 中列的信息:

mysql> DESCRIBE City;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| Id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name       | char(35) | NO   |     |         |                |
| Country    | char(3)  | NO   | UNI |         |                |
| District   | char(20) | YES  | MUL |         |                |
| Population | int(11)  | NO   |     | 0       |                |
+------------+----------+------+-----+---------+----------------+

DESCRIBE 是“SHOW COLUMNS”的快捷方式。这些语句还显示视图信息。

  • “SHOW COLUMNS”的描述提供有关输出列的更多信息。


默认情况下,DESCRIBE 显示有关 table 中所有列的信息:

  1. “col_name”(如果提供)是 table 中列的名称。
    在这种情况下,该语句仅显示有关命名列的信息。
  2. “wild”(如果给出)是一个模式字符串。它可以包含 SQL “%”和“_”通配符。
    在这种情况下,该语句仅显示名称与字符串匹配的列的输出。除非字符串包含空格或其他特殊字符,否则无需将其用引号引起来。


  • 提供 DESCRIBE 语句是为了与 Oracle 兼容。

获取执行计划信息:“EXPLAIN”

EXPLAIN 语句提供有关 MySQL 如何执行语句的信息:

  • EXPLAIN 与 SELECT,DELETE,INSERT,REPLACE 和 UPDATE 语句一起使用
  • 当 EXPLAIN 与可解释的语句一起使用时,MySQL 将显示来自优化器的有关语句执行计划的信息。也就是说,MySQL 解释了它将如何处理该语句,包括有关如何连接 table 以及以何种 Sequences 连接 table 的信息。
  • 当 EXPLAIN 与“FOR CONNECTION connection_id”而不是可解释的语句一起使用时,它将显示在命名 Connecting 执行的语句的执行计划。
  • 对于 SELECT 语句,EXPLAIN 生成可以使用“SHOW WARNINGS”显示的其他执行计划信息。
  • EXPLAIN对于检查涉及分区 table 的查询很有用。
  • “FORMAT”选项可用于选择输出格式。 “TRADITIONAL”以表格格式显示输出。如果不提供 FORMAT 选项,则为默认设置。 JSON格式以 JSON 格式显示信息。


EXPLAIN 要求具有执行说明语句所需的相同特权。此外,对于任何已解释的视图,EXPLAIN 还需要 SHOW VIEW 特权。

借助 EXPLAIN,您可以看到应该在哪里向 table 添加索引,以便通过使用索引查找行来使语句更快地执行。您也可以使用 EXPLAIN 来检查优化器是否以最佳 Sequences 连接 table。要提示优化器使用与 SELECT 语句中 table 的命名 Sequences 相对应的连接 Sequences,请以“SELECT STRAIGHT_JOIN”而不是SELECT开头该语句。【???】

优化器跟踪有时可能提供与 EXPLAIN 互补的信息。但是,优化程序的跟踪格式和内容在版本之间可能会发生变化。

如果您在认为应该使用索引时遇到问题,请运行“ANALYZE TABLE”以更新 table 统计信息(例如,键的基数),这可能会影响优化器的选择。

帮助语句

HELP 'search_string'

HELP语句返回《 MySQL 参考手册》中的在线信息。它的正确操作要求使用帮助主题信息来初始化mysql数据库中的帮助表。

  • HELP语句在帮助表中搜索给定的搜索字符串,并显示搜索结果。搜索字符串不区分大小写。
  • 搜索字符串可以包含通配符“%”和“_”。这些含义与使用LIKE运算符执行的模式匹配操作相同。例如,“HELP 'rep%'”返回以rep开头的主题列表。


HELP 语句了解几种类型的搜索字符串:

  1. 在最一般的级别上,使用 contents 检索顶级帮助类别的列表:
    HELP 'contents'
    
  2. 要获取给定帮助类别(例如 Data Types)中的主题列表,请使用类别名称:
    HELP 'data types'
    
  3. 要获得有关特定帮助主题(例如 ASCII() 函数或 CREATE TABLE 语句)的帮助,请使用关联的一个或多个关键字:
    HELP 'ascii'
    HELP 'create table'
    

换句话说,搜索字符串匹配类别,许多主题或单个主题。您不一定必须事先告知给定的搜索字符串是否将返回项目列表或单个帮助主题的帮助信息。但是,您可以通过检查结果集中的行数和列数来判断返回的响应HELP的类型。


以下描述指示结果集可以采用的形式。示例语句的输出以使用mysqlClient 端时看到的熟悉的“表格”或“垂直”格式显示,但请注意mysql本身以不同的方式重新格式化HELP结果集。

  1. 空结果集
    找不到匹配的搜索字符串。
  2. 结果集包含单行和三列
    这意味着搜索字符串对帮助主题产生了影响。结果包含三列:
    1. name:主题名称。
    2. description:主题的描述性帮助文本。
    3. example:一个或多个用法示例。该列可能为空白。
    示例:HELP 'replace'
    name: REPLACE
    description: Syntax:
    REPLACE(str,from_str,to_str)
    
    Returns the string str with all occurrences of the string from_str
    replaced by the string to_str. REPLACE() performs a case-sensitive
    match when searching for from_str.
    example: mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
            -> 'WwWwWw.mysql.com'
    
  3. 结果集包含两行多行
    这意味着搜索字符串匹配许多帮助主题。结果集指示帮助主题名称:
    1. name:帮助主题名称。
    2. is_it_category:Y(如果名称代 table 帮助类别),N(如果不是)。如果不是,则将name值指定为HELP语句的参数时,应产生包含指定项目描述的单行结果集。
    示例:HELP 'status'
    +-----------------------+----------------+
    | name                  | is_it_category |
    +-----------------------+----------------+
    | SHOW                  | N              |
    | SHOW ENGINE           | N              |
    | SHOW MASTER STATUS    | N              |
    | SHOW PROCEDURE STATUS | N              |
    | SHOW SLAVE STATUS     | N              |
    | SHOW STATUS           | N              |
    | SHOW TABLE STATUS     | N              |
    +-----------------------+----------------+
    
  4. 结果集包含多行三列
    这意味着搜索字符串与类别匹配。结果集包含类别条目:
    1. source_category_name:帮助类别名称。
    2. name:类别或主题名称
    3. is_it_category:Y(如果名称代 table 帮助类别),N(如果不是)。如果不是,则将name值指定为HELP语句的参数时,应产生包含指定项目描述的单行结果集。
    示例:HELP 'functions'
    +----------------------+-------------------------+----------------+
    | source_category_name | name                    | is_it_category |
    +----------------------+-------------------------+----------------+
    | Functions            | CREATE FUNCTION         | N              |
    | Functions            | DROP FUNCTION           | N              |
    | Functions            | Bit Functions           | Y              |
    | Functions            | Comparison operators    | Y              |
    | Functions            | Control flow functions  | Y              |
    | Functions            | Date and Time Functions | Y              |
    | Functions            | Encryption Functions    | Y              |
    | Functions            | Information Functions   | Y              |
    | Functions            | Logical operators       | Y              |
    | Functions            | Miscellaneous Functions | Y              |
    | Functions            | Numeric Functions       | Y              |
    | Functions            | String Functions        | Y              |
    +----------------------+-------------------------+----------------+
    

USE 语句

USE db_name

USE语句告诉 MySQL 将命名数据库用作后续语句的默认(当前)数据库。该语句要求对数据库或其中的某些对象具有某些权限。

  • 数据库名称必须在一行上指定。不支持数据库名称中的换行符。


在会话结束或发出另一个USE语句之前,命名数据库将一直是默认数据库:

USE db1;
SELECT COUNT(*) FROM mytable;   # selects from db1.mytable
USE db2;
SELECT COUNT(*) FROM mytable;   # selects from db2.mytable


通过USE语句将特定数据库设置为默认数据库,并不排除访问其他数据库中的 table 的可能性。下面的示例从db1数据库访问authortable,从db2数据库访问editor表:

USE db1;
SELECT author_name,editor_name FROM author,db2.editor
  WHERE author.editor_id = db2.editor.editor_id;