Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql不存在,子查询不存在_Sql_Exists - Fatal编程技术网

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中的一行多。实际上,你在两个查询中所做的事情都非常不同。

这相当简单-查询状态为“找到没有其他更高入学率的学院的学院”

(注意:如果您有联系,这将明显返回多个结果)

您的查询是这样的:“查找其入学人数大于其他学院的任何学院”,因此,除入学人数最低的学院外,将返回每一行(它还将排除最低级别的任何关系)

上面的查询查找可以在其中找到外部查询的注册值>当前行的记录

假设查询以自顶向下的顺序运行,它将

  • 查看Stanford注册并检查是否有其他行已注册 注册>斯坦福大学注册。子查询将返回2 唱片公司(康奈尔和伯克利)。因此,这将不是一场比赛
  • 查看Berkley enrollment&检查其他行是否有enrollment>Berkley enrollment。子查询将返回0条记录。因此,
    不存在
    条件将为Berkley返回true

  • Exists只是测试内部查询是否返回任何行。如果是,则外部查询继续进行。如果不是,则不执行外部查询,整个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例单孔康奈尔

    就这样