SELECT的语法如下:
SELECT[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROMtable_references
[PARTITION partition_list]
[WHEREwhere_condition]
[GROUP BY{col_name | expr | position}
[ASC | DESC], ... [WITHROLLUP]]
[HAVING where_condition]
[ORDERBY{col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name'[CHARACTERSETcharset_name]
export_options
|INTO DUMPFILE 'file_name'|INTOvar_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
一、SELECT解析
SELECT用于从一个或者多个表中取回数据行,也可以包括UNION语句和子查询。UNION语句参考后续文章,而子查询在手册13.2.10节。
SELECT语句最常用的子句有这些:
每个select_expr指示要检索的列。所以必须至少有一个select_expr。
table_references指示要从中取回行数据的一个或多个表。其语法在第13.2.9.2节“JOIN语法”中描述。
SELECT支持使用PARTITION显式分区选择,其中包含table_reference中表的名称后面的分区或子分区(或两者)列表。关于分区的更多信息在Section 22.6.4, “Partitioning and Locking”
如果存在WHERE子句,其中的条件对行数据进行筛选。where_condition是一个表达式,对于要选择的每一行,其计算结果为true。如果没有WHERE子句,该语句将选择所有行。在WHERE表达式中,您可以使用除聚合函数之外的任何MySQL支持的函数和运算符。See Section 9.5, “Expressions”, and Chapter 12, Functions and Operators.
SELECT也可用于检索计算的行而不引用任何表。
mysql> SELECT 1 + 1;-> 2
在没有引用表的情况下,允许将DUAL指定为虚拟表名:
mysql> SELECT 1 + 1 FROMDUAL;-> 2
DUAL的存在只是为了方便。MySQL可能会忽略这些子句。如果没有引用表,MySQL不需要FROM DUAL。
通常,使用的子句必须完全按照语法描述中展示的顺序给出。
例如,HAVING子句必须位于任何GROUP BY子句之后和任何ORDER BY子句之前。例外情况是INTO子句可以如语法描述中所示出现,也可以紧跟在select_expr列表之后出现。SELECT...INTO后续文章会讲。
select_expr项列表包括了要