几位大哥说的,我也理解 我的意思是: USE pubs SELECT pub_name FROM publishers WHERE EXISTS (select null) 这个能查出所有出版商业书籍的出版商的名称, 我想应该不可能吧,它查询出来的是所有的记录,我也知道select null是返回一个true,USE pubs SELECT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = 'business') 总个上面的查询我可以把它分两步 一就是: SELECT *FROM titles WHERE pub_id = publishers.pub_id AND type = 'business' 查出书的种类是商业书籍, 二: SELECT pub_name FROM publishers where..... 这个查询就是在上面查询出来的结果的前提下再进一步的查询,这样查询的范围就比以前要缩小了(只查找商业书籍). 但是按联机丛书的介绍第一个查询返回的是true和false,那它怎么又能形成第二个查询的数据条件呢???
exists(...) 只返回 TRUE 或 FALSE 值没有错。 相关子查询
to glwdpy(paopaolong):你完全把“第一”和“第二”搞反了。按照你的逻辑,“pub_id = publishers.pub_id”根本无从下手,你怎么查?第一个都不成立,还怎么“缩小范围”?事实上,系统遍历每一个publishers记录,对每一个记录执行内层查询。理论上应该讨论那个表放在外层更合适的问题,从而提高效率。不过SQL Server足够聪明,它将exists嵌套查询转化为inner join然后进行查询优化的规划工作。
只返回 TRUE 或 FALSE 值没有错。就相当于
1 = 1 -- return true
2 = 1 -- return false
exists(select ...) -- 如果存在记录,返回true,负责返回false
USE pubs
SELECT pub_name
FROM publishers
WHERE EXISTS
(select null)
这个能查出来吗?????
SELECT pub_name
FROM publishers
WHERE EXISTS
(select null)
这个能查出来吗?????
----
可以查询出来,原因是
EXISTS (select null)返回了true因为select null返回的是一条记录,那么exists判断()里面是否存在着记录,如果存在则是true,所以这里就是true了。既然返回的是true,那就可以查询出来了。
SELECT pub_name
FROM publishers
WHERE EXISTS
(select null where 1 = 0)select null where 1 = 0返回的是空记录,那么exists返回false,查询不出结果。
对于:
WHERE EXISTS (select null)因为:
select null
始终有一条记录,所以相当于没有使用条件.
@@rowcount=0
则exists返回false
否则返回true
我的意思是:
USE pubs
SELECT pub_name
FROM publishers
WHERE EXISTS
(select null)
这个能查出所有出版商业书籍的出版商的名称,
我想应该不可能吧,它查询出来的是所有的记录,我也知道select null是返回一个true,USE pubs
SELECT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
总个上面的查询我可以把它分两步
一就是:
SELECT *FROM titles WHERE pub_id = publishers.pub_id AND type = 'business'
查出书的种类是商业书籍,
二:
SELECT pub_name FROM publishers where.....
这个查询就是在上面查询出来的结果的前提下再进一步的查询,这样查询的范围就比以前要缩小了(只查找商业书籍).
但是按联机丛书的介绍第一个查询返回的是true和false,那它怎么又能形成第二个查询的数据条件呢???
只返回 TRUE 或 FALSE 值没有错。
相关子查询