sql HAVING&均线

时间:2013-10-08 18:13:59

标签: sql database oracle11g

学习有条款和平均值(之前是AVG),我不得不承认,我很困惑。 我将在这里发布一个问题,这是本周任务中较简单的问题之一,并请某人用'真实世界'术语向我解释(不是教科书语言,最多是稀疏的。)我看到了什么我需要这样做,但是在同一列中平均多个值让我感到有些困惑,就像使用'Have'而不是'Where'一样。

SQL> desc inventory
 Name
 ----------------------------
 BOOK_CODE
 BRANCH_NUM
 ON_HAND

SQL> SELECT * FROM INVENTORY;

BOOK BRANCH_NUM    ON_HAND
---- ---------- ----------
0180          1          2
0189          2          2
0200          1          1
0200          2          3
0378          3          2
079X          2          1
079X          3          2
079X          4          3
0808          2          1
1351          2          4
1351          3          2
1382          2          1
138X          2          3
2226          1          3
2226          3          2
2226          4          1
2281          4          3
2766          3          2
2908          1          3
2908          4          1
3350          1          2
3743          2          1
3906          2          1
3906          3          2
5163          1          1
5790          4          2
6128          2          4
6128          3          3
6328          2          2
669X          1          1
6908          2          2
7405          3          2
7443          4          1
7559          2          2
8092          3          1
8720          1          3
9611          1          2
9627          3          5
9627          4          2
9701          1          2
9701          2          1
9701          3          3
9701          4          2
9882          3          3
9883          2          3
9883          4          2
9931          1          2

1 个答案:

答案 0 :(得分:0)

也许这会有所帮助:

您知道SELECT如何确定要返回的COLUMNS吗?你使用WHERE来选择返回哪个ROWS?到目前为止显而易见,对。但是,当您将多行中的值聚合为一个返回值时,如果要对这些值执行某些过滤,则必须使用HAVING。

例如:

SELECT author, title
FROM books
WHERE author = 'Twain, Mark'

会给你马克吐温写的所有书的清单。

SELECT author, count(*)
FROM books
GROUP BY author

会给你每个作者写的书数。

最后,如果你只想要那些写过3本或更多书的作者:

SELECT author, count(*)
FROM books
GROUP BY author
HAVING count(*) >= 3

我故意简化了这里的数据,但你可能会看到它是如何应用的。另一个例子可能是显示所有书籍平均价格低于10美元的作者:

SELECT author, average(price)
FROM books
GROUP BY author
HAVING average(price) < 10

如果你试图在这里使用WHERE,你所能做的就是过滤掉一本书的价格较低的行:

SELECT author, average(price)
FROM books
GROUP BY author
WHERE price < 10

这当然是错误的答案,主要是因为它会失败。但即使它返回了结果,也就是所有书籍的平均价格低于10美元 - 根本不一样。