gpt4 book ai didi

mysql - SQL中GROUP BY的基本用法

转载 作者:行者123 更新时间:2023-11-29 04:40:51 24 4
gpt4 key购买 nike

我正在努力理解 GROUP BY 在此查询中的用法,并且正在寻找说明:

Flights(flno: integer, from: string, to: string, distance: integer, departs: time, arrives: time, price: real)
Aircraft(aid: integer, aname: string, cruisingrange: integer)
Certified(eid: integer, aid: integer)
Employees(eid: integer, ename: string, salary: integer)

问题是:对于所有航程超过 1000 英里的飞机,找出飞机的名称和获得该飞机认证的所有飞行员的平均工资。

SELECT Temp.name, Temp.AvgSalary
FROM ( SELECT A.aid, A.aname AS name,
AVG (E.salary) AS AvgSalary
FROM Aircraft A, Certified C, Employees E
WHERE A.aid = C.aid AND
C.eid = E.eid AND A.cruisingrange > 1000
GROUP BY A.aid, A.aname ) AS Temp

为什么这里需要GROUP BY?以下查询不会返回飞机和相应的工资,还是会返回所有员工的平均工资,而不是特定于每架飞机?

       SELECT A.aname, AVG(E.salary)
FROM Aircraft A, Certified C, Employees E
WHERE A.aid = C.aid AND
C.eid = E.eid AND A.cruisingrange > 1000

使用 GROUP BY 是否会更改表格的格式,以便使用 GROUP BY A.aid 会指定我们仅对飞机表格进行分组,而保留认证和员工表未动?

最佳答案

GROUP BY 需要正确地进行聚合(在这种情况下,取平均值)。

如果您不按任何内容分组,MySQL 将对您的整个表执行此聚合。换句话说,如果您使用上次查询,它将返回所有航程超过 1000 的飞机的平均工资,而不区分是哪架飞机。尝试一下,您将看到这种行为。

但是,如果您在此处使用 GROUP BY 子句,您将看到每架个人 航程超过 1000 的飞机的平均值,这正是您想要的。没有它,您将取所有飞机的平均值。

在一些示例数据上尝试这些查询,行为上的差异会变得更加明显。


编辑

关于您最近的几句话:是的,我们没有对认证表或员工表做任何事情。退一步说,问题是针对每架飞机。很多时候,如果您得到一个问题陈述,其中阐明了您需要哪一组项目的结果,那么将其作为您的 group by 子句是一个很好的开始。

关于mysql - SQL中GROUP BY的基本用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com