WHERE vs HAVING生成的查询

时间:2013-07-30 14:04:25

标签: php mysql sql

我知道这个标题被滥用了,但似乎我的问题还没有回答。 所以,问题是这样的:

我有一个由四个表(表,行,列,值)组成的表结构,我用它来重新创建information_schema的行为(在某种程度上)。 在php中我生成查询以检索数据,结果仍然看起来像普通表:

SELECT 
  (SELECT value FROM `values` WHERE `col` = "3" and row = rows.id) as "col1",
  (SELECT value FROM `values` WHERE `col` = "4" and row = rows.id) as "col2" 
FROM rows WHERE `table` = (SELECT id FROM tables WHERE name = 'table1') 
HAVING (col2 LIKE "%4%")

OR

SELECT * FROM 
(SELECT 
  (SELECT value FROM `values` WHERE `col` = "3" and row = rows.id) as "col1",
  (SELECT value FROM `values` WHERE `col` = "4" and row = rows.id) as "col2" 
FROM rows WHERE `table` = (SELECT id FROM tables WHERE name = 'table1')) d 
WHERE col2 LIKE "%4%" 

请注意,我定义结果列的部分是由php脚本生成的。为什么我这样做不太重要,但我想扩展这个算法,生成查询以供更广泛的使用。 我们遇到了核心问题,我必须决定是否为查询生成wherehaving部分,我知道何时使用它们,问题是我的算法没有问题'我必须为此做一些额外的检查。但是上面的两个查询是等价的,我总是可以在子查询中添加任何查询,给它一个别名,并在新派生表上使用where。但是我想知道我是否会遇到性能方面的问题,或者这是否会以一种意想不到的方式转向我。

我知道它们是如何工作的,以及应该如何更快,但这就是我来这里问的原因。希望我能让自己明白,请原谅我的英语和长期无用的短语,以及所有这些。

编辑1

我已经知道了两者之间的区别,所有这些意味着,我唯一的困境是使用其他表中的自定义列,具有可变数字和大小,并尝试获得与使用正常创建的表相同的结果意味着我必须使用HAVING过滤派生表列,同时可以选择将其包装在子查询中并在正常情况下使用,这可能会创建一个临时表,之后将对其进行过滤。这会影响大型数据库的性能吗?不幸的是我现在无法对此进行测试,因为我无法用超过10亿个条目填充数据库(这将是这样的:rows表中的10亿,values表中的50亿,因为每行有5列,cols表格中的5行和1表格中的tables行= 6,000,006 条目总数)

现在我的数据库看起来像这样:

+----+--------+-----------+------+
| id | name   | title     | dets |
+----+--------+-----------+------+
|  1 | table1 | Table One |      |
+----+--------+-----------+------+

+----+-------+------+
| id | table | name |
+----+-------+------+
|  3 |     1 | col1 |
|  4 |     1 | col2 |
+----+-------+------+
where `table` is a foreign key from table `tables` 


+----+-------+-------+
| id | table | extra |
+----+-------+-------+
|  1 |     1 |       |
|  2 |     1 |       |
+----+-------+-------+
where `table` is a foreign key from table `tables` 

+----+-----+-----+----------+
| id | row | col | value    |
+----+-----+-----+----------+
|  1 |   1 |   3 | 13       |
|  2 |   1 |   4 | 14       |
|  6 |   2 |   4 | 24       |
|  9 |   2 |   3 | asdfghjk |
+----+-----+-----+----------+
where `row` is a foreign key from table `rows` 
where `col` is a foreign key from table `cols` 

编辑2

这些条件仅用于演示目的!

编辑3

对于只有两行,似乎两者之间存在差异,使用的是0,0008,而使用的是0.0014-0.0019。我想知道这是否会影响大量行和列的性能

编辑4

两个查询的结果是相同的,即:

+----------+------+
| col1     | col2 |
+----------+------+
| 13       | 14   |
| asdfghjk | 24   |
+----------+------+

4 个答案:

答案 0 :(得分:4)

HAVING专门针对GROUP BYWHERE是提供条件参数。另请参阅WHERE vs HAVING

答案 1 :(得分:1)

我相信在这种情况下,having子句会更快,因为你要定义特定的值,而不是读取值并寻找匹配。

答案 2 :(得分:1)

请参阅:http://database-programmer.blogspot.com/2008/04/group-by-having-sum-avg-and-count.html

基本上,WHERE会在将列传递给聚合函数之前对其进行过滤,但HAVING会过滤聚合函数的结果。

答案 3 :(得分:0)

你可以这样做

    WHERE col2 In (14,24)

你的代码WHERE col2 LIKE "%4%"是个坏主意,那么col2 = 34也将被选中。