各位用户为了找寻关于MySQL中列子查询与行子查询操作的学习教程的资料费劲了很多周折。这里教程网为您整理了关于MySQL中列子查询与行子查询操作的学习教程的相关资料,仅供查阅,以下为您介绍关于MySQL中列子查询与行子查询操作的学习教程的详细内容
MySQL 列子查询及 IN、ANY、SOME 和 ALL 操作符的使用 MySQL 列子查询 列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回。 一个列子查询的例子如下:
? 1SELECT
*
FROM
article
WHERE
uid
IN
(
SELECT
uid
FROM
user
WHERE
status=1)
列子查询中使用 IN、ANY、SOME 和 ALL 操作符
由于列子查询返回的结果集是 N 行一列,因此不能直接使用 = > < >= <= <> 这些比较标量结果的操作符。在列子查询中可以使用 IN、ANY、SOME 和 ALL 操作符:
IN:在指定项内,同 IN(项1,项2,…)。 ANY:与比较操作符联合使用,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。 SOME:ANY 的别名,较少使用。 ALL:与比较操作符联合使用,表示与子查询返回的所有值比较都为 TRUE ,则返回 TRUE 。下面是原始数据表:
table1:
? 1 2 3s1
2
10
table2:
? 1 2 3 4s2
5
12
20
ANY 操作符 ANY 关键字必须接在一个比较操作符的后面,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。一个 ANY 例子如下: SELECT s1 FROM table1 WHERE s1 > ANY (SELECT s2 FROM table2) 查询返回结果如下所示:
? 1 2s1
10
在子查询中,返回的是 table2 的所有 s2 列结果(5,12,20),然后将 table1 中的 s1 的值与之进行比较,只要大于 s2 的任何值即表示为 TRUE,符合查询条件。 IN 是 = ANY 的别名,二者相同,但 NOT IN 的别名却不是 <> ANY 而是 <> SOME。 特殊情况 如果 table2 为空表,则 ANY 后的结果为 FALSE; 如果子查询返回如 (NULL,NULL,NULL) 列为空的结果,则 ANY 后的结果为 UNKNOWN 。 ALL 操作符 ALL 关键字必须接在一个比较操作符的后面,表示与子查询返回的所有值比较为 TRUE ,则返回 TRUE 。一个 ALL 例子如下: SELECT s1 FROM table1 WHERE s1 > ALL (SELECT s2 FROM table2) 该查询不会返回任何结果,因为 s1 中没有比 s2 所有值都大的值。 当然在该例子查询中,返回了 s2 的所有值,您可以在该子查询中添加任何条件以限制返回的查询结果而无需全部返回。 NOT IN 是 <> ALL 的别名,二者相同。 特殊情况 如果 table2 为空表,则 ALL 后的结果为 TRUE; 如果子查询返回如 (0,NULL,1) 这种尽管 s1 比返回结果都大,但有空行的结果,则 ALL 后的结果为 UNKNOWN 。 注意:对于 table2 空表的情况,下面的语句均返回 NULL:
? 1 2SELECT
s1
FROM
table1
WHERE
s1 > (
SELECT
s2
FROM
table2)
SELECT
s1
FROM
table1
WHERE
s1 >
ALL
(
SELECT
MAX
(s1)
FROM
table2)
MySQL 行子查询 行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。 一个行子查询的例子如下:
? 1SELECT
*
FROM
table1
WHERE
(1,2) = (
SELECT
column1, column2
FROM
table2)
在该例子中,在保证子查询返回单一行数据的前提下,如果 column1=1 且 column2=2 ,则该查询结果为 TRUE。 MySQL 行构造符 在上面的例子中,WHERE 后面的 (1,2) 被称为行构造符,也可以写作 ROW(1,2)。行构造符通常用于与对能返回两个或两个以上列的子查询进行比较。 MySQL 行子查询实例 下面是用于例子的两张原始数据表: article 表:
blog 表:
SQL 如下:
? 1SELECT
*
FROM
article
WHERE
(title,content,uid) = (
SELECT
title,content,uid
FROM
blog
WHERE
bid=2)
查询返回结果如下所示:
在该行子查询例子中,将 article 表 title,content,uid 字段逐一与子查询返回的行记录作比较,如果相等则列出这些相等的记录(理论上可能不止一条)。