3.3对行进行分组
3.3.1使用GROUP BY子句对行进行分组
GROUP BY子句可以用于将行分组为具有相同列值的多个部分
2.行分组可以使用聚合函数。聚合函数对每组中的行进行计算,并为每组行都返回一个结果。
3.默认情况下,GROUP BY子句会根据分组列的值按照升序次序对行进行排序。ORDER BY 子句用于指定对哪一列进行排序。
在SELECT子句中不一定要包含GROUP BY子句所使用的列。
3.3.2调用聚合函数的错误用法
如果查询中包含聚合函数,而所选择的列并不在聚合函数中,那么这些列就必须在GROUP BY子句中。
还有,不能在WHERE子句中使用聚合函数来限制行。如果试图这样做,就会出现下面的错误:ORA-00934:group function is not allowed here.
这个错误之所以会出现是因为WHERE子句只能用来对单行而不是分组进行过滤。要过滤分组行,可以使用HAVING子句。
3.3.3使用HAVING子句过滤行分组
SELECT …
FROM…
WHERE…
GROUP BY…
HAVING…
ORDER BY…;
但是HAVING必须与GROUP BY 子句一起使用。
3.3.4组合使用WHERE和GROUP BY子句
这样使用时,WHERE子句首先对返回行进行过滤,然后GROUP BY子句对保留的行进行分组。
3.3.5组合使用WHERE、 GROUP BY和HAVING子句
这样使用时,WHERE子句首先对返回行进行过滤,然后GROUP BY子句对保留的行进行分组,最后HAVING子句对行分组进行过滤,最后ORDER BY再指定对哪一列进行排序。
6子查询
6.1子查询的类型
6.2编写单行子查询
单行子查询不向外部的SQL语句返回结果,或者只返回一行。子查询可以放到SELECT语句的WHERE子句、HAVING子句或FROM子句中。
SELECT FIRST_NAME,LASST_NAME
FROM COUSTOMERS
WHERE CUSTOMER_ID =
(SELECT CUSTOMER_ID
FROM CUSTOMERS
WHERE LAST_NAME=’Brown’);
6.2.1在WHERE子句中使用子查询
SELECT FIRST_NAME,LASST_NAME
FROM COUSTOMERS
WHERE CUSTOMER_ID =
(SELECT CUSTOMER_ID
FROM CUSTOMERS
WHERE LAST_NAME=’Brown’);
6.2.2在HAVING子句中使用子查询
这个例子检索那些平均价格低于同类产品的平均价格最大值的产品的product_type_id和平均价格:
SELECT product_type_id,AVG(price)
FROM product
GROUP BY products_type_id
HAVING AVG(price)<
(SELECT MAX(AVG(price))
FROM products
GROUP BY product_type_id);
6.2.3在From子句中使用子查询(内联视图)
这个例子在外部查询中从products表中检索product_id和price列,在子查询中检索一种产品已经被购买的次数:
SELECT prds.product_id,price,purchases_data.product_count
FROM products prds,
(SELECT product_id,COUNT(product_id) product_count
FROM purchases
GROUP BY product_id) purchases_data
WHERE prds.product_id=purchases_data.product_id;
子查询从purchases表中检索出prodcut_id和COUNT(product_id),并将其返回给外部的查询。可以看到,子查询的输出结果正好是外部查询的FROM子句的另外一个数据源。
子查询不能包含ORDER BY子句,必须在外部查询中进行任何排序。
6.3编写多行子查询
多行子查询可以向外部的SQL语句返回一行或多行记录。要处理返回多行记录的子查询,外部查询可以使用IN,ANY或ALL操作符。
6.4编写多列子查询
实际上并没有限定子查询只能返回一列:我们可以编写返回多列的子查询。下面这个例子检索每种产品类型中价格最低的产品:
SELECT product_id,product_type_id,name,price
FROM products
WHERE (product_type_id,price) IN
(SELECT product_type_id,MIN(price)
FROM products
GROUP BY product_type_id);
子查询返回了两列:product_type_id和price列的最小值;而外部查询的WHERE子句中的圆括号中就包含了两列:product_type_id和price。
6.5编写关联子查询
关联子查询会引用外部查询中的一列或多列。这种子查询之说以被称为是关联子查询,是因为子查询的确与外部查询有关。当问题的答案需要依赖于外部查询中包含的每一行中的值时,
通常就需要使用关联子查询。
下面这个例子检索那些价格高于同类产品的平均价格的产品:
SELECT product_id, product_type_id,name,price
FROM products outer
WHERE price>
(SELECT AVG(price)
FROM products inner
WHERE inner.product_type_id=outer.product_type_id);
在关联子查询中,外部查询中的每一行都被一次一行地传递给子查询。子查询依次读取外部查询中的每一行的值,并将其应用到子查询上,直到外部查询中的所有行都被处理完为止。
然后返回整个查询的结果。
EXISTS操作符用于检查子查询所返回的行的存在性。虽然EXISTS也可以在非关联子查询中使用,但是EXISTS更常用的用法是用于关联子查询中。
下面这个例子使用EXISTS检索那些负责管理其他员工的员工记录:
SELECT employee_id,last_name
FROM employees outer
WHERE EXISTS
(SELECT employee_id FROM employees inner
WHERE inner.manager_id=outer.emplyee.id);
由于EXISTS只是检查子查询返回的行的存在性,因此查询不必返回一列;可以只返回一个常量值。这样可以提高查询的性能。下面这个查询对上面那个例子进行了重写:子查询现在只是简单地返回常量值1:
SELECT employee_id,last_name
FROM employees outer
WHERE EXISTS
(SELECT 1 FROM employees inner
WHERE inner.manager_id=outer.emplyee.id);
在关联子查询中使用NOT EXISTS
SELECT product_id ,name
FROM products outer
WHERE NOT EXISTS
(SELECT 1
FROM purchases inner
WHERE inner.product_id=outer.product_id);
EXISTS和NOT EXISTS与IN 和NOT IN的比较:
EXISTS只是检查行的存在性,而IN则要检查实际值的存在性。
通常来讲,EXISTS的性能都比IN高,因此应该尽可能地使用EXISTS,而不是IN。
在编写使用NOT EXISTS和NOT IN的查询时必须谨慎。当一个值列表包含一个空值时,NOT EXISTS就返回true,而NOT IN则返回false。
下列使用了NOT EXISTS,检索那些在products 表中没有任何产品的产品类型:
SELECT product_type_id,name
FROM product_types outer
WHERE NOT EXISTS
(SELECT 1
FROM products inner
WHERE inner.product_type_id=outer.product_type_id);
PRODUCT_TYPE_ID NAME
--------------------------- ----------
5 Magazine
现在使用NOT IN 重写上面的例子:
SELECT product_type_id,name
FROM product_types
WHERE product_type_id NOT IN
(SELECT product_type_id FROM products)
No row selected.
之所以没有返回行,是因为子查询返回product_type_id值的列表,其中包含一个空值。而产品的product_type_id是空值。因此,外部查询中的NOT IN操作符返回false,因此最终没有返回任何行。这个问题可以使用NVL()函数将空值转换为一个值解决
SELECT product_type_id,name
FROM product_types
WHERE product_type_id NOT IN
(SELECT NVL(product_type_id ,0) FROM products);
这一次返回了记录:
PRODUCT_TYPE_ID NAME
--------------------------- ----------
5 Magazine
6.6编写嵌套子查询
嵌套子查询就是位于SELECT、UPDATE或DELETE语句内部的查询。
应该尽量少使用嵌套子查询的技术,因为使用表连接时,查询的性能更高。
6.7编写包含子查询的UPDATE和DELETE语句
在UPDATE语句中,可以将新列的值设置为单行子查询返回的结果。
UPDATE employees
SET salary=
(SELECT AVG(high_salary)
FROM salary_grades)
WHERE employee_id=4;
在DELETE语句的WHERE子句中,可以使用子查询返回的结果。
DELETE FROM employees
WHERE salary >
(SELECT AVG(high_salary)
FROM salary_grades);
7高级查询
7.8使用分析函数
7.8.2使用评级函数
评级函数(ranking function)用于计算等级、百分点、n分片等。
RANK() 和DENSE_RANK()函数可以计算数据项在分组中的排名。这两个函数之间的区别在于处理相等数据项的方式:RANK()在出现等级相同的元素时就将排名中的位置留出来,而DENSE_RANK()则不是。例如,如果根据产品类型评定销售等级,两种产品类型并列第一名,那么RANK()将这两种类型都设置为第一名,而下一个产品类型是第三名。DENSE_RANK()也把这两个类型全部设为第一名,而下一个产品类型则是第二名。
在需要将分组划分为子分组时,可以将PARTITION BY子句和分析函数结合起来使用。
使用ROW_NUMBER()函数
ROW_NUMBER()从1开始,为每一条分组记录返回一个数字。下面这个查询展示了ROW_NUMBER()的用法 :
SELECT
prd_type_id, SUM(amount),
ROW_NUMBER() OVER (ORDER BY SUM(amount) DESC) AS row_number
FROM all_sales
WHERE year=2003
GROUP BY prd_type_id
ORDER BY prd_type_id;
PRD_TYPE_ID SUM(AMOUNT) ROW_NUMBER
------------------- ------------------- -------------------
1 888 2
2 111 5
3 333 3
4 222 4
5 1
分享到:
相关推荐
《PMBOK第6版-分章节(1-13+Part 2)-手机适配版》是针对PMP(项目管理专业人士)认证考试的重要参考资料。这份资源将原版的PMBOK指南第六版进行了章节拆分,并优化为手机阅读格式,便于备考者在忙碌的生活中利用...
计算机操作系统(第三版|微课版)第6章习题及答案 计算机操作系统是计算机科学领域中的一个重要分支,涉及到计算机系统的架构、编程语言、操作系统等多方面的内容。本章节的习题及答案主要集中在进程调度和进程状态...
ES6是下一代JavaScript语言标准的统称,每年6月发布一次修订版,迄今为止已经发布了3个版本,分别是ES2015、ES2016、ES2017。《ES6标准入门(第3版)》根据ES2017标准,详尽介绍了所有新增的语法,对基本概念、设计...
“第三版”和“王树青”指明了书籍的版本和作者,而“翻译”则提示我们这些文档是书中的部分章节的中文译文。 根据压缩包子文件的文件名称,我们可以推测这些文档可能分别对应教材的不同章节。例如: - "第三章....
第3版增加了超过30%的内容,完全覆盖了ES2017标准,相比第2版介绍了更多的语法点,还调整了原有章节的文字表达,充实了示例,论述更准确,更易懂易学。仅供学习交流。 目录 0. 前言 1. ECMAScript 6简介 2. let 和 ...
"PMBOK-6-分章节PDF"的资源包含该书的每个章节单独整理成的PDF文件,以及可能的配套视图,这种结构便于学习者针对特定主题进行深入研究和复习。 首先,我们要了解PMBOK的全称是“项目管理知识体系指南”(Project ...
PMP章节练习解析(第1-3章含20题).pdf PMP章节练习解析(第13章含21题).pdf PMP章节练习解析(第4章含30题).pdf PMP章节练习解析(第5章含18题).pdf PMP章节练习解析(第6章含23题).pdf PMP章节练习...
第3章节则详细介绍了公钥加密的概念、公钥加密算法的类型、公钥加密的应用场景、公钥加密的优缺点等。 知识点4:身份验证 第4章节主要介绍了身份验证的概念、身份验证的方法、身份验证的协议、身份验证的应用场景等...
《PMBOK第六版8-13章分章节练习题及答案》是一个针对项目管理专业人士(PMP)考试复习的资源包,包含了PMBOK(项目管理知识体系指南)第六版第八至第十三章的练习题和答案。这个资料特别适合那些希望逐章深入学习并...
【标题】"jsp第一、二章节"所涵盖的知识点主要涉及Java Server Pages(JSP)的基础概念和技术,这是Web开发中的重要组成部分。JSP是一种动态网页技术,它允许开发者将HTML代码与Java代码混合编写,以创建交互式、...
最后的07-**第三方库的整理.mp4**章节,将指导你如何整理和打包你的库,使其易于其他用户安装和使用。这部分会涉及版本控制、文档编写和发布平台的使用,以确保你的库能够方便地被社区发现和采纳。 通过这个系列...
第五版的《组合数学》书籍提供了系统性的理论和应用介绍,而第三章的内容通常会涉及更深入的计数技术和原理。在这个章节中,读者可能会接触到以下一系列的知识点: 1. **基本概念与定义**:首先,理解什么是组合、...
3.第3章文档类型定义 4.第4章数据建模与XML 5.第5章文档对象模型 6.第6章SAX 1.0:XML简易API 7.第7章命名空间和模式 8.第8章链接和查询 9.第9章转换XML 10.第10章XML和数据库 11.第11章服务器到服务器 12.第12章...
3. 关系数据库设计:涵盖关系数据库设计的ER模型、关系规范化理论,如第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及BCNF,以及数据库模式设计的重要性。 4. SQL语言:SQL是用于管理和查询关系数据库的...
《Python基础教程》第三版源代码是一份详细的学习资源,涵盖了Python编程的多个核心概念和实践技巧。这个源代码集合包括了从基础语法到高级特性的各种示例,旨在帮助初学者逐步掌握Python编程。 在Python的基础部分...
6. **第6章-定时计数组件(第三版).ppt**:详细讨论了定时器和计数器的工作原理和应用,这是很多嵌入式系统中的重要组件,用于实现定时、计数、频率测量等功能。 7. **第7章-模拟通道组件及应用(第三版).ppt**:涵盖...
很好的C#的ManagedDirectX的书啊,可惜我找了很久很久才找到这么个资源 还有这可是文字版,PDF版清晰度没的说啦 ...可惜只有1-6章 关于分数,分数应该不是很多吧,我也要去下载人家的资源,要用分的。。
第三部分“排序”(第6~11章)按章节顺序分别讨论了基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法,归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊目的排序方法,...
"android 应用案例开发大全(第三版)5\6章源码"提供了第五章和第六章的源代码,这对于深入学习Android编程和实际项目开发非常有价值。下面我们将详细探讨这两个章节可能涵盖的关键知识点。 第五章通常会涉及用户...
第三章详细介绍了 6G 无线通信网络的多种使能技术,包括空口与传输技术、新的网络架构;6G 新的范式转移,即全覆盖、全频谱、全应用、强安全在第四章介绍;最后,第五章对全文做出总结。同时,在第六章附录部分给出...