INSERT INTO firms VALUES
(10,''''abc co'''',''''leduc''''),(30,''''ghi inc'''',''''nisku'''');
因为在这个查询中表firms有两行记录返回:
SELECT * FROM clients WHERE clno <
(SELECT clno FROM firms);
错误原因:
"Subquery returns more than 1 row"
这种情况有两个解决方法。第一个是修改查询让其用any包含,使外部查询的比较任意的值 :
SELECT * FROM clients WHERE clno < ANY
(SELECT clno FROM firms);
在这里,第一个比较是(10<10),返回为false,但是第二个比较(10<30),返回true,因此子查询返回true,使用的是 clno 10相比较的结果,使用any 的规则如下:
- ANY返回true,如果子查询的比较操作至少有一个是是true。
- ANY 返回 false,如果子查询返回为空行,或者比较任意一行都是false。
ANY的同义词是SOME,使用in 等同于使用 = ANY。
第二种方法是修改查询,使用all包含子查询,比较外部的查询结果使用每一个子查询的值。
SELECT * FROM clients WHERE clno < ALL
(SELECT clno FROM firms);
在这里,第一次的比较还是返回false,而第二此返回true,最后,子查询的结果是false,所以查询返回空行。使用all的规则是:
- 返回true,如果子查询返回空行记录,或者子查询的每一个结果比较都为true的话。
- 返回false,如果子查询至少有一个比较结果返回false。
Does the Subquery Return at least One Row?
子查询至少要求返回一行么?
在有些时候,查询的结果是子查询是否有一个结果返回。使用[NOT] EXISTS来判断结果集是否为空。如果你的子查询至少有一行返回,使用EXISTS 返回 true;否则,返回为false。还有一种用法,NOT EXISTS,如果子查询结果集为空,它返回为true,否则的话,返回为true。一般情况下,子查询跟随在 [NOT] EXISTS后面,以select * 开头。在这里,星号(*)不是表示列出所有的列,而是表示为列出一些列。这里有一个小例子,返回所有client表的结果。
SELECT * FROM clients WHERE EXISTS
(SELECT * FROM firms);
在本例当中,where子句返回true,因为表firms不为空。通常[NOT] EXISTS会使用在更加复杂的情况下面,假设你有一下数据表:
CREATE TABLE passengers (
name VARCHAR(15),
compartment INT);
INSERT INTO passengers VALUES (''''smith'''',20);
INSERT INTO passengers VALUES (''''jones'''',25);
CREATE TABLE cars (
上一页 [1] [2] [3] [4] [5] 下一页 [MySql]PHP存取 Mysql 数据乱码终极解决方案 [MySql]解决Table xxx is marked as crashed and should … [MySql][MySQL]快速解决"is marked as crashed and shoul… [MySql]MySQL DELETE语法用法详解 [MySql]mysql中时间日期格式化 [MySql]修改mysql导入文件大小限制 [其他]MySql常用命令大全 [Web开发]把ACCESS的数据导入到Mysql中的方法详解 [MySql]解决mysql 1040错误Too many connections的方法 [系统软件]利用crontab系统每天定时备份MySQL数据库
|