我有以下两张table:
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);
原因是什么?谢谢。
8条答案
按热度按时间p1iqtdky1#
WHERE
子句在单个行上引入一个条件;HAVING
子句介绍了聚合的条件,即从多行生成单个结果(如count、average、min、max或sum)的选择结果。因此,您的查询需要第二种条件(即聚合上的条件)HAVING
工作正常。根据经验,使用
WHERE
之前GROUP BY
以及HAVING
之后GROUP BY
. 这是一个相当原始的规则,但它在90%以上的情况下是有用的。在执行此操作时,可能需要使用ansi版本的联接重新编写查询:
这将消除
WHERE
作为θ连接条件。q5iwbnjs2#
不能在聚合函数中使用where子句,因为where根据条件获取记录,它逐个记录进入表记录,然后根据我们给定的条件获取记录。所以那个时候我们不能在哪里条款。having子句对运行查询后最终得到的结果集有效。
查询示例:
这将把结果集存储在一个临时内存中,然后having子句将执行它的工作。所以我们可以很容易地在这里使用聚合函数。
jgovgodb3#
WHERE
子句用于消除关系中的元组,并且HAVING
子句用于消除关系中的组。HAVING
子句用于聚合函数,例如MIN
,MAX
,COUNT
,SUM
。但始终使用GROUP BY
前面的子句HAVING
子句以最小化错误。7rtdyuoh4#
1我们可以将聚合函数与having子句而不是where子句一起使用,例如min、max、avg。
2where子句逐元组消除记录,having子句从组的集合中消除整个组
当您有多组数据时,通常使用having;当您有多行数据时,则使用where。
gxwragnw5#
在一个查询中没有看到两者的示例。所以这个例子可能会有所帮助。
这将首先按companyid过滤表,然后将其分组(按国家和城市),并将其进一步过滤为墨西哥的城市聚合。聚合中不需要companyid,但是我们可以在使用groupby之前使用where来过滤出所需的行。
yquaqz186#
首先我们应该知道从句的执行顺序,即from>where>group by>having>distinct>select>order by。由于where子句在group by子句之前执行,因此无法通过将where应用于group by应用的记录来过滤记录。
“having与where子句相同,但应用于分组记录”。
首先where子句根据条件获取记录,然后groupby子句相应地对记录进行分组,然后having子句根据having条件获取组记录。
sqxo8psd7#
HAVING
对骨料进行操作。自COUNT
是聚合函数,不能在WHERE
条款。下面是一些msdn关于聚合函数的阅读。
i7uaboj48#
where子句可以与select、insert和update语句一起使用,而having只能与select语句一起使用。
其中在聚合之前过滤行(分组依据),而在执行聚合之后过滤组。
聚合函数不能在where子句中使用,除非它位于having子句中包含的子查询中,而聚合函数可以在having子句中使用。
来源