sql不存在,子查询不存在
假设有一个大学数据库sql不存在,子查询不存在,sql,exists,Sql,Exists,假设有一个大学数据库 name | state | enrollment ============================= Stanford | CA | 15000 ----------------------------- Berkley | CA | 36000 ----------------------------- MIT | MA | 10000 ----------------------------- Cornell |
name | state | enrollment
=============================
Stanford | CA | 15000
-----------------------------
Berkley | CA | 36000
-----------------------------
MIT | MA | 10000
-----------------------------
Cornell | NY | 21000
如果不使用max()
,我可以使用exists运算符和子查询获得入学人数最多的学院
select name from college c1 where not exists ( select * from college c2 where c2.enrollment > c1.enrollment);
这是回报
Berkeley
(1 row)
name
----------
Stanford
Berkeley
Berkeley
Berkeley
Cornell
Cornell
(6 rows)
果然
不过,我还是不明白这个查询是如何工作的<如果子查询返回至少一条记录,则满足code>exists条件。因此,在上面的例子中,只有当子查询返回一个空集时才会满足not exists
条件。或者我是这么想的
为了检查这一点,我尝试运行子查询
select c2.name from college c2,college c1 where c2.enrollment > c1.enrollment);
但这又回来了
Berkeley
(1 row)
name
----------
Stanford
Berkeley
Berkeley
Berkeley
Cornell
Cornell
(6 rows)
我在这里真的很困惑。有人能澄清一下第一个查询是如何工作的,以及我在这里出错的原因吗?在jour交叉连接和应用WHERE表达式之后,有时c2中的一行比c1中的一行多。实际上,你在两个查询中所做的事情都非常不同。这相当简单-查询状态为“找到没有其他更高入学率的学院的学院” (注意:如果您有联系,这将明显返回多个结果) 您的查询是这样的:“查找其入学人数大于其他学院的任何学院”,因此,除入学人数最低的学院外,将返回每一行(它还将排除最低级别的任何关系) 上面的查询查找可以在其中找到外部查询的注册值>当前行的记录 假设查询以自顶向下的顺序运行,它将
不存在
条件将为Berkley返回trueExists只是测试内部查询是否返回任何行。如果是,则外部查询继续进行。如果不是,则不执行外部查询,整个SQL语句不返回任何内容 EXISTS的语法为:
SELECT "column_name1" FROM "table_name1" WHERE EXISTS(SELECT * FROM "table_name2"
WHERE [Condition])
由于子查询返回的行数大于0,因此EXISTS条件为true,并且放置在内部查询中的条件不会影响外部查询的运行方式。name
斯坦福大学
伯克利
伯克利
伯克利
康奈尔
康奈尔
作为比较顺序返回,如下所示:
斯坦福大学约15000
伯克利约36000
麻省理工学院硕士10000人
康奈尔州21000
第一个C2将是斯坦福大学,C1将是一个接一个的所有学院
斯坦福并不比自己伟大,
斯坦福大学并不比伯克利大学大,
斯坦福德比麻省理工更伟大,
斯坦福大学并不比康奈尔大学大——这结束了斯坦福大学的第一个循环
在第二种情况下,c2将是伯克利,C1将是排名靠前的所有大学
给3个伯克利
第三种情况没有
第4例单孔康奈尔
就这样