拥有与何处

u5i3ibmn  于 2021-06-21  发布在  Mysql
关注(0)|答案(8)|浏览(267)

我有以下两张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);

原因是什么?谢谢。

p1iqtdky

p1iqtdky1#

WHERE 子句在单个行上引入一个条件; HAVING 子句介绍了聚合的条件,即从多行生成单个结果(如count、average、min、max或sum)的选择结果。因此,您的查询需要第二种条件(即聚合上的条件) HAVING 工作正常。
根据经验,使用 WHERE 之前 GROUP BY 以及 HAVING 之后 GROUP BY . 这是一个相当原始的规则,但它在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 作为θ连接条件。

q5iwbnjs

q5iwbnjs2#

不能在聚合函数中使用where子句,因为where根据条件获取记录,它逐个记录进入表记录,然后根据我们给定的条件获取记录。所以那个时候我们不能在哪里条款。having子句对运行查询后最终得到的结果集有效。
查询示例:

select empName, sum(Bonus) 
from employees 
order by empName 
having sum(Bonus) > 5000;

这将把结果集存储在一个临时内存中,然后having子句将执行它的工作。所以我们可以很容易地在这里使用聚合函数。

jgovgodb

jgovgodb3#

WHERE 子句用于消除关系中的元组,并且 HAVING 子句用于消除关系中的组。 HAVING 子句用于聚合函数,例如 MIN , MAX , COUNT , SUM 。但始终使用 GROUP BY 前面的子句 HAVING 子句以最小化错误。

7rtdyuoh

7rtdyuoh4#

1我们可以将聚合函数与having子句而不是where子句一起使用,例如min、max、avg。
2where子句逐元组消除记录,having子句从组的集合中消除整个组
当您有多组数据时,通常使用having;当您有多行数据时,则使用where。

gxwragnw

gxwragnw5#

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

/**
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

这将首先按companyid过滤表,然后将其分组(按国家和城市),并将其进一步过滤为墨西哥的城市聚合。聚合中不需要companyid,但是我们可以在使用groupby之前使用where来过滤出所需的行。

yquaqz18

yquaqz186#

首先我们应该知道从句的执行顺序,即from>where>group by>having>distinct>select>order by。由于where子句在group by子句之前执行,因此无法通过将where应用于group by应用的记录来过滤记录。
“having与where子句相同,但应用于分组记录”。
首先where子句根据条件获取记录,然后groupby子句相应地对记录进行分组,然后having子句根据having条件获取组记录。

sqxo8psd

sqxo8psd7#

HAVING 对骨料进行操作。自 COUNT 是聚合函数,不能在 WHERE 条款。
下面是一些msdn关于聚合函数的阅读。

i7uaboj4

i7uaboj48#

where子句可以与select、insert和update语句一起使用,而having只能与select语句一起使用。
其中在聚合之前过滤行(分组依据),而在执行聚合之后过滤组。
聚合函数不能在where子句中使用,除非它位于having子句中包含的子查询中,而聚合函数可以在having子句中使用。
来源

相关问题