标签: having

MySQL Group By和HAVING

我是一个MySQL查询noobie所以我敢肯定这是一个明显答案的问题.

但是,我正在研究这两个问题.他们会返回不同的结果集吗?我知道排序过程会以不同的方式开始,但我相信它们会返回相同的结果,第一个查询的效率稍高一些吗?

查询1:HAVING,然后是AND

SELECT user_id   
FROM forum_posts  
GROUP BY user_id 
    HAVING COUNT(id) >= 100   
    AND user_id NOT IN (SELECT user_id FROM banned_users)
Run Code Online (Sandbox Code Playgroud)

查询2:在哪里,然后是HAVING

SELECT user_id   
FROM forum_posts 
WHERE user_id NOT IN(SELECT user_id FROM banned_users) 
GROUP BY user_id 
    HAVING COUNT(id) >= 100   
Run Code Online (Sandbox Code Playgroud)

mysql group-by having

6
推荐指数
1
解决办法
6602
查看次数

从不同的相关记录组中的两列之一中选择包含重复值的所有行

我正在尝试创建一个MySQL查询,该查询将返回包含一组相关记录中的重复值的所有单独行(未分组)."相关记录组"是指具有相同帐号的组(根据下面的示例).

基本上,在共享相同的不同帐号的每组相关记录中,只选择那些行dateamount列的值与该帐户的记录组中的另一行值相同的行.只应将该值视为该帐户组内的重复值.下面的样本表和理想的输出细节应该可以解决问题.

此外,即使它们具有重复值,我也不关心任何返回X状态的记录.

带有相关数据的小样本表:

id   account   invoice   date         amount   status
1    1         1         2012-04-01   0        X
2    1         2         2012-04-01   120      P
3    1         2         2012-05-01   120      U
4    1         3         2012-05-01   117      U
5    2         4         2012-04-01   82       X
6    2         4         2012-05-01   82       U
7    2         5         2012-03-01   81       P
8    2         6         2012-05-01   80       U
9    3         7         2012-03-01   80       P
10   3         8         2012-04-01   79       U
11   3         9         2012-04-01   78       U …
Run Code Online (Sandbox Code Playgroud)

mysql group-by inner-join duplicates having

6
推荐指数
1
解决办法
1万
查看次数

别名在哪里和有什么区别

如果我中创建一个别名select子句然后我不能在使用where条款,因为根据SQL查询的执行顺序where之前来select.

但我可以创建在一个别名select子句和它的使用having条款,虽然having来之前select.

为什么会这样?

例如:

select type, (case when number>25 then 1 else 0 end) inc 
from animals
where inc='1';
Run Code Online (Sandbox Code Playgroud)

这不行.但,

select type, (case when number>25 then 1 else 0 end) inc 
from animals
having inc='1'; 
Run Code Online (Sandbox Code Playgroud)

这有效.为什么这样?

sql group-by having having-clause

6
推荐指数
1
解决办法
1763
查看次数

"HAVING ... GROUP BY"和"GROUP BY ... HAVING"之间的区别

我有两个列的表MYTABLE:AB.

我有以下几段代码:

SELECT MYTABLE.A FROM MYTABLE 
    HAVING SUM(MYTABLE.B) > 100
    GROUP BY MYTABLE.A
Run Code Online (Sandbox Code Playgroud)

SELECT MYTABLE.A FROM MYTABLE 
    GROUP BY MYTABLE.A
    HAVING SUM(MYTABLE.B) > 100
Run Code Online (Sandbox Code Playgroud)

它是一样的吗?这两个代码是否有可能返回不同的结果集?

先感谢您

sql oracle syntax group-by having

6
推荐指数
2
解决办法
633
查看次数

在哪里与GROUP BY相比具有表现

所以我被分配来评估两个查询的性能并得出了令人惊讶的结果.我之前被告知HAVING比较慢,WHERE因为它只在访问行后过滤结果.这似乎是合理的,这个关于SQL子句执行顺序的问题强调了这一点.

但是,我估计以下查询的性能有一些假设,似乎使用HAVING执行实际上更快!

SELECT status, count(status)
FROM customer
GROUP BY status
HAVING status != 'Active' AND status != 'Dormant'

SELECT status, count(status)
FROM customer
WHERE status != 'Active' AND status != 'Dormant'
GROUP BY status
Run Code Online (Sandbox Code Playgroud)

假设是:

  • 该表CUSTOMER有100 000条记录
  • 访问行的成本是0.01ms(SELECT + COUNT)
  • 执行条款的成本是0.005毫秒
  • 有三种类型的客户状态,上面两个和'已故'
  • 有15000名"死者"客户

基于此,我的估计是:

First query:
    Accessing all rows, FROM: 100 000 * 0.01ms = 1000ms
    GROUP BY: 100 000 * 0.005ms = 500ms
    HAVING (2 conditions, 3 groups): 2 …
Run Code Online (Sandbox Code Playgroud)

sql oracle performance where having

6
推荐指数
1
解决办法
375
查看次数

使用开发人员桌面和开发人员 Web 的 Oracle 数据库中没有 GROUP BY 的 HAVING 子句

我按照标准做法的理解是, HAVING 将与 GROUP BY 一起用于过滤条件,而 WHERE 应该用于一般的按行过滤条件。

然而,关于是否使用 HAVING 作为 WHERE 子句的超集,在线讨论的结论不一。也就是说,它是否可以在没有 GROUP BY 的情况下使用,在这种情况下它作为 WHERE 子句工作。

我想了解在 Oracle、Microsoft SQL 服务器、MySQL、PostGreSQL 和其他工具中使用 HAVING 子句的行业实践是什么。

我在执行此查询时观察到的一件有趣的事情:

SELECT *
FROM SH.SALES
WHERE amount_sold > 1000
HAVING amount_sold < 2000;
Run Code Online (Sandbox Code Playgroud)

它在 Oracle SQL 开发人员桌面中执行时出错,而在 Oracle SQL 开发人员 Web 中成功运行。

oracle having oracle-sqldeveloper having-clause oracle-ords

6
推荐指数
1
解决办法
171
查看次数

有min的mysql组

下面是表格数据(一小块)基本上我想查询按照accoutn编号分组时具有最小original_date_ctr的行.

我尝试过使用HAVING(MIN()),其中= Min()和其他方式没有运气.

这里的正确结果会给我id_ctr 688,1204和1209

id_ctr  account_number_cus  original_date_ctr   mrc_ctr  
------  ------------------  -----------------  ----------
   688               20062  2008-05-17             138.97
  1204              151604  2006-08-10           42000.00
  1209              151609  2006-06-29             968.68
  1367               20062  2011-10-27             207.88
  1434              151609  2009-09-10            1469.62
  1524              151604  2009-09-01           36999.99
  1585              151609  2012-05-31            1683.88
Run Code Online (Sandbox Code Playgroud)

mysql having

5
推荐指数
2
解决办法
5638
查看次数

如何在子查询中使用 HAVING 作为 Select 语句的一部分

我正在查询今年有多少活动人士多次参加团队志愿服务;我让它作为一个独立的查询工作:

   SELECT Activists.team, COUNT(id) AS Activists
    FROM
    (
        SELECT e.id, v.team, 
        COUNT(CASE WHEN (e.status="Completed" AND right(e.date,2)="15") THEN e.id END) AS count
        FROM actiontable e
        LEFT JOIN persontable v ON v.id = e.id
        GROUP BY e.id, v.team
        HAVING (count > 1)
    ) AS Activists
    GROUP BY Activists.team;
Run Code Online (Sandbox Code Playgroud)

但我不太清楚如何让它在更长的SELECT声明中发挥作用。我遇到的问题是,我还有许多其他(更简单)的查询部分,可以在语句中按团队返回内容,例如SELECT

COUNT(DISTINCT CASE WHEN v.WillCanvass = "X" THEN v.id END)
Run Code Online (Sandbox Code Playgroud)

显然,我不能获得HAVING (count > 1)活动人士的查询部分,因为那样它会影响我SELECT声明的所有其他部分——所以我需要上面的子查询只影响我正在处理的唯一部分。

我用示例模式制作了一个SQL Fiddle来帮助完成上述有效的查询 - 但理想的情况是获得与此类似的输出,其中子查询Activists不会影响WillCanvass列(即使我编造了数字)以下):

Team    Activists …
Run Code Online (Sandbox Code Playgroud)

mysql subquery having

5
推荐指数
1
解决办法
7589
查看次数

SQL:只有条件,按组中的单列选择两列

我对SQL有点新鲜; 我有单表产品:

maker model type
A     1232  PC
A     1233  PC
A     1276  Printer
A     1298  Laptop
A     1401  Printer
A     1408  Printer
A     1752  Laptop
B     1121  PC
B     1750  Laptop
C     1321  Laptop
D     1288  Printer
D     1433  Printer
E     1260  PC
E     1434  Printer
E     2112  PC
E     2113  PC
Run Code Online (Sandbox Code Playgroud)

我需要选择制造商的类型,制造商有超过1个型号但所有这些型号都是单一类型.所以输出应该是

maker  type
D     Printer
Run Code Online (Sandbox Code Playgroud)

当我只通过制造商执行分组时一切正常,但是当使用制造商和类型=一切都出错时:(是否可以通过单个列执行组但输出中有2个?没有类型的正确响应返回下一个查询:

Select maker from product
group by maker
having count(model)>1
and count(distinct type)=1
Run Code Online (Sandbox Code Playgroud)

但是当我选择制造商时,键入 - 它出错了:(当使用选择制造商,类型和按制造商分组,类型时也是错误的

花了大约4个小时来解决这个问题,非常感谢您的帮助,提前致谢!

sql group-by having

5
推荐指数
1
解决办法
822
查看次数

SQL聚合函数别名

我是SQL的初学者,这是我被要求解决的问题:

说一个大城市被定义为一个place类型的city具有至少10万人口.编写一个返回(state_name,no_big_city,big_city_population)订购方案的SQL查询state_name,列出那些拥有(a)至少五个大城市或(b)至少一百万人居住在大城市的州.列state_namenamestate,no_big_city是在国家大城市的数量,并且big_city_population为生活在该州大城市的人数.

现在,据我所知,以下查询返回正确的结果:

SELECT state.name AS state_name
     , COUNT(CASE WHEN place.type = 'city' AND place.population >= 100000 THEN 1 ELSE NULL END) AS no_big_city
     , SUM(CASE WHEN place.type = 'city' AND place.population >= 100000 THEN place.population ELSE NULL END) AS big_city_population
FROM state
JOIN place
ON state.code = place.state_code
GROUP BY state_name
    HAVING
        COUNT(CASE WHEN place.type = 'city' AND place.population >= 100000 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql case aggregate-functions having

5
推荐指数
1
解决办法
1160
查看次数