一、准备数据
表 tableex
表 tableix
二、测试
#方法一
SELECT * FROM tablein WHERE EXISTS(SELECT BID from tableex WHERE BNAME = tablein.ANAME);
#方法二
SELECT * FROM tablein WHERE EXISTS(SELECT BNAME from tableex WHERE BNAME = tablein.ANAME);
#方法三
SELECT * FROM tablein WHERE EXISTS(SELECT * from tableex WHERE BNAME = tablein.ANAME);
#方法四
SELECT * FROM tablein WHERE EXISTS(SELECT 'aaa' from tableex WHERE BNAME = tablein.ANAME);
三、结果
四、结论
EXISTS
(包括 NOT EXISTS
)子句的返回值是一个 BOOL
值。 EXISTS
内部有一个子查询语句( SELECT ... FROM...
), 我将其称为 EXIST
的内查询语句。其内查询语句返回一个结果集。 EXISTS
子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。所以在上面的 SQL
中的括号里,select
后面可以是任何字段(甚至可以是某一个值),都不影响查询结果
五、EXISTS
查询可以用下面两种语句代替
SELECT * FROM tablein WHERE ANAME IN(SELECT BNAME FROM tableex);
SELECT * FROM tablein WHERE ANAME=ANY(SELECT BNAME FROM tableex);