执行后,以下两个sql查询之间是否有任何区别:
SELECT name, count(*) FROM mytable GROUP BY name HAVING count(*) > 1
并且:
SELECT * from (SELECT name, count(*) cnt FROM mytable GROUP BY name) x where cnt > 1
换句话说,是否有更多的“便利”子句简化了子选择的必要性,或者与第二种方法相比,使用hading语句时查询引擎的性能是否根本不同?当前在mysql中:
创建表格:
CREATE TABLE `mytable` (
`name` varchar(20) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf-8;
答案 0 :(得分:1)
在几乎所有其他数据库中,两者都是等效的。为简洁起见,HAVING
通常是更好的选择。
至少在历史上,MySQL实现了子查询。因此,此查询:
SELECT *
FROM (SELECT name, count(*) as cnt
FROM mytable
GROUP BY name
) x
WHERE cnt > 1;
建议它将写出派生表,然后重新扫描它以查找最后的WHERE
。但是,这对性能没有太大影响,因为GROUP BY
已经在读写数据。
因此,这些查询在MySQL上的性能可能非常相似。而且,它们几乎对其他所有数据库都具有相同的执行计划。 HAVING
子句使查询更简单。