有人可以请解释如何使用HAVING子句,尽可能减少它。我看了看我的texbook,w3schools和youtube,但我仍然无法将自己的想法包括在内。我不知道是否过度思考,但我需要了解这一点。SQL,HAVING子句解释
0
A
回答
3
HAVING用于过滤GROUP BY中的聚合。
例如,要检查是否有重复的名称:
SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
假设我们有一个表:
CREATE TABLE `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
并有10列既ID和值从1到10:
INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);
请尝试以下2个查询:
SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
您将得到完全相同的结果,您可以看到HAVING子句可以在没有GROUP BY子句的情况下工作。
这里的区别:
SELECT `value` v FROM `table` WHERE `v`>5;
错误#1054 - 在未知列 'V' 'where子句'
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
WHERE子句要求的条件是在一个表中的列,但HAVING子句可以同时使用列和别名。
这是因为WHERE子句在select之前过滤数据,但HAVING子句在select之后过滤数据。
因此,如果表中有许多行,那么将WHERE子句中的条件更有效。
尝试EXPLAIN看到的关键区别:
EXPLAIN SELECT value
v约table
WHERE value
> 5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| 1 | SIMPLE | table | range | value | value | 4 | NULL | 5 | Using where; Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
EXPLAIN SELECT value
v约具有value
> 5 table
;
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| 1 | SIMPLE | table | index | NULL | value | 4 | NULL | 10 | Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
您可以看到WHERE或HAVING使用索引,但行数不同。
1
尽管我不确定这是否提供这些问题的正确位置,但HAVING
子句与WHERE
子句几乎相同,但请牢记以下差异。
WHERE子句:
where子句可以使用比Select语句也
凡适用于每个和单行
在where子句中的数据获取等根据条件从内存中删除
在GROUP BY子句前使用的地方
例如:在条件中使用存储器中的数据。
HAVING子句:
虽仅与SELECT语句中使用。
具有适用于总结行(与GROUP BY总结)
在具有先取出,然后根据条件分离的完成的数据。
HAVING子句用于对分组功能强加条件并在查询
例GROUP后使用BY子句:使用平均功能,然后当过滤数据等AVA(销售)> 0
摘要:
Having
作品像Where
子句出来Group By
条款
相关问题
- 1. SQL HAVING子句
- 2. SQL/SQlite的在having子句
- 3. PostgreSQL HAVING子句
- 4. Hibernate Criteria API - HAVING子句解决方法
- 5. HAVING子句中OrientDB
- 6. 混淆HAVING子句
- 7. HAVING SQL Server 2008中的子句问题
- 8. 2X COUNT在HAVING子句
- 9. TSQL - 聚集在HAVING子句
- 10. NHibernate的QueryOver HAVING子句
- 11. MySQL GROUP BY和HAVING子句
- 12. Postgresql HAVING子句限制
- 13. LINQ HAVING子句内选择
- 14. MySQL动态HAVING子句
- 15. 选择使用HAVING子句
- 16. HAVING子句不工作
- 17. PostgreSQL中的HAVING子句
- 18. T-SQL IF语句解释
- 19. 错误转换为nvarchar以计数诠释在having子句
- 20. Mysql2 ::错误:在'having子句'中的未知列'注释'
- 21. 存在与HAVING子句的子查询
- 22. SQL查询解决方案混乱,由一群迷茫的和having子句
- 23. SQL SELECT语句与HAVING和OR
- 24. 哪个SQL语句更快? (HAVING与WHERE ...)
- 25. 的Oracle SQL - 嵌套查询与分组和HAVING子句
- 26. SQL是有可能使用和/或HAVING子句
- 27. 缺少在F3中使用SQL的HAVING子句的选项
- 28. Oracle SQL - 通过与ROWNUM中的having子句?
- 29. SQL Server中,HAVING子句,其中,聚合函数
- 30. 坚持一个变量用在SQL Server中的having子句中