📄 06-4.html
字号:
<HTML>
<HEAD>
<TITLE>MySQL 4.1.0 中文参考手册 --- 犬犬(心帆)翻译</TITLE>
<style> code {color:purple} tt {color:green} samp {color:navy} pre {color:maroon} </style>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<META name="description" content="MySQL 4.1.0 中文参考手册">
<META name="keywords" content="MySQL,4.1.0,Shuixin13,MySQL 4.1.0,中文,中文参考手册,犬犬(心帆)">
<LINK rel="shortcut icon" href="shuixin13.ico" />
<LINK href="images/index.css" type=text/css rel=STYLESHEET>
<SCRIPT language=javascript src="images/index.js"></SCRIPT>
<SCRIPT language=javascript><!--
x = new Date()
function cal() {
y = new Date()
diff = y.getTime() - x.getTime()
document.write("载入时间 " + diff/1000 + " 秒")
}
//--></SCRIPT>
<SCRIPT language=JavaScript>
var currentpos,timer;
function initialize()
{
timer=setInterval("scrollwindow()",10);
}
function sc()
{
clearInterval(timer);
}
function scrollwindow()
{
currentpos=document.body.scrollTop;
window.scroll(0,++currentpos);
if (currentpos != document.body.scrollTop)
sc();
}
document.onmousedown=sc
document.ondblclick=initialize
</SCRIPT>
</HEAD>
<BODY BGCOLOR=#efefff TEXT=#000000 LINK=#101090 VLINK=#7030B0>
<H1>MySQL Reference Manual for version 4.1.0-alpha.</H1>
<P>
<P><HR>
<H2><A NAME="Data_Manipulation"></A>6.4 数据操纵:<CODE>SELECT</CODE>, <CODE>INSERT</CODE>,
<CODE>UPDATE</CODE>, <CODE>DELETE</CODE></H2>
<H3><A NAME="SELECT"></A>6.4.1 <CODE>SELECT</CODE> 句法</H3>
<P>
<A NAME="IDX1387"></A>
</P>
<PRE>
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]]
</PRE>
<P>
<CODE>SELECT</CODE> 用于检索从一个或多个表中选取出的行。<CODE>select_expression</CODE> 表示你希望检索的列。
<CODE>SELECT</CODE> 也可以被用于检索没有引用任何表的计算列。例如:
</P>
<PRE>
mysql> SELECT 1 + 1;
-> 2
</PRE>
<P>
所有使用的关键词必须严格以上面所显示的次序被给出。举例来说,一个 <CODE>HAVING</CODE> 子句必须出现在 <CODE>GROUP BY</CODE> 子句后,在 <CODE>ORDER BY</CODE> 字句之前。
</P>
<UL>
<LI>
<A NAME="IDX1388"></A>
<A NAME="IDX1389"></A>
一个 <CODE>SELECT</CODE> 表达式可以使用 <CODE>AS</CODE> 指定一个别名。别名可以当作表达式的列名,用于 <CODE>ORDER BY</CODE> 或 <CODE>HAVING</CODE> 子句中。例如:
<PRE>
mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name
FROM mytable ORDER BY full_name;
</PRE>
<LI>
在一个 <CODE>WHERE</CODE> 子句中使用一个列别名是不允许的,因为,当 <CODE>WHERE</CODE> 子句被执行时,列值可能还没有被计算确定。查看章节 <A HREF="manual2.html#Problems_with_alias">A.5.4 使用 <CODE>alias</CODE> 的限制</A>。
<P></P>
<LI>
<A NAME="IDX1390"></A>
<A NAME="IDX1391"></A>
<A NAME="IDX1392"></A>
<A NAME="IDX1393"></A>
<A NAME="IDX1394"></A>
<A NAME="IDX1395"></A>
<CODE>FROM table_references</CODE> 子句表示从哪个表中检索记录行。如果你命名超过超过一个表,并执行一个 join。对于 join 句法的信息,查看章节 <A HREF="06-4.html#JOIN">6.4.1.1 <CODE>JOIN</CODE> 句法</A>。对于每个引用的表,你可以顺便指定一个别名。
<PRE>
table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | FORCE INDEX (key_list)]]
</PRE>
到 MySQL 3.23.12 时,当 MySQL 在从一个表中检索信息时,你可以提示它选择了哪一个索引。如果 <CODE>EXPLAIN</CODE> 显示 MySQL 使用了可能的索引列表中错误的索引,这个特性将是很有用的。通过指定 <CODE>USE INDEX (key_list)</CODE>,你可以告诉 MySQL 使用可能的索引中最合适的一个索引在表中查找记录行。可选的二选一句法 <CODE>IGNORE INDEX (key_list)</CODE> 可被用于告诉 MySQL 不使用特定的索引。
在 MySQL 4.0.9 中,你也可以使用 <CODE>FORCE INDEX</CODE>。这个有点像 <CODE>USE INDEX (key_list)</CODE>,但是有了这个附加物,一个表的扫描被采用时,将会有非常大的开销。换句法说,如果没有方法使用给定的索引在表中寻找记录行,这时表扫描才会被使用。
<CODE>USE/IGNORE/FORCE KEY</CODE> 分别是 <CODE>USE/IGNORE/FORCE INDEX</CODE> 的同义词。
<P></P>
<LI>
你可以以 <CODE>tbl_name</CODE> (在当前的数据库中) 引用一张表,或以 <CODE>dbname.tbl_name</CODE> 明确地指定其个数据。
你要以以 <CODE>col_name</CODE>、<CODE>tbl_name.col_name</CODE> 或 <CODE>db_name.tbl_name.col_name</CODE> 引用一个列。
你不需要在一个 <CODE>SELECT</CODE> 语句中引用的列前指定 <CODE>tbl_name</CODE> 或 <CODE>db_name.tbl_name</CODE> 前缀,除非引用列存在二义性。查看章节 <A HREF="06-1.html#Legal_names">6.1.2 数据库、表、索引、列和别名</A>,对于有歧义的列引用需要更加显式的列引用格式。
<P></P>
<LI>
<A NAME="IDX1396"></A>
<A NAME="IDX1397"></A>
一个表的引用可以使用 <CODE>tbl_name [AS] alias_name</CODE> 给以别名:
<PRE>
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;
</PRE>
<LI>
选取出来用于输出的列可以在 <CODE>ORDER BY</CODE> 和 <CODE>GROUP BY</CODE> 子句中使用列名、列的别名或列的位置来引用。列的位置从 1 开始:
<PRE>
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;
</PRE>
为了以倒序排序,可以在 ORDER BY 子句中用于排序的列名后添加一个 <CODE>DESC</CODE> (递减 descending)关键词。缺省为升序排序;这也可以通过使用 <CODE>ASC</CODE> 关键词明确指定。
<P></P>
<LI>
在 <CODE>WHERE</CODE> 子句中可以使用 MySQL 支持的任何函数。查看章节 <A HREF="06-3.html#Functions">6.3 用于 <CODE>SELECT</CODE> 和 <CODE>WHERE</CODE> 子句的函数</A>。
<P></P>
<LI>
<CODE>HAVING</CODE> 子句可以引用任何列或在 <CODE>select_expression</CODE> 中命名的别名。它在最后被执行,仅仅就在项目被送到客户端之前,不进行任何优化。所以不要对应该放在 <CODE>WHERE</CODE> 子句中的项目使用 <CODE>HAVING</CODE>。举例来说,不要写成这样:
<PRE>
mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
</PRE>
用这个代替:
<PRE>
mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
</PRE>
在 MySQL 3.22.5 或以后的版本中,你也可以这下面的形式书写一个查询:
<PRE>
mysql> SELECT user,MAX(salary) FROM users
-> GROUP BY user HAVING MAX(salary)>10;
</PRE>
在较早的 MySQL 版本中,你可能需要用下面的代替了:
<PRE>
mysql> SELECT user,MAX(salary) AS sum FROM users
-> group by user HAVING sum>10;
</PRE>
<LI>
<CODE>DISTINCT</CODE>、<CODE>DISTINCTROW</CODE> 和 <CODE>ALL</CODE> 选项指定重复的记录行是否被返回。缺省为 (<CODE>ALL</CODE>),返回所有匹配的记录行。<CODE>DISTINCT</CODE> 和 <CODE>DISTINCTROW</CODE> 是同义词,它指定结果集重复的记录行被排除。
<P></P>
<LI>
所有以 <CODE>SQL_</CODE> 开头、<CODE>STRAIGHT_JOIN</CODE> 和 <CODE>HIGH_PRIORITY</CODE> 的选项是 MySQL 对 ANSI SQL 的扩展。
<P></P>
<LI>
<CODE>HIGH_PRIORITY</CODE> 将给 <CODE>SELECT</CODE> 语句比更新一个表有更高的优先级。你只应该对非常快的或需要立即返回的查询使用它。 如果一个表已被读锁定,甚至是有一个更新语句正在等待表的释放,一个 <CODE>SELECT HIGH_PRIORITY</CODE> 查询也将会执行。
<P></P>
<LI>
<CODE>SQL_BIG_RESULT</CODE> 可以与 <CODE>GROUP BY</CODE> 或 <CODE>DISTINCT</CODE> 一同使用,以告诉优化器结果集将有许多记录行。在这种情况下,如果需要,MySQL 将直接使用基于磁盘的临时表。同样的,在这种情况下,MySQL 更愿意以 <CODE>GROUP BY</CODE> 上的一个键进行排序而不是建立一个临时表。
<P></P>
<LI>
<CODE>SQL_BUFFER_RESULT</CODE> 将强制把结果放入一个临时表。这将有助于 MySQL 尽早地释放表和有助于将大的结果集传送到客户端。
<P></P>
<LI>
<CODE>SQL_SMALL_RESULT</CODE>, 一个 MySQL 特有的选项,可以与 <CODE>GROUP BY</CODE> 或 <CODE>DISTINCT</CODE> 一同使用,以告诉优化器结果集将会很小。在这种情况下,MySQL 将使用快速的临时表存储结果表,而不是使用排序。在 MySQL 3.23 中,这通常是不需要的。
<P></P>
<LI>
<CODE>SQL_CALC_FOUND_ROWS</CODE> (版本 4.0.0 和更新的) 告诉 MySQL 计算在不考虑 <CODE>LIMIT</CODE> 子句时结果集中将有多少行记录。然后使用 <CODE>SELECT FOUND_ROWS()</CODE> 可以检索到记录行的数目。查看章节 <A HREF="06-3.html#Miscellaneous_functions">6.3.6.2 辅助功能函数</A>。
请注意,在早于 4.1.0 的版本中,<CODE>LIMIT 0</CODE> 是不工作的,它将被优化为立即返回(结果集的记录数为 0)。查看章节 <A HREF="manual1.html#LIMIT_optimisation">5.2.8 MySQL 如何优化 <CODE>LIMIT</CODE></A>。
<P></P>
<LI>
如果你使用了 <CODE>QUERY_CACHE_TYPE=2</CODE> (<CODE>DEMAND</CODE>),<CODE>SQL_CACHE</CODE> 告诉 MySQL 将存储查询结果放入查询高速缓存内。查看章节 <A HREF="06-9.html#Query_Cache">6.9 MySQL 的查询高速缓存</A>。
<P></P>
<LI>
<CODE>SQL_NO_CACHE</CODE> 告诉 MySQL 不允许将查询结果存储到查询缓存内。查看章节 <A HREF="06-9.html#Query_Cache">6.9 MySQL 的查询高速缓存</A>。
<P></P>
<LI>
<A NAME="IDX1398"></A>
如果使用了 <CODE>GROUP BY</CODE>,输出记录将会依照 <CODE>GROUP BY</CODE> 列进行排序,就好像你对所有 <CODE>GROUP BY</CODE> 中的所有字段使用了 <CODE>ORDER BY</CODE>。MySQL 扩展了 <CODE>GROUP BY</CODE> 的用法,所以你也可以在 <CODE>GROUP BY</CODE> 中指定 <CODE>ASC</CODE> 和 <CODE>DESC</CODE>:
<PRE>
SELECT a,COUNT(b) FROM test_table GROUP BY a DESC
</PRE>
<LI>
MySQL 扩展了的 <CODE>GROUP BY</CODE> 用法允许你选取没有在 <CODE>GROUP BY</CODE> 子句中提及的字段。
如果你的查询没有得到你所期望的结果,请查看 <CODE>GROUP BY</CODE> 中的描述。
查看章节 <A HREF="06-3.html#Group_by_functions">6.3.7 用于 <CODE>GROUP BY</CODE> 子句的函数</A>。
<P></P>
<LI>
<A NAME="IDX1399"></A>
<CODE>STRAIGHT_JOIN</CODE> 强制优化器以表在 <CODE>FROM</CODE> 子句中列出的顺序联结。如果优化器以一个非优化的次序联结各表,你可以使用它来加速一个查询。查看章节 <A HREF="manual1.html#EXPLAIN">5.2.1 <CODE>EXPLAIN</CODE> 句法(得到有关 <CODE>SELECT</CODE> 的信息)</A>。
<P></P>
<LI>
<CODE>LIMIT</CODE> 子句可以被用于强制 <CODE>SELECT</CODE> 语句返回指定的记录数。<CODE>LIMIT</CODE> 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1):
为了与 PostgreSQL 兼容,MySQL 也支持句法:
<CODE>LIMIT # OFFSET #</CODE>。
<PRE>
mysql> SELECT * FROM table LIMIT 5,10; # 检索记录行 6-15
</PRE>
为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
<PRE>
mysql> SELECT * FROM table LIMIT 95,-1; # 检索记录行 96-last.
</PRE>
如果只给定一个参数,它表示返回最大的记录行数目:
<PRE>
mysql> SELECT * FROM table LIMIT 5; # 检索前 5 个记录行
</PRE>
换句话说,<CODE>LIMIT n</CODE> 等价于 <CODE>LIMIT 0,n</CODE>。
<P></P>
<LI>
<A NAME="IDX1400"></A>
<CODE>SELECT ... INTO OUTFILE 'file_name'</CODE> 格式的 <CODE>SELECT</CODE> 将选择的记录行写入一个文件。文件被建立在服务器主机上,并且不可以是已存在的 (不管别的,这可以防止数据库表和文件例如 <TT>`/etc/passwd'</TT> 被破坏)。你必须在服务器主机上有 <CODE>FILE</CODE> 权限来使用这个形式的 <CODE>SELECT</CODE>。
<CODE>SELECT ... INTO OUTFILE</CODE> 主要是有意于让你能够在服务主机上快速地转储一个表。如果你希望将结果文件建立在其它的主机上,而不是服务器上,你就不能使用 <CODE>SELECT ... INTO OUTFILE</CODE>。在这种情况下,你应该使用某些客户端程序例如 <CODE>mysqldump --tab</CODE> 或 <CODE>mysql -e "SELECT ..." > outfile</CODE> 产生文件来代替它。
<CODE>SELECT ... INTO OUTFILE</CODE> 是 <CODE>LOAD DATA INFILE</CODE> 的逆操作;
语句中的 <CODE>export_options</CODE> 部分的句法由 <CODE>FIELDS</CODE> 和 <CODE>LINES</CODE> 子句组成,它们与与用在 <CODE>LOAD DATA INFILE</CODE> 语句中的相同。
查看章节 <A HREF="06-4.html#LOAD_DATA">6.4.9 <CODE>LOAD DATA INFILE</CODE> 句法</A>。
在结果文本文件中,只有下列的字符被 <CODE>ESCAPED BY</CODE> 指定的字符转义:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -