我有这个 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,如果答案很明显,我很抱歉。任何建议表示赞赏。
您正在使用 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,它没有任何效果。查询已经只返回一行,因此根据定义,它是不同的。