10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 41.2 mb
PDF (A4)- 41.3 mb
PDF (RPM)- 39.5 mb
HTML下载(TGZ)- 9.3 mb
HTML下载(Zip)- 9.3 mb
HTML下载(RPM)- 7.8 mb
手册页(TGZ)- 260.6 kb
手册页(Zip)- 371.8 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

13.2.10 SELECT语句

选择[所有| distinct | distinctrow] [high_priority] [immedi_join] [sql_small_result] [sql_big_result] [sql_buffer_result] [sql_no_cache] [sql_calc_found_rows]select_expr[,select_expr)……[into_option][从table_references(分区partition_list]],where_condition[由{分组]col_name|expr|位置},……[卷起的]][有where_condition][窗口window_name(window_spec) (window_name(window_spec)]…] [命令{col_name|expr|位置} [asc | desc],…[限制{]抵消,]row_count|row_count抵消抵消}] [into_option[update | share] [of .tbl_name[,tbl_name)……] [NOWAIT|跳过锁]|共享模式锁定] [into_optioninto_option: {into outfile 'file_name'[字符集charset_nameexport_options|到dumpfile 'file_name' |进var_name[,var_name)……}

选择用于检索从一个或多个表中选择的行,可以包括联盟语句和子查询。看到第13.2.10.3节“联合条款”,第13.2.11节“子查询”.一个选择语句可以以a开头子句中可访问的公共表表达式选择.看到第13.2.15节“WITH(常用表表达式)”

的最常用从句选择陈述如下:

  • 每一个select_expr指示要检索的列。至少有一个select_expr

  • table_references指示要从中检索行的一个或多个表。其语法在第13.2.10.2节“JOIN子句”

  • 选择控件支持显式的分区选择分区子分区的列表或子分区(或两者都有),后跟控件中的表名table_reference(见第13.2.10.2节“JOIN子句”).在这种情况下,只从列出的分区中选择行,忽略表的任何其他分区。有关更多信息和示例,请参见第24.5节“分区选择”

  • 在哪里子句,如果给出,则指示选择行必须满足的一个或多个条件。where_condition表达式,对于要选择的每一行,其计算值都为true。如果没有,该语句将选择所有行在哪里条款。

    在哪里表达式,你可以使用MySQL支持的任何函数和操作符,除了聚合(组)函数。看到第9.5节“表达式”,第十二章,函数和操作符

选择也可以用于检索不引用任何表的计算行。

例如:

mysql> SELECT 1 + 1;- > 2

你可以指定在没有表被引用的情况下作为虚拟表名:

mysql> SELECT 1 + 1 FROM DUAL;- > 2

纯粹是为了方便那些要求一切的人吗选择语句应该有可能还有其他条款。MySQL可能会忽略子句。MySQL不需要从双如果没有引用表。

通常,使用的子句必须按照语法描述中显示的顺序给出。例如,从句必须跟在any后面集团条款及在任何命令条款。的子句,如果存在,可以出现在语法描述所指出的任何位置,但在给定语句中只能出现一次,不能出现在多个位置。欲了解更多有关,请参阅第13.2.10.1节,“SELECT…”声明”

名单select_exprTerms包含选择列表,该列表指示要检索哪些列。术语指定可以使用的列或表达式速记:

  • 只包含一个不合格的选择列表可以作为从所有表中选择所有列的简写:

    SELECT * FROM t1 INNER JOIN…
  • tbl_name.*可以作为限定的简写来从指定表中选择所有列:

    选择t1。*, t2。*从t1 INNER JOIN t2 ...
  • 如果一个表有不可见的列,而且tbl_name.*不要包括他们。要包含不可见的列,必须显式引用。

  • 使用不合格的与选择列表中的其他项一起使用可能会产生解析错误。为了避免这个问题,请使用合格的tbl_name.*参考:

    SELECT AVG(分数),t1。* FROM t1…

下面的列表提供了关于其他的附加信息选择条款:

  • 一个select_expr可以给一个别名使用作为alias_name.别名用作表达式的列名,可在集团命令,或条款。例如:

    SELECT CONCAT(last_name,', ',first_name) FROM mytable ORDER BY full_name;

    作为关键字是可选的select_expr使用标识符。前面的例子可以这样写:

    SELECT CONCAT(last_name,', ',first_name) full_name FROM mytable

    然而,因为作为是可选的,如果你忘记了两个之间的逗号,就会出现一个微妙的问题select_expr表达式:MySQL将第二个变量解释为别名。例如,在下面的语句中,columnb作为别名处理:

    SELECT column FROM mytable;

    出于这个原因,养成使用的习惯是一种很好的实践作为在指定列别名时显式地。

    类中引用列别名是不允许的在哪里子句时,可能还没有确定列值在哪里子句被执行。看到B.3.4.4节“列别名的问题”

  • table_references子句指示要从中检索行的一个或多个表。如果您命名了多个表,则您正在执行连接。有关联接语法的信息,请参见第13.2.10.2节“JOIN子句”.对于指定的每个表,您可以选择指定别名。

    tbl_name[[是]别名] [index_hint

    索引提示的使用为优化器提供了关于在查询处理期间如何选择索引的信息。有关指定这些提示的语法说明,请参见第8.9.4节“索引提示”

    你可以使用设置max_seeks_for_key =价值作为强制MySQL选择键扫描而不是表扫描的另一种方式。看到章节5.1.8,“服务器系统变量”

  • 可以将默认数据库中的表引用为tbl_name,或db_nametbl_name显式地指定数据库。您可以将列称为col_nametbl_namecol_name,或db_nametbl_namecol_name.您不需要指定tbl_namedb_nametbl_name列引用的前缀,除非该引用具有二义性。看到第9.2.2节“标识符限定符”,用于需要更明确的列引用表单的歧义示例。

  • 表引用可以使用tbl_name作为alias_nametbl_name alias_name.这些语句是等价的:

    SELECT t1.name, t2。FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;SELECT t1.name, t2。WHERE t1.name = t2.name;
  • 中为输出选择的列可以引用命令而且集团使用列名、列别名或列位置的子句。列位置为整数,以1开头:

    选择大学,地区,种子从比赛顺序由地区,种子;SELECT college, region AS r,种子AS s FROM tournament ORDER BY r, s;选择大学,地区,种子从比赛顺序由2,3;

    要按相反顺序排序,请添加DESC属性中的列的名称命令子句进行排序。默认为升序;属性可以显式地指定ASC关键字。

    如果命令出现在括号内的查询表达式中,也应用在外部查询中,结果是未定义的,在MySQL的未来版本中可能会改变。

    不赞成使用列位置,因为该语法已从SQL标准中删除。

  • 在MySQL 8.0.13之前,MySQL支持一个非标准的语法扩展,允许显式ASCDESC指示器的集团列。MySQL 8.0.12及以上版本支持命令与分组功能,使使用这个扩展不再是必要的。(Bug #86312, Bug #26073525)这也意味着您可以在使用时对任意列进行排序集团,像这样:

    SELECT a,b, COUNT(c) AS t FROM test_table GROUP BY a,b ORDER BY a,t DESC;

    从MySQL 8.0.13开始,集团扩展不再支持:ASCDESC指示器的集团不允许列。

  • 当你使用命令集团类中的列进行排序选择的初始字节数对值进行排序max_sort_length系统变量。

  • 的扩展使用集团属性中未提及的字段集团条款。如果您没有从查询中得到您期望的结果,请阅读的描述集团中发现的12.20节“聚合函数”

  • 集团允许一个与汇总修饰符。看到第12.20.2节,“GROUP BY Modifiers”

    在此之前,它是不允许使用的命令的查询中与汇总修饰符。这个限制在MySQL 8.0.12被取消了。看到第12.20.2节,“GROUP BY Modifiers”

  • 子句,比如在哪里子句,指定选择条件。的在哪里子句指定选择列表中列的条件,但不能引用聚合函数。的子句指定组的条件,通常由集团条款。查询结果中只包含满足条件。(如果没有集团存在时,所有行隐式地形成一个聚合组。)

    子句几乎是在最后应用的,就在将项发送到客户机之前,没有进行优化。(限制应用于.)

    SQL标准要求这样做中的列必须只引用集团子句或聚合函数中使用的列。但是,MySQL支持这种行为的扩展,并且允许中的列选择外部子查询中的列表和列也是如此。

    如果子句引用有歧义的列,则出现警告。在以下声明中,col2是模棱两可的,因为它同时用作别名和列名:

    SELECT COUNT(col1) AS col2 FROM t GROUP BY col2

    优先考虑标准SQL行为,因此如果a中都使用列名集团属性中的列作为选择列列表中的别名列,将优先级赋予集团列。

  • 不要使用对于应该在在哪里条款。例如,不要写如下内容:

    选择col_nametbl_namecol_name> 0;

    你可以这样写:

    选择col_nametbl_name在哪里col_name> 0;
  • 子句可以引用聚合函数在哪里条款不能:

    SELECT user, MAX(salary) FROM users GROUP

    (这在一些旧版本的MySQL中不起作用。)

  • MySQL允许重复列名。也就是说,可以有不止一个select_expr名字一样。这是对标准SQL的扩展。因为MySQL也允许集团而且参考select_expr值,这可能会导致歧义:

    SELECT 12 AS a, a FROM t GROUP BY a;

    在该语句中,两列都有名称一个.为确保使用正确的列进行分组,请为每个列使用不同的名称select_expr

  • 窗口子句定义了可由窗口函数引用的命名窗口。详细信息请参见第12.21.4节,“命名窗口”

  • 中的不符合条件的列或别名引用命令子句select_expr值,然后在表的列中条款。为集团子句,它搜索子句,然后在select_expr值。(集团而且,这与mysql 5.0之前使用相同规则的行为不同命令.)

  • 限制子句可用于约束控件返回的行数选择声明。限制接受一个或两个数值参数,必须都是非负整数常量,但有以下例外:

    • 在准备好的语句中,限制参数可以使用?占位符标记。

    • 在存储程序中,限制参数可以使用整数值例程参数或局部变量指定。

    有两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行偏移量为0(不是1):

    SELECT * FROM tbl LIMIT 5,10;#检索第6-15行

    要检索从某个偏移量到结果集末尾的所有行,可以使用一些较大的数字作为第二个参数。该语句检索从第96行到最后一行的所有行:

    SELECT * FROM tbl LIMIT 95,18446744073709551615;

    通过一个参数,该值指定从结果集开始返回的行数:

    SELECT * FROM tbl LIMIT 5;#检索前5行

    换句话说,限制row_count等于极限0,row_count

    对于准备好的语句,可以使用占位符。属性中的一行返回资源描述表:

    设置@a = 1;SELECT * FROM tbl LIMIT ?使用@a执行STMT;

    的第二行到第六行返回资源描述表:

    设置@skip = 1;设置@numrows = 5;从tbl LIMIT中SELECT *, ?执行STMT使用@skip, @numrows;

    为了与PostgreSQL兼容,MySQL还支持限制row_count抵消抵消语法。

    如果限制出现在括号内的查询表达式中,也应用在外部查询中,结果是未定义的,在MySQL的未来版本中可能会改变。

  • 选择……成形式的选择允许将查询结果写入文件或存储在变量中。有关更多信息,请参见第13.2.10.1节,“SELECT…”声明”

  • 如果你使用更新对于使用页锁或行锁的存储引擎,查询检查的行将被写入锁定,直到当前事务结束。

    你不能使用更新作为选择在像这样的语句中创建表new_table选择……从old_table....(如果尝试这样做,则会拒绝该语句并返回错误无法更新表”old_tablewhilenew_table'被创建.)

    为分享而且共享模式锁定设置共享锁,允许其他事务读取检查过的行,但不能更新或删除它们。为分享而且共享模式锁定是等价的。然而,为分享,就像更新,支持NOWAIT跳过锁,tbl_name选项。为分享是对共享模式锁定,但共享模式锁定保持向后兼容性可用。

    NOWAIT会导致更新为分享查询将立即执行,如果由于另一个事务持有的锁而无法获得行锁,则返回错误。

    跳过锁会导致更新为分享查询立即执行,排除结果集中被另一个事务锁定的行。

    NOWAIT而且跳过锁选项对于基于语句的复制是不安全的。

    请注意

    跳过锁定行的查询将返回不一致的数据视图。跳过锁因此不适合一般事务性工作。但是,当多个会话访问相同的类队列表时,可以使用它来避免锁争用。

    tbl_name适用于更新而且为分享对命名表的查询。例如:

    SELECT * FROM t1, t2 FOR SHARE OF t1 FOR UPDATE OF t2

    查询块引用的所有表都被锁定tbl_name是省略了。因此,使用锁定子句没有tbl_name与另一个锁定子句结合将返回错误。在多个锁定子句中指定同一个表将返回错误。类中指定别名为表名选择语句中,锁定子句只能使用别名。如果选择语句没有显式指定别名,锁定子句可能只指定实际的表名。

    欲了解更多有关更新而且为分享,请参阅章节15.7.2.4,“锁定读取”.欲了解更多有关NOWAIT而且跳过锁选项,请参阅用NOWAIT和SKIP LOCKED锁定读并发

后,选择关键字,可以使用许多影响语句操作的修饰符。HIGH_PRIORITYSTRAIGHT_JOIN和以。开头的修饰语SQL_是标准SQL的MySQL扩展。

  • 所有而且截然不同的修饰符指定是否应该返回重复的行。所有(默认值)指定应返回所有匹配的行,包括重复的行。截然不同的指定从结果集中删除重复的行。同时指定两个修饰符是错误的。DISTINCTROW是同义词吗截然不同的

    在MySQL 8.0.12及以后版本中,截然不同的可以与还使用与汇总.(Bug #87450, Bug #26640100)

  • HIGH_PRIORITY给出了选择优先级高于更新表的语句。您应该仅对非常快且必须立即完成的查询使用此方法。一个选择HIGH_PRIORITY在表被锁定读取时发出的查询,即使有一个更新语句等待表空闲也会运行。这只影响只使用表级锁的存储引擎(例如MyISAM内存,合并).

    HIGH_PRIORITY不能与选择语句的一部分联盟

  • STRAIGHT_JOIN类中列出的表的顺序强制优化器连接条款。如果优化器以非最佳顺序连接表,则可以使用此选项加快查询速度。STRAIGHT_JOIN也可用于table_references列表。看到第13.2.10.2节“JOIN子句”

    STRAIGHT_JOIN不应用于优化器视为常量系统表格这样的表生成单行,在查询执行的优化阶段读取,并且在查询执行之前用适当的列值替换对其列的引用。所显示的查询计划中,这些表首先出现解释.看到第8.8.1节,“使用EXPLAIN优化查询”.此例外可能不适用于常量系统上使用的表外部连接的-补边(即左连接或者a的左边表格正确的连接

  • SQL_BIG_RESULTSQL_SMALL_RESULT可与集团截然不同的来分别告诉优化器结果集有很多行或很小。为SQL_BIG_RESULT, MySQL直接使用基于磁盘的临时表(如果它们是创建的),并且更倾向于使用带有键的临时表进行排序集团元素。为SQL_SMALL_RESULT, MySQL使用内存中的临时表来存储结果表,而不是使用排序。通常不需要这样做。

  • SQL_BUFFER_RESULT强制将结果放入临时表中。这有助于MySQL尽早释放表锁,并在需要很长时间才能将结果集发送给客户端的情况下有所帮助。此修饰符只能用于顶级选择语句,而不是用于子查询或后续查询联盟

  • SQL_CALC_FOUND_ROWS告诉MySQL计算结果集中有多少行,忽略任何行限制条款。然后可以使用选择FOUND_ROWS ().看到第12.16节“信息功能”

    请注意

    SQL_CALC_FOUND_ROWS查询修饰符和伴随FOUND_ROWS ()函数在MySQL 8.0.17已弃用;希望它们在MySQL的未来版本中被移除。看到FOUND_ROWS ()关于替代策略的信息的描述。

  • SQL_CACHE而且SQL_NO_CACHE在MySQL 8.0之前,查询缓存中使用了修饰符。在MySQL 8.0中删除查询缓存。的SQL_CACHE修饰符也被移除。SQL_NO_CACHE已弃用,并且没有效果;希望它在未来的MySQL版本中被移除。