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, ...
[INTO OUTFILE 'file_name' export_options
| INTO DUMPFILE 'file_name']
[FROM table_references
[WHERE where_definition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_definition]
[ORDER BY {col_name | expr | position}
[ASC | DESC] , ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]
SELECT用于恢复从一个或多个表中选择的行,并可以加入UNION语句和子查询。请参见13.2.7.2节,“UNION语法
”和13.2.8节,“Subquery语法”。
·
·
·
有的行在计算时未引用任何表。SELECT也可以用于恢复这类行。
举例说明:
mysql> SELECT 1 + 1;
-> 2
所有被使用的子句必须按语法说明中显示的顺序严格地排序。例如,一个HAVING子句必须位于GROUP BY子句之后,并位于ORDER BY子句之前。
·
·mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name
·-> FROM mytable ORDER BY full_name;
在为select_expr给定别名时,AS关键词是自选的。前面的例子可以这样编写:
mysql> SELECT CONCAT(last_name,', ',first_name) full_name
-> FROM mytable ORDER BY full_name;
因为AS是自选的,如果您忘记在两个select_expr表达式之间加逗号,则会出现一个小问题:MySQL会把第二个表达式理解为一个别名。例如,在以下语句中,columnb被作为别名对待:
mysql> SELECT columna columnb FROM mytable;
因此,使用AS明确地指定列的别名,把它作为习惯,是一个良好的操作规范。
·
·
·tbl_name [[AS] alias]
·[{USE|IGNORE|FORCE} INDEX (key_list)]
使用USE INDEX、IGNORE INDEX、FORCE INDEX可以向优化符提示如何选择索引。这部分内容在13.2.7.1节,“JOIN语法”中进行了讨论。
您可以使用SET max_seeks_for_key=value作为一种替代方法,来促使MySQL优先采用关键字扫描,替代表扫描。
·
·
·mysql> SELECT 1 + 1 FROM DUAL;
·-> 2
有些服务器要求一个FROM子句。DUAL仅用于与这些服务器兼容。如果没有表被引用,则MySQL不要求该子句,前面的语句可以按以下方法编写:
mysql> SELECT 1 + 1;
-> 2
·
·mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2
·-> WHERE t1.name = t2.name;
·mysql> SELECT t1.name, t2.salary FROM employee t1, info t2
·-> WHERE t1.name = t2.name;
·
·
·mysql> SELECT college, region, seed FROM tournament
·-> ORDER BY region, seed;
·mysql> SELECT college, region AS r, seed AS s FROM tournament
·-> ORDER BY r, s;
·mysql> SELECT college, region, seed FROM tournament
·-> ORDER BY 2, 3;
要以相反的顺序进行分类,应把DESC(降序)关键字添加到ORDER BY子句中的列名称中。默认值为升序;该值可以使用ASC关键词明确地指定。
不建议使用列位置,因为该语法已经从SQL标准中删除。
·
·SELECT a, COUNT(b) FROM test_table GROUP BY a DESC
·
·
·
SQL标准要求HAVING必须引用GROUP BY子句中的列或用于总计函数中的列。不过,MySQL支持对此工作性质的扩展,并允许HAVING因为SELECT清单中的列和外部子查询中的列。
如果HAVING子句引用了一个意义不明确的列,则会出现警告。在下面的语句中,col2意义不明确,因为它既作为别名使用,又作为列名使用:
mysql> SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2;
标准SQL工作性质具有优先权,因此如果一个HAVING列名既被用于GROUP BY,又被用作输出列清单中的起了别名的列,则优先权被给予GROUP BY列中的列。
·
·mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
而应这么编写:
mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
·
·mysql> SELECT user, MAX(salary) FROM users
·-> GROUP BY user HAVING MAX(salary)>10;
(在有些较早版本的MySQL中,本语句不运行。)
·
使用两个自变量时,第一个自变量指定返回的第一行的偏移量,第二个自变量指定返回的行数的最大值。初始行的偏移量为0(不是1):
mysql> SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
为了与PostgreSQL兼容,MySQL也支持LIMIT
如果要恢复从某个偏移量到结果集合的末端之间的所有的行,您可以对第二个参数是使用比较大的数。本语句可以恢复从第96行到最后的所有行:
mysql> SELECT * FROM tbl LIMIT 95,18446744073709551615;
使用1个自变量时,该值指定从结果集合的开头返回的行数:
mysql> SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
换句话说,LIMIT n与LIMIT 0,n等价。
对于已预备的语句,您可以使用位置保持符。以下语句将从tb1表中返回一行:
mysql> SET @a=1;
mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
mysql> EXECUTE STMT USING @a;
以下语句将从tb1表中返回第二到第六行:
mysql> SET @skip=1; SET @numrows=5;
mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
mysql> EXECUTE STMT USING @skip, @numrows;
·
SELECT...INTO OUTFILE语句的主要作用是让您可以非常快速地把一个表转储到服务器机器上。如果您想要在服务器主机之外的部分客户主机上创建结果文件,您不能使用SELECT...INTO OUTFILE。在这种情况下,您应该在客户主机上使用比如“mysql
SELECT...INTO OUTFILE是LOAD DATA INFILE的补语;用于语句的exort_options部分的语法包括部分FIELDS和LINES子句,这些子句与LOAD DATA INFILE语句同时使用。请参见13.2.5节,“LOAD DATA INFILE语法”。
FIELDS ESCAPED BY用于控制如何写入特殊字符。如果FIELDS ESCAPED BY字符不是空字符,则被用于在输出中对以下字符设前缀:
o
o
o
o
如果FIELDS ESCAPED BY字符是空字符,则没有字符被转义,并且NULL被作为NULL输出,而不是作为\N输出。指定一个空的转义符不是一个好的主意。特别是当您的数据中的字段值包含刚被给予的清单中的字符时,更是如此。
其原因是您必须对所有FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY或LINES TERMINATED BY字符进行转义,才能可靠地读取文件并返回。ASCII NUL被转义,以便更容易地使用调页程序观看。
生成的文件不必符合SQL语法,所以没有其它的字符需要被转义。
在下面的例子中,生成一个文件,各值用逗号隔开。这种格式可以被许多程序使用。
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
·
·
·
·
在SELECT关键词的后面,您可以使用许多选项。这些选项可以影响语句的运行。
ALL, DISTINCT和DISTINCTROW选项指定是否重复行应被返回。如果这些选项没有被给定,则默认值为ALL(所有的匹配行被返回)。DISTINCT和DISTINCTROW是同义词,用于指定结果集合中的重复行应被删除。
HIGH_PRIORITY, STRAIGHT_JOIN和以SQL_为开头的选项是MySQL相对于标准SQL的扩展。
·
HIGH_PRIORITY不能和SELECT语句同时使用。SELECT语句是UNION的一部分。
·
·
·
·
·
·
·