10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 235.6 kb
手册页(邮政编码)- 347.2 kb
信息(Gzip)- 3.3 mb
信息(邮政编码)- 3.3 mb
本手册节选

13.2.9 SELECT语句

选择[all | distinct | distinctrow] [high_priority][直连join] [sql_small_result] [sql_big_result] [sql_buffer_result] [sql_cache | sql_no_cache] [sql_calc_found_rows]select_expr[,select_expr)……[into_option][从table_references(分区partition_list]],where_condition[组由{col_name|expr|位置} [asc | desc],…(汇总)][拥有where_condition[由{命令]col_name|expr|位置} [asc | desc],…][限制{[抵消,)row_count|row_count抵消抵消}][过程procedure_nameargument_list)] [into_option[用于在共享模式下更新|锁]into_option: {into outfile 'file_name(字符集charset_nameexport_options|导入转储文件file_name“|var_name[,var_name)……}

选择用于检索从一个或多个表中选择的行,并且可以包括联盟和子查询语句。看到第13.2.9.3节“联合条款”,部分13.2.10,“子查询”

最常用的从句选择语句:

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

  • table_references指示要从中检索行的一个或多个表。其语法在第13.2.9.2节“联接条款”

  • 选择方法支持显式分区选择分区子句中,在表的名称后面加上分区或子分区(或两者)的列表table_reference(见第13.2.9.2节“联接条款”).在本例中,只从列出的分区中选择行,而忽略表的任何其他分区。有关更多信息和示例,请参见第22.5节,“分区选择”

    选择……分区从表使用存储引擎,如MyISAM的表级锁(以及分区锁)只锁定由分区选择。

    有关更多信息,请参见第22.6.4节“分区和锁定”

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

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

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

例如:

mysql> SELECT 1 + 1;- > 2

您可以指定在没有引用表的情况下作为一个虚表名:

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

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

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

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

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

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

    选择t1。*,t2。*从t1 INNER JOIN t2 ...
  • 不合格的使用使用选择列表中的其他项可能会产生解析错误。为了避免这个问题,使用限定tbl_name.*参考:

    选择AVG(分数),t1。* FROM t1…

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

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

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

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

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

    然而,因为作为是可选的,如果忘记了两个select_expr表达式:MySQL将第二个表达式解释为别名。例如,在下面的语句中,columnb被视为别名:

    SELECT columnna columnb FROM mytable

    因此,养成使用的习惯是一种很好的做法作为在指定列别名时显式。

    控件中不允许引用列别名在哪里子句时,列值可能尚未确定在哪里条款执行。看到B.3.4.4节“列别名的问题”

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

    tbl_name[[是]别名] [index_hint

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

    您可以使用设置max_seeks_for_key =价值这是一种迫使MySQL选择键扫描而不是表扫描的替代方法。看到第5.1.7节,“服务器系统变量”

  • 可以将默认数据库中的表称为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.这些表述是等价的:

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

    按地区、种子排序;从比赛中选择学院、地区和种子选手;SELECT college, region, seed FROM tournament ORDER BY 2,3;

    要按倒序排序,请添加DESC中列的名称命令子句进行排序。默认为升序;方法可以显式指定这一点ASC关键字。

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

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

  • MySQL扩展了集团子句,以便您也可以指定ASC而且DESC在子句中指定的列之后。但是,这种语法已被弃用。要生成给定的排序顺序,请提供命令条款。

  • 如果你使用集团时,输出行根据集团列,如果你有一个命令对于相同的列。为了避免排序的开销集团生产、加按零

    SELECT a, COUNT(b) FROM test_table GROUP

    依靠隐集团排序(即在没有的情况下排序)ASCDESC的显式排序)或集团(也就是说,通过使用explicitASCDESC指示器的集团列)是弃用。要生成给定的排序顺序,请提供命令条款。

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

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

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

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

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

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

    如果子句指的是一个列是模糊的,会出现警告。在以下声明中,col2是二义性的,因为它既用作别名又用作列名:

    SELECT COUNT(col1) FROM t GROUP BY col2 = 2

    优先考虑标准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

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

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

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

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

    有两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行偏移量为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;从'SELECT * FROM tbl LIMIT ?, ?';使用@skip, @numrows执行STMT;

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

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

  • 一个过程子句指定处理结果集中数据的过程。举个例子,请看第8.4.2.4节“使用过程分析”用于描述分析,该过程可用于获取最佳列数据类型的建议,这可能有助于减少表的大小。

    一个过程条款是不允许的联盟声明。

    请注意

    过程语法在MySQL 5.7.18版本已弃用,在MySQL 8.0版本被移除。

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

  • 如果你使用更新对于使用页锁或行锁的存储引擎,查询检查的行将被写锁,直到当前事务结束。使用共享模式锁定设置共享锁,允许其他事务读取检查过的行,但不更新或删除它们。看到第14.7.2.4节“锁定读取”

    此外,您不能使用更新作为选择在诸如创建表new_table选择……从old_table....(如果您尝试这样做,语句将被拒绝并返回错误无法更新表'old_table“当”new_table正在被创造)。这是从MySQL 5.5和更早版本开始的行为变化,允许的创建表……选择语句,以便对正在创建的表以外的表进行更改。

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

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

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

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

  • STRAIGHT_JOIN控件中列出的表的顺序强制优化器连接表条款。如果优化器以非最佳顺序连接表,则可以使用此方法加快查询速度。STRAIGHT_JOIN也可以用在table_references列表。看到第13.2.9.2节“联接条款”

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

  • 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_CACHE而且SQL_NO_CACHE修饰符影响查询缓存中查询结果的缓存(参见第8.10.3节“MySQL查询缓存”).SQL_CACHE告诉MySQL将结果存储在查询缓存中,如果它是可缓存的query_cache_type系统变量2需求.与SQL_NO_CACHE,服务器不使用查询缓存。它既不检查查询缓存以查看是否已经缓存了结果,也不缓存查询结果。

    这两个修饰符是互斥的,如果同时指定了它们,就会发生错误。类中的子查询中也不允许使用这些修饰符条款),选择除第一个外的联盟中的声明选择

    的观点,SQL_NO_CACHE如果出现在任何中,则应用选择在查询。对于可缓存查询,SQL_CACHE如果它出现在第一个中,则应用选择查询所引用的视图的。

    请注意

    查询缓存从MySQL 5.7.20起已弃用,在MySQL 8.0中被移除。弃用了SQL_CACHE而且SQL_NO_CACHE

一个选择从使用存储引擎的分区表中MyISAM属性匹配的行只锁定那些包含的分区选择声明在哪里条款。(这不会发生在存储引擎,如InnoDB使用行级锁定。)有关更多信息,请参见第22.6.4节“分区和锁定”