4 数据操纵:SELECT, INSERT, UPDATE, DELETE
4.1 SELECT 句法
SELECT [STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows | rows OFFSET offset]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]
SELECT 用于检索从一个或多个表中选取出的行。select_expression 表示你希望检索的列。 SELECT 也可以被用于检索没有引用任何表的计算列。例如:
mysql> SELECT 1 + 1;
-> 2
所有使用的关键词必须严格以上面所显示的次序被给出。举例来说,一个 HAVING 子句必须出现在 GROUP BY 子句后,在 ORDER BY 字句之前。
- 一个
SELECT表达式可以使用AS指定一个别名。别名可以当作表达式的列名,用于ORDER BY或HAVING子句中。例如:mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name; - 在一个
WHERE子句中使用一个列别名是不允许的,因为,当WHERE子句被执行时,列值可能还没有被计算确定。查看章节 A.5.4 使用alias的限制。 FROM table_references子句表示从哪个表中检索记录行。如果你命名超过超过一个表,并执行一个 join。对于 join 句法的信息,查看章节 4.1.1JOIN句法。对于每个引用的表,你可以顺便指定一个别名。table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | FORCE INDEX (key_list)]]
到 MySQL 3.23.12 时,当 MySQL 在从一个表中检索信息时,你可以提示它选择了哪一个索引。如果EXPLAIN显示 MySQL 使用了可能的索引列表中错误的索引,这个特性将是很有用的。通过指定USE INDEX (key_list),你可以告诉 MySQL 使用可能的索引中最合适的一个索引在表中查找记录行。可选的二选一句法IGNORE INDEX (key_list)可被用于告诉 MySQL 不使用特定的索引。 在 MySQL 4.0.9 中,你也可以使用FORCE INDEX。这个有点像USE INDEX (key_list),但是有了这个附加物,一个表的扫描被采用时,将会有非常大的开销。换句法说,如果没有方法使用给定的索引在表中寻找记录行,这时表扫描才会被使用。USE/IGNORE/FORCE KEY分别是USE/IGNORE/FORCE INDEX的同义词。- 你可以以
tbl_name(在当前的数据库中) 引用一张表,或以dbname.tbl_name明确地指定其个数据。你要以以col_name、tbl_name.col_name或db_name.tbl_name.col_name引用一个列。 你不需要在一个SELECT语句中引用的列前指定tbl_name或db_name.tbl_name前缀,除非引用列存在二义性。查看章节 1.2 数据库、表、索引、列和别名,对于有歧义的列引用需要更加显式的列引用格式。 - 一个表的引用可以使用
tbl_name [AS] alias_name给以别名: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; - 选取出来用于输出的列可以在
ORDER BY和GROUP BY子句中使用列名、列的别名或列的位置来引用。列的位置从 1 开始: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;


