当前位置:操作系统 > Unix/Linux >>

数据操纵:SELECT,INSERT,UPDATE,DELETE

6.4 数据操纵:SELECT, INSERT, UPDATE, DELETE

  6.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 句法的信息,查看章节 6.4.1.1 JOIN 句法。对于每个引用的表,你可以顺便指定一个别名。

  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 前缀,除非引用列存在二义性。查看章节 6.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;

  为了以倒序排序,可以在 ORDER BY 子句中用于排序的列名后添加一个 DESC (递减 descending)关键词。缺省为升序排序;这也可以通过使用 ASC 关键词明确指定。

  * 在 WHERE 子句中可以使用 MySQL 支持的任何函数。查看章节 6.3 用于 SELECT 和 WHERE 子句的函数。

  * HAVING 子句可以引用任何列或在 select_expression 中命名的别名。它在最后被执行,仅仅就在项目被送到客户端之前,不进行任何优化。所以不要对应该放在 WHERE 子句中的项目使用 HAVING。举例来说,不要写成这样:

  mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;

  用这个代替:

  mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;

  在 MySQL 3.22.5 或以后的版本中,你也可以这下面的形式书写一个查询:

  mysql> SELECT user,MAX(salary) FROM users

  -> GROUP BY user HAVING MAX(salary)>10;

  在较早的 MySQL 版本中,你可能需要用下面的代替了:

  mysql> SELECT user,MAX(salary) AS sum FROM users

  -> group by user HAVING sum>10;

  * DISTINCT、DISTINCTROW 和 ALL 选项指定重复的记录行是否被返回。缺省为 (ALL),返回所有匹配的记录行。DISTINCT 和 DISTINCTROW 是同义词,它指定结果集重复的记录行被排除。

  * 所有以 SQL_ 开头、STRAIGHT_JOIN 和 HIGH_PRIORITY 的选项是 MySQL 对 ANSI SQL 的扩展。

  * HIGH_PRIORITY 将给 SELECT 语句比更新一个表有更高的优先级。你只应该对非常快的或需要立即返回的查询使用它。 如果一个表已被读锁定,甚至是有一个更新语句正在等待表的释放,一个 SELECT HIGH_PRIORITY 查询也将会执行。

  * SQL_BIG_RESULT 可以与 GROUP BY 或 DISTINCT 一同使用,以告诉优化器结果集将有许多记录行。在这种情况下,如果需要,MySQL 将直接使用基于磁盘的临时表。同样的,在这种情况下,MySQL 更愿意以 GROUP BY 上的一个键进行排序而不是建立一个临时表。

  * SQL_BUFFER_RESULT 将强制把结果放入一个临时表。这将有助于 MySQL 尽早地释放表和有助于将大的结果集传送到客户端。

  * SQL_SMALL_RESULT, 一个 MySQL 特有的选项,可以与 GROUP BY 或 DISTINCT 一同使用,以告诉优化器结果集将会很小。在这种情况下,MySQL 将使用快速的临时表存储结果表,而不是使用排序。在 MySQL 3.23 中,这通常是不需要的。

  * SQL_CALC_FOUND_ROWS (版本 4.0.0 和更新的) 告诉 MySQL 计算在不考虑 LIMIT 子句时结果集中将有多少行记录。然后使用 SELECT FOUND_ROWS() 可以检索到记录行的数目。查看章节 6.3.6.2 辅助功能函数。 请注意,在早于 4.1.0 的版本中,LIMIT 0 是不工作的,它将被优化为立即返回(结果集的记录数为 0)。查看章节 5.2.8 MySQL 如何优化 LIMIT。

  * 如果你使用了 QUERY_CACHE_TYPE=2 (DEMAND),SQL_CACHE 告诉 MySQL 将存储查询结果放入查询高速缓存内。查看章节 6.9 MySQL 的查询高速缓存。

  * SQL_NO_CACHE 告诉 MySQL 不允许将查询结果存储到查询缓存内。查看章节 6.9 MySQL 的查询高速缓存。

  * 如果使用了 GROUP BY,输出记录将会依照 GROUP BY 列进行排序,就好像你对所有 GROUP BY 中的所有字段使用了 ORDER BY。MySQL 扩展了 GROUP BY 的用法,所以你也可以在 GROUP BY 中指定 ASC 和 DESC:

  SELECT a,COUNT(b) FROM test_table GROUP BY a DESC

  * MySQL 扩展了的 GROUP BY 用法允许你选取没有在 GROUP BY 子句中提及的字段。如果你的查询没有得到你所期望的结果,请查看 GROUP BY 中的描述。查看章节 6.3.7 用于 GROUP BY 子句的函数。

  * STRAIGHT_JOIN 强制优化器以表在 FROM 子句中列出的顺序联结。如果优化器以一个非优化的次序联结各表,你可以使用它来加速一个查询。查看章节 5.2.1 EXPLAIN 句法(得到有关 SELECT 的信息)。

  * LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

  mysql> SELECT * FROM table LIMIT 5,10; # 检索记录行 6-15

  为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:

  mysql> SELECT * FROM table LIMIT 95,-1; # 检索记录行 96-last.

  如果只给定一个参数,它表示返回最大的记录行数目:

  mysql> SELECT * FROM table LIMIT 5; # 检索前 5 个记录行

  换句话说,LIMIT n 等价于 LIMIT 0,n。

  
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,