我有这个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,很抱歉,如果答案非常明显的话。任何建议都表示赞赏。
答案 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
语法。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
时,它无效。查询已经只返回一行,因此根据定义,它是不同的。