Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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_Where Clause_Having - Fatal编程技术网

SQL-拥有与何处

SQL-拥有与何处,sql,where-clause,having,Sql,Where Clause,Having,我有以下两个表格: 1. Lecturers (LectID, Fname, Lname, degree). 2. Lecturers_Specialization (LectID, Expertise). 我想找最专业的讲师。 当我尝试此操作时,它不起作用: SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID AN

我有以下两个表格:

1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
我想找最专业的讲师。 当我尝试此操作时,它不起作用:

SELECT
  L.LectID, 
  Fname, 
  Lname 
FROM Lecturers L, 
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
AND COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);
但当我尝试这一点时,它是有效的:

SELECT
  L.LectID,
  Fname,
  Lname 
FROM Lecturers L,
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
GROUP BY L.LectID,
         Fname,
         Lname 
HAVING COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID); 

原因是什么?谢谢。

对聚合进行操作。由于
COUNT
是一个聚合函数,因此不能在
WHERE
子句中使用它


从MSDN中读取一些聚合函数。

其中
子句在单个行上引入了一个条件
HAVING
子句引入了聚合条件,即选择结果,其中从多行生成了单个结果,如count、average、min、max或sum。您的查询需要第二种条件(即聚合上的条件),因此
have
可以正常工作

根据经验,使用
其中
分组依据之前和
分组依据之后使用
。这是一个相当原始的规则,但它在90%以上的情况下都很有用

进行此操作时,您可能希望使用ANSI版本的联接重新编写查询:

SELECT  L.LectID, Fname, Lname
FROM Lecturers L
JOIN Lecturers_Specialization S ON L.LectID=S.LectID
GROUP BY L.LectID, Fname, Lname
HAVING COUNT(S.Expertise)>=ALL
(SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)

这将消除用作θ连接条件的WHERE

您不能使用带有聚合函数的WHERE子句,因为WHERE根据条件获取记录,它逐个记录进入表记录,然后根据我们给出的条件获取记录。所以那个时候我们不能在哪里条款。While子句对结果集起作用,我们在运行查询后最终得到结果集

查询示例:

select empName, sum(Bonus) 
from employees 
order by empName 
having sum(Bonus) > 5000;
这将把结果集存储在临时内存中,然后having子句将执行其工作。因此,我们可以在这里轻松地使用聚合函数

  • WHERE子句可用于SELECT、INSERT和UPDATE语句,而HAVING只能用于SELECT语句

  • 其中,在聚合之前筛选行(分组依据),而在执行聚合之后筛选组

  • 聚合函数不能在WHERE子句中使用,除非它位于HAVING子句中包含的子查询中,而聚合函数可以在HAVING子句中使用

  • 1。 我们可以将聚合函数与HAVING子句而不是WHERE子句一起使用,例如min、max、avg

    二,。 WHERE子句逐元组消除记录元组 HAVING子句将整个组从组集合中删除


    大多数情况下,当您有多组数据时使用HAVING,当您有多行数据时使用WHERE。

    在一个查询中没有看到这两种情况的示例。所以这个例子可能会有所帮助

      /**
    INTERNATIONAL_ORDERS - table of orders by company by location by day
    companyId, country, city, total, date
    **/
    
    SELECT country, city, sum(total) totalCityOrders 
    FROM INTERNATIONAL_ORDERS with (nolock)
    WHERE companyId = 884501253109
    GROUP BY country, city
    HAVING country = 'MX'
    ORDER BY sum(total) DESC
    

    这将首先按公司ID过滤表,然后对表进行分组(按国家和城市),并将其进一步过滤到墨西哥的城市聚合。聚合中不需要companyId,但在使用GROUP BY之前,我们可以使用WHERE筛选出所需的行。

    首先,我们应该知道子句的执行顺序,即 FROM>WHERE>GROUP BY>have>DISTINCT>SELECT>ORDER BY. 由于WHERE子句在GROUP BY子句之前执行,因此无法通过将WHERE应用于GROUP BY应用的记录来过滤记录

    “HAVING与WHERE子句相同,但应用于分组记录”。


    首先,WHERE子句根据条件获取记录,然后,groupby子句将它们相应地分组,然后,HAVING子句根据HAVING条件获取组记录

    其中
    子句用于消除关系中的元组,
    HAVING
    子句用于消除关系中的组

    HAVING
    子句用于聚合函数,例如
    MIN
    MAX
    COUNT
    SUM
    。但在
    拥有
    子句之前,请始终使用
    GROUP BY
    子句以尽量减少错误。

    您能否澄清您正在使用的SQL版本(MySQL、MS SQL、PostgreSQL、Oracle等)。另外,当你说“不工作”时,你的意思是结果不是像你期望的那样,还是有编译/解析错误?为什么用ALL而不是MAX?。有什么好处吗?我想我们不能使用没有分组的子句。HAVING子句的位置-选择->从->位置->分组依据->HAVING->订单BY@Morez正如MySQL 8.0参考手册()中提到的,HAVING可以在没有GROUP BY子句的情况下使用。以下引用自参考手册链接:HAVING子句指定组的条件,通常由GROUPBY子句组成。查询结果仅包括满足条件的组。(如果不存在GROUP BY,则所有行隐式地构成一个聚合组。)这不是一个好的示例,因为您可以将:`WHERE companyId=884501253109 GROUP BY country,city HAVING country='MX'`转换为:`WHERE companyId=884501253109,country='MX'GROUP BY BY country`如果只是将[country]筛选移到您建议的WHERE,选择[country]时查询将出错,因为[country]不再包含在分组依据聚合中,因此无法选择。您的优化要点是将[country]移动到WHERE,因为这将是稍后分组依据的较小数据集。当然,这只是一个例子来说明可能的用途。我们可以更改为sum(total)>1000,这将是一个完全有效的情况,包括WHERE和have。是否始终使用此操作顺序?如果查询优化器更改了顺序怎么办?@MSIS即使查询优化器更改了顺序,结果也应该与遵循此顺序相同。这是合乎逻辑的顺序。