我是一个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查询,该查询将返回包含一组相关记录中的重复值的所有单独行(未分组)."相关记录组"是指具有相同帐号的组(根据下面的示例).
基本上,在共享相同的不同帐号的每组相关记录中,只选择那些行date或amount列的值与该帐户的记录组中的另一行值相同的行.只应将该值视为该帐户组内的重复值.下面的样本表和理想的输出细节应该可以解决问题.
此外,即使它们具有重复值,我也不关心任何返回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) 如果我中创建一个别名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)
这有效.为什么这样?
我有两个列的表MYTABLE:A和B.
我有以下几段代码:
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)
它是一样的吗?这两个代码是否有可能返回不同的结果集?
先感谢您
所以我被分配来评估两个查询的性能并得出了令人惊讶的结果.我之前被告知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条记录基于此,我的估计是:
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) 我按照标准做法的理解是, 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 中成功运行。
下面是表格数据(一小块)基本上我想查询按照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) 我正在查询今年有多少活动人士多次参加团队志愿服务;我让它作为一个独立的查询工作:
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) 我对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的初学者,这是我被要求解决的问题:
说一个大城市被定义为一个
place类型的city具有至少10万人口.编写一个返回(state_name,no_big_city,big_city_population)订购方案的SQL查询state_name,列出那些拥有(a)至少五个大城市或(b)至少一百万人居住在大城市的州.列state_name是name的state,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) having ×10
group-by ×5
sql ×5
mysql ×4
oracle ×3
case ×1
duplicates ×1
inner-join ×1
oracle-ords ×1
performance ×1
postgresql ×1
subquery ×1
syntax ×1
where ×1