我在我的数据库上运行了一个查询,发现了一个奇怪的sql行为。返回的结果对我没有意义。我已运行此查询,返回的结果不是所需的结果。
SELECT MAX(marks), name FROM umer WHERE city!="NewYork"
这是表格的快照。
我得到了这个结果:
名称MAX(标记)
eric schmidt 100
但是我应该得到
Microsoft 100
为什么会返回上述结果?
PS:查询返回city="NEWYORK"
此致
答案 0 :(得分:2)
SELECT marks, name
FROM umer
WHERE city != 'NewYork'
ORDER BY marks DESC
LIMIT 1
您的查询无效,因为MAX(marks)
表达式和name
列之间没有任何关系。因此,mysql
完全符合您的要求 - 它会返回marks
列的最大值以及name
列的某些值。
而我的查询会做什么:它会返回一行没有city
'NewYork'
并且marks
值最大的行。
答案 1 :(得分:2)
正如MySQL Extensions to GROUP BY
所述:
在标准SQL中,包含
GROUP BY
子句的查询不能引用选择列表中未在GROUP BY
子句中指定的非聚合列。例如,此查询在标准SQL中是非法的,因为选择列表中的name
列未显示在GROUP BY
中:SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o, customers AS c WHERE o.custid = c.custid GROUP BY o.custid;
要使查询合法,必须从选择列表中省略
name
列,或在GROUP BY
子句中命名。MySQL扩展了
GROUP BY
的使用,以便选择列表可以引用未在GROUP BY
子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY
中未在ORDER BY
中命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY
子句不会影响每个组中值的选择。选择值后会对结果集进行排序,marks
不会影响服务器选择的每个组中的值。
通常,必须使用子查询来查找SELECT *
FROM umer
WHERE marks = (
SELECT MAX(marks)
FROM umer
WHERE city != 'NewYork'
)
的最大值,然后使用它来获取最大记录的其他列:
SELECT *
FROM umer NATURAL JOIN (
SELECT MAX(marks) marks
FROM umer
WHERE city != 'NewYork'
) t
或者,使用自我加入:
SELECT *
FROM umer
WHERE city != 'NewYork'
ORDER BY marks DESC
LIMIT 1
上述两种方法都将返回具有最大标记的所有记录。如果您只想要一条这样的记录,您只需对过滤后的记录进行排序并限制结果:
{{1}}
在sqlfiddle上查看。
答案 2 :(得分:-1)
在您的查询中添加ORDER BY,默认情况下ORDER BY是ASC, 检查一下
SELECT MAX(marks), name FROM umer WHERE city!='NewYork'
ORDER BY marks DESC LIMIT 1