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

时间:2016-10-28 00:22:37

标签: 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));

在一栏中,我试图显示巡航范围超过1000英里(巡航范围> 1000)的所有飞机的飞机名称(aname)。在另一栏中,我试图显示经过认证特别是飞行该飞机的认证飞行员(certified.eid = employees.eid)的平均工资(平均工资(薪水))(在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;

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

1 个答案:

答案 0 :(得分:4)

您正在使用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;

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

  • 从不FROM子句中使用逗号。 始终使用正确的JOIN语法。
  • 使用有意义的表别名(缩写)。
  • 限定所有列名称(我不能在上面的查询中,因为我不知道列的来源)。
  • 在了解SQL之前,请不要使用DISTINCT。它对性能有很大的影响,有时会出现奇怪的意外情况。

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

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 ;

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

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

因此,当您向DISTINCT添加SELECT时,它无效。查询已经只返回一行,因此根据定义,它是不同的。