【问题标题】:SQL - WHERE NOT EXISTS [closed]SQL - 不存在的地方[关闭]
【发布时间】:2020-11-28 19:31:29
【问题描述】:

我有一张员工桌 身份证姓名工资

我用这条 SQL 语句得到了薪水最高的员工:

SELECT *
FROM Emplyees eOut
WHERE NOT EXISTS (SELECT * 
                  FROM Emplyees eIn 
                  WHERE eIn.Salary > eOut.Salary)

据我所知,只有当内部语句为真时,外部语句才会执行,那么为什么会给出结果呢? 我不明白为什么只有一个结果,这是如何处理的,为什么 NOT 和 > 对此很重要?

【问题讨论】:

  • 在您的数据库中查找“相关子查询”的文档。

标签: sql subquery where-clause exists


【解决方案1】:

查询返回员工。但不是全部,如果有任何员工的薪水高于此人,它不会显示员工。为每个员工评估内部查询。换句话说,它返回薪水最高的员工。如果两个员工的最高薪水相同,它可能会返回更多行。

【讨论】:

    【解决方案2】:

    表达式:

    NOT EXISTS (SELECT * FROM Emplyees eIn WHERE eIn.Salary > eOut.Salary)
    

    是一个布尔表达式,可能值为truefalse
    当内部查询返回(至少)1 行时,它获取值 false,如果内部查询没有返回任何行,则获取值 true

    你的假设:

    只有当内部语句为真时,才会执行外部语句

    因为它的措辞是错误的。

    声明:

    SELECT * FROM Emplyees eOut
    

    将被执行并返回所有Emplyees的行,对于这些行中的每一行,WHERE子句将评估其条件为truefalse
    因此,对于表格的每一行,条件 NOT EXISTS ... 将决定该行是否会出现在最终结果中。

    要理解为什么 NOT 和 > 在这种情况下很重要,请考虑如下查询:

    选择不存在其他员工的每位员工 更高的薪水。

    【讨论】:

      【解决方案3】:
      SELECT *
          FROM Emplyees 
          ORDER BY Salaray DESC
          LIMIT 1
      

      试试这个查询

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-13
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-28
        • 2018-09-30
        • 2021-10-11
        相关资源
        最近更新 更多