在 SQL 查询中使用 avg() 函数只返回一行?

Lef*_*fty 2 mysql sql xampp

我有这个 SQL 查询:

SELECT DISTINCT aname, avg(salary) 
FROM aircraft, certified, employees 
WHERE cruisingrange > 1000 AND ((certified.eid = employees.eid) = (aircraft.aid = certified.aid));
Run Code Online (Sandbox Code Playgroud)

在一个列中,我试图显示巡航范围超过 1000 英里(巡航范围 > 1000)的所有飞机的飞机名称(aname)。在另一列中,我试图显示获得认证的飞行员(certified.eid =雇员.eid)的平均工资(avg(salary)),他们特别被认证可以驾驶该飞机(在AND之后完全有条件)。但是,它将所有工资合并为一个值并返回该值,因此我只得到一个包含两列一行而不是多行的表(它也只显示一个飞机名称)。

不过,这些 SQL 查询单独工作得很好:

SELECT aname 
FROM aircraft 
WHERE cruisingrange > 1000;

SELECT avg(salary)
FROM employees, certified
WHERE employees.eid = certified.eid;

SELECT DISTINCT aname
FROM aircraft, certified
WHERE certified.aid = aircraft.aid;
Run Code Online (Sandbox Code Playgroud)

我如何编写一个查询来完成我应该做的事情?我今天刚开始自学 SQL,如果答案很明显,我很抱歉。任何建议表示赞赏。

Gor*_*off 5

您正在使用 MySQL,因此请GROUP BY正确使用:

SELECT aname, avg(salary) 
FROM aircraft a JOIN
     certified c
     ON a.aid = c.aid JOIN
     employees e
     ON c.eid = e.eid
WHERE cruisingrange > 1000 
GROUP BY aname;
Run Code Online (Sandbox Code Playgroud)

根据您的查询,您似乎不太了解 SQL。所以让我们从那里开始。这里有一些建议:

  • 切勿FROM子句中使用逗号。 始终使用正确、明确的JOIN语法。
  • 使用有意义的表别名(缩写)。
  • 限定所有列名(我不能在上面的查询中,因为我不知道列来自哪里)。
  • DISTINCT你理解 SQL 之前不要使用。它对性能有很大的影响,有时会做一些奇怪的意想不到的事情。

那么,您的查询发生了什么?基本上,请考虑以下相关查询:

SELECT aname, avg(salary) 
FROM aircraft a JOIN
     certified c
     ON a.aid = c.aid JOIN
     employees e
     ON c.eid = e.eid
WHERE cruisingrange > 1000 ;
Run Code Online (Sandbox Code Playgroud)

它返回多少行?好 。. . 在大多数数据库中,它会返回 0 行和一个错误。这是一个聚合查询,但 SQL 引擎确实知道如何处理aname.

MySQL 允许这种语法,返回一行(因为它是一个没有 的聚合查询GROUP BY)。的值aname取自不确定的行。

因此,当您添加DISTINCT到 时SELECT,它没有任何效果。查询已经只返回一行,因此根据定义,它是不同的。