SELECT, INSERT, UPDATE, DELETESELECT 句法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到 MySQL 3.23.12 时,当 MySQL 在从一个表中检索信息时,你可以提示它选择了哪一个索引。如果
(key_list)] | FORCE INDEX (key_list)]]
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
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。
SELECT ... INTO OUTFILE 'file_name' 格式的 SELECT 将选择的记录行写入一个文件。文件被建立在服务器主机上,并且不可以是已存在的 (不管别的,这可以防止数据库表和文件例如 `/etc/passwd' 被破坏)。你必须在服务器主机上有 FILE 权限来使用这个形式的 SELECT。 SELECT ... INTO OUTFILE 主要是有意于让你能够在服务主机上快速地转储一个表。如果你希望将结果文件建立在其它的主机上,而不是服务器上,你就不能使用 SELECT ... INTO OUTFILE。在这种情况下,你应该使用某些客户端程序例如 mysqldump --tab 或 mysql -e "SELECT ..." > outfile 产生文件来代替它。 SELECT ... INTO OUTFILE 是 LOAD DATA INFILE 的逆操作;语句中的 export_options 部分的句法由 FIELDS 和 LINES 子句组成,它们与与用在 LOAD DATA INFILE 语句中的相同。查看章节 6.4.9 LOAD DATA INFILE 句法。 在结果文本文件中,只有下列的字符被 ESCAPED BY 指定的字符转义:
ESCAPED BY 字符
FIELDS TERMINATED BY 中的第一个字符
LINES TERMINATED BY 中的第一个字符 ASCII 0 被转换到 ESCAPED BY 后而跟一个 0 (ASCII 48)。 上述行为的原因是,你必须 转义任何 FIELDS TERMINATED BY、ESCAPED BY 或LINES TERMINATED BY 字符,以便能可靠地将文件读回。ASCII 0 被转义是为了更容易地使用某些分页程序查看它。 因为结果文件并不需要遵从 SQL 句法,所以其它是不需要转义。 下面的例子得到的文件是可用于许多老程序的格式。 SELECT a,b,a+b INTO OUTFILE "/tmp/result.text" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY "\n" FROM test_table;
INTO DUMPFILE 代替 INTO OUTFILE,MySQL 将在文件中只写一行,没任何列或行端接和任何转义。如果你希望存储一个 blob 列到文件中,这是非常有用的。
INTO OUTFILE 和 INTO DUMPFILE 创建的文件将被所有用户可读写!原因是, MySQL 服务器不能够创建一个其他用户拥有的文件,(你决不应该以 root 身份运行 mysqld),该文件必须是公共可读写的,以便于你能操作它。
FOR UPDATE,被检索的记录行将被写锁。
热点文章