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 ...]
[FROM table_references
[PARTITION partition_list]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE ‘file_name‘
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE ‘file_name‘
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
select被使用来得到从一个或者多个表中挑选出来的行,可以包含union语句和子查询。
select最常见的子句如下:
- 每一个select_expr表明想要获取的一个列。必须至少有一个select_expr。
- table_references表明从哪个表或者哪些表来获取行。语法会在join语法中描述。
- 从mysql 5.6.2开始,select支持明确的分区查询,在一个table_reference中接着表名后,使用有一个分区或者子分区的列表的partition关键字。在这种情况下,只有分区列表中的行会被查询,而表的其他分区会被忽略。
在mysql 5.6.6和之后,select ... partition from table使用会执行表级别的锁(因此分区锁)的存储引擎如myisam会只锁partition选项中指定的分区或者子分区。
- where子句,如果给出的话,表明行为了被选择必须满足的条件。where_condition是一个表达式,每一个被选择的行会得到true。如果没有where子句,语句会查询出所有的行。
在where表达式里,可以使用mysql提供的除了聚合函数外的所有的函数和操作符。
select也可以使用来获取行计算,而且不使用任何表。
例如:select 1 + 1;2
当没有使用任何表时,也允许使用dual作为一个虚假的表名。
例如:select 1 + 1 from dual;2
dual纯粹为了需要所有的查询语句都包含from和其它可能的子句时方便。mysql可能忽略这个子句。mysql不需要from dual,如果没有使用任何表的话。
一般来讲,子句必须严格按照语法描述中显示的顺序使用。例如,having子句必须在任意的group by子句之后,和任意的order by之后。例外是into子句,into子句可以像语法描述中显示的一样显示,也可以立即跟随在select_expr列表后。
select_expr术语列表包含了表明获取哪些列的查询列表。术语指定一个列或者表达式或者使用*缩写。
- 只有一个没有限制的*的查询列表当做查询所有表的所有列的缩写。
select * from t1 inner join t2 ...
- tbl_name.*可以使用作为一个有限制的缩写,来从这个定义的表中查询所有列。
select t1.*, t2.* from t1 inner join t2 ...
- 在查询列表里使用没有限制的*和其它项可能会产生语法错误。为了避免这个问题,可以使用tbl_name.*来引用。
select avg(score), t1.* from t1 ...