选择[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_name(argument_list)] [into_option[用于在共享模式下更新|锁]into_option: {into outfile 'file_name(字符集charset_name]export_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_expr
Terms包含指示要检索哪些列的选择列表。术语指定可以使用的列或表达式*
速记:
只包含一个不合格项的选择列表
*
可以作为简写从所有表中选择所有列: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节“列别名的问题”.的
从
子句指示要从中检索行的一个或多个表。如果命名多个表,则执行连接。有关连接语法的信息,请参见第13.2.9.2节“联接条款”.对于指定的每个表,您可以选择指定别名。table_references
tbl_name[[是]别名] [index_hint]
索引提示的使用为优化器提供了关于如何在查询处理期间选择索引的信息。有关指定这些提示的语法描述,请参见第8.9.4节“索引提示”.
您可以使用
设置max_seeks_for_key =
这是一种迫使MySQL选择键扫描而不是表扫描的替代方法。看到第5.1.7节,“服务器系统变量”.价值
可以将默认数据库中的表称为
tbl_name
,或者db_name
.tbl_name
显式指定数据库。您可以将一个列称为col_name
,tbl_name
.col_name
,或db_name
.tbl_name
.col_name
.你不需要指定tbl_name
或db_name
.tbl_name
列引用的前缀,除非该引用是模糊的。看到第9.2.2节“标识符限定符”,例如需要更显式列引用形式的歧义。表引用可以使用
或tbl_name
作为alias_name
tbl_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
依靠隐
集团
排序(即在没有的情况下排序)ASC
或DESC
的显式排序)或集团
(也就是说,通过使用explicitASC
或DESC
指示器的集团
列)是弃用。要生成给定的排序顺序,请提供命令
条款。当你使用
命令
或集团
对象中的列排序选择
类指示的初始字节数对值进行排序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_name从tbl_name有col_name> 0;
取代它可写:
选择col_name从tbl_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_PRIORITY
,STRAIGHT_JOIN
,以及以。开头的修饰语SQL_
是对标准SQL的MySQL扩展。
的
所有
而且截然不同的
修饰符指定是否应该返回重复的行。所有
(默认值)指定应该返回所有匹配的行,包括重复的行。截然不同的
指定从结果集中删除重复行。同时指定两个修饰符是错误的。DISTINCTROW
是的同义词吗截然不同的
.HIGH_PRIORITY
给出了选择
优先级高于更新表的语句。您应该只对非常快且必须立即完成的查询使用此功能。一个选择HIGH_PRIORITY
即使有更新语句等待表释放,在表被锁定以进行读取时发出的查询也会运行。这只影响只使用表级锁的存储引擎(例如MyISAM
,内存
,合并
).STRAIGHT_JOIN
控件中列出的表的顺序强制优化器连接表从
条款。如果优化器以非最佳顺序连接表,则可以使用此方法加快查询速度。STRAIGHT_JOIN
也可以用在table_references
列表。看到第13.2.9.2节“联接条款”.STRAIGHT_JOIN
不应用于任何被优化器视为常量
或系统
表格这样的表产生单行,在查询执行的优化阶段读取,并在查询执行之前用适当的列值替换对其列的引用。的显示的查询计划中首先出现这些表解释
.看到第8.8.1节,“用EXPLAIN优化查询”.此例外可能不适用于常量
或系统
上使用的表零
外部连接的-补边(即,外部连接的右表左连接
或者左边的桌子正确的连接
.SQL_BIG_RESULT
或SQL_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节“分区和锁定”.