1.组函数(聚合函数)

(1)组函数介绍

组函数操作行集,给出每组的结果。组函数不象单行函数,组函数对行的集合进行操作,

对每组给出一个结果。这些集合可能是整个表或者是表分成的组。

组函数与单行函数区别

单行函数对查询到每个结果集做处理,而组函数只对分组数据做处理。

单行函数对每个结果集返回一个结果,而组函数对每个分组返回一个结果。

组函数的类型

• AVG 平均值

• COUNT 计数

• MAX 最大值

• MIN 最小值

• SUM 合计

组函数的语法

使用组函数的原则

• 用于函数的参数的数据类型可以是 CHAR、VARCHAR2、NUMBER 或 DATE。

• 所有组函数忽略空值。为了用一个值代替空值,用 NVL、NVL2 或 COALESCE 函数。

(2)组函数的使用 AVG 和 SUM 函数

AVG(arg)函数:对分组数据做平均值运算。

arg:参数类型只能是数字类型。

SUM(arg)函数:对分组数据求和。

arg:参数类型只能是数字类型。

示例:求雇员表中的的平均薪水与薪水总额。

select avg(salary) ,sum(salary) from employees;

使用 MIN 和 MAX 函数

MIN(arg)函数:求分组中最小数据。

arg:参数类型可以是字符、数字、日期。

MAX(arg)函数:求分组中最大数据。

arg:参数类型可以是字符、数字、日期。

示例 :求雇员表中的最高薪水与最低薪水。

select min(salary),max(salary) from employees;

使用 COUNT 函数

COUNT 函数:返回一个表中的行数。

COUNT 函数有三种格式:

• COUNT(*)

• COUNT(expr)

• COUNT(DISTINCT expr)

COUNT(*) :

返回表中满足 SELECT 语句标准的行数,包括重复行,包括有空值列的行。如果WHERE 子句包括在 SELECT 语句中,COUNT(*) 返回满足 WHERE 子句条件的行数。

示例:返回查询结果的总条数。

select count(*) from employees;

COUNT(expr)函数 :

返回在列中的由 expr 指定的非空值的数。

示例:显示部门 80 中有佣金的雇员人数。

select count(commission_pct) from employees e where e.department_id = 80;

COUNT(DISTINCT expr):

使用 DISTINCT 关键字禁止计算在一列中的重复值。

示例:显示 EMPLOYEES 表中不重复的部门数。

select count(distinct department_id) from employees ;

组函数和 Null 值

所有组函数忽略列中的空值。

在组函数中使用 NVL 函数来处理空值。

示例:计算有佣金的员工的佣金平均值。

select avg(commission_pct) from employees;

2.创建数据组(GROUP BY)

什么是创建数据组

可以根据需要将查询到的结果集信息划分为较小的组,用 GROUP BY 子句实现。

GROUP BY 子句语法

GROUP BY 子句:GROUP BY 子句可以把表中的行划分为组。然后可以用组函数返回

每一组的摘要信息。

使用分组原则

• 如果在 SELECT 子句中包含了组函数,就不能选择单独的结果,除非单独的列出现在 GROUP BY 子句中。如果未能在 GROUP BY 子句中包含一个字段列表,你会收到一个错误信息。

• 使用 WHERE 子句,你可以在划分行成组以前过滤行。

• 在 GROUP BY 子句中必须包含列。

• 在 GROUP BY 子句中你不能用列别名。

• 默认情况下,行以包含在 GROUP BY 列表中的字段的升序排序。可以用 ORDER BY子句覆盖这个默认值。

GROUP BY 子句的使用

我们可以根据自己的需要对数据进行分组,在分组时,只要将需要做分组的列的列名添

加到 GROUP BY 子句后侧就可以。GROUP BY 列不必在 SELECT 列表中。

示例:求每个部门的平均薪水。

select department_id , avg(salary) from employees e group by e.department_id;

GROUP BY 子句的执行顺序

先进行数据查询,在对数据进行分组,然后执行组函数。

非法使用 Group 函数的查询

• 在 SELECT 列表中的任何列必须在 GROUP BY 子句中。

• 在 GROUP BY 子句中的列或表达式不必在 SELECT 列表中。

约束分组结果

HAVING 子句 的概念

HAVING 语句通常与 GROUP BY 语句联合使用,用来过滤由 GROUP BY 语句返回的记录集。

HAVING 语句的存在弥补了 WHERE 关键字不能与聚合函数联合使用的不足。

HAVING 子句语法

示例:显示那些最高薪水大于 $10,000 的部门的部门号和最高薪水。

select e.department_id,max(e.salary) from employees e group by e.department_id having max(e.salary) > 10000;

查询那些最高薪水大于 $10,000 的部门的部门号和平均薪水。

select e.department_id,avg(e.salary) from employees e group by e.department_id having max(e.salary) > 10000;

嵌套组函数

在使用组函数时我们也可以根据需要来做组函数的嵌套使用。

示例 :显示部门中的最大平均薪水。

select max(avg(e.salary)) from employees e group by e.department_id;

3.子查询

子查询介绍

子查询是一个 SELECT 语句,它是嵌在另一个 SELECT 语句中的子句。

子查询语法

• 子查询 (内查询) 在主查询之前执行一次

• 子查询的结果被用于主查询 (外查询)

可以将子查询放在许多的 SQL 子句中,包括:

• WHERE 子句

• HAVING 子句

• FROM 子句

使用子查询的原则

• 子查询放在圆括号中。

• 将子查询放在比较条件的右边。

• 在单行子查询中用单行运算符,在多行子查询中用多行运算符。

示例:谁的薪水比 Abel 高。

用内连接实现:

select em.last_name,em.salary from employees abel,employees em where abel.last_name = 'Abel' and em.salary > abel.salary;

用子查询实现:

select em.last_name,em.salary from employees em where em.salary >(select m.salary from employees m where m.last_name = 'Abel');

子查询的类型

• 单行子查询:子查询语句只返回一行的查询

• 多行子查询:子查询语句返回多行的查询

单行子查询

• 仅返回一行

• 使用单行比较符

示例:显示那些 job ID 与雇员 141 相同的雇员的名字与 job ID。

select em.last_name,em.job_id from employees em where em.job_id = (select job_id from employees e where e.employee_id = 141);

示例:显示 job ID 与雇员 141 相同,并且薪水 高于雇员 143 的那些雇员。

select e.last_name,e.job_id,e.salary from employees e where e.job_id = (select em.job_id from employees em where em.employee_id = 141) and e.salary > (select emp.salary from employees emp where emp.employee_id = 143);

在子查询中使用组函数

示例 :显示所有其薪水等于最低薪水的雇员的 last name、job ID 和 salary。

select em.last_name,em.job_id,em.salary from employees em where em.salary =(select min(salary) from employees);

带子查询的 HAVING 子句

可以在 WHERE 子句中使用子查询,也可以在 HAVING 子句中使用子查询。

示例 :显示所有其最低薪水小于 部门 50 的最低薪水的部门号和最低薪水。

select em.department_id,min(em.salary) from employees em group by em.department_id having min(em.salary) > (select min(e.salary) from employees e where e.department_id = 50);

什么是子查询错误?

子查询错误:使用子查询的一个常见的错误是单行子查询返回了多行。

多行子查询

• 返回多于一行

• 使用多行比较符

主查询对子查询的多行比较运算符

在条件中也可使用 NOT 取反。

4.在多行子查询中使用 IN 运算符

示例 :查找各部门收入为部门最低的那些雇员。显示他们的名字,薪水以及部门 ID。

select e.last_name,e.department_id,e.salary from employees e where e.salary in(select min(em.salary) from employees em group by em.department_id);

5.在多行子查询中使用 ANY 运算符

< ANY 意思是小于最大值。 >ANY 意思是大于最小值。

示例

显示工作岗位不是 IT_PROG 的雇员,并且这些雇员的的薪水少于 IT_PROG 工作岗位的雇员的 ID、名字、工作岗位和薪水。

select e.employee_id,e.last_name,e.job_id,e.salary from employees e where e.job_id <> 'IT_PROG' and e.salary < any (select em.salary from employees em where em.job_id = 'IT_PROG') ;

6.在多行子查询中使用 ALL 运算符

<ALL 意思是小于最小值。>ALL 意思是大于最大值。

ANY 与 ALL 的区别:

ANY: >ANY 表示至少大于一个值,即大于最小值。

ALL: >ALL 表示大于每一个值,既大于最大值。

根据父类id查询所有的父级_031、组函数和子查询相关推荐

  1. mysql子查询为什么不走索引_解决MySQL中IN子查询会导致无法使用索引问题

    测试表如下: CREATE TABLE`test_table` ( `id`int(11) NOT NULLAUTO_INCREMENT, `pay_id`int(11) DEFAULT NULL, ...

  2. Oracle数据库:子查询、单行子查询,多行子查询,in,any,all语句,子查询的练习案例

    Oracle数据库:子查询.单行子查询,多行子查询,in,any,all语句,子查询的练习案例 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 ...

  3. MySql基础篇---002 SQL之SELECT使用篇: 基本的SELECT语句,运算符,排序与分页,多表查询,单行函数,聚合函数,子查询

    第03章_基本的SELECT语句 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑 ...

  4. MySQL数据库---子查询insert,update,delete语句中嵌套子查询

    十.子查询的使用(重点) 1.子查询:指的是查询语句,嵌套查询语句---->一般是放在where子句中,表示条件. 2.子查询的应用使用场景: 2.1查询过程中,虽然给了条件,但是条件的结果并不 ...

  5. jquery获取元素(父级的兄弟元素的子元素)

    一.获取父级元素 使用jquery获取父级元素: parent() 例如:$(this).parent('ul'); 二.获取同级元素 使用jquery获取同级元素:siblings() 例如:$(t ...

  6. MySQL学习笔记-03高级查询、多表联合查询、聚合函数、子查询、视图、存储过程、权限、

    关于作者 金山老师:从事Java.大数据.Python职业化培训6年,项目管理.软件开发14年.欢迎添加我的微信号[jshand],最近建了一些微信交流群,扫描下方二维码添加公众号,回复:进群 文章目 ...

  7. oracle之单行函数之子查询之课后练习

    /*************************************************************************************************/ ...

  8. mysql数据库多表查询(内连接,外连接,自连接,子查询及案例分析)

    mysql数据库多表查询 之前接触的项目或者自己涉及的部分对于多表查询的使用都比较的少,常常是自己更具案例进行学习,最近见到的比较的多,所以今天就好好的总结一下,为下一步学习做准备! 1.多表查询关系 ...

  9. 妙用SQL Server聚合函数和子查询迭代求和

    本文为原创,如需转载,请注明作者和出处,谢谢! 先看看下面的表和其中的数据: t_product 图1 该表有两个字段:xh和price, 其中xh是主索引字段,现在要得到如下的查询结果: 图2 从上 ...

最新文章

  1. 设计模式笔记(9)---组合模式(结构型)
  2. 谢文睿:西瓜书 + 南瓜书 吃瓜系列 7. 支持向量机
  3. SqlServer中从字符串中获取项目指标方法charindex月substring结合
  4. Qt中的ui文件是c语言文件吗,c-Qt-UI文件未在Visual Studio中更新
  5. 《C++ Primer第五版》习题答案
  6. sqldeveloper的查看执行计划快捷键F10
  7. HTML5 API详解(11):Cache 应用程序缓存,这下离线也可以玩了
  8. 饿了么element UIel-dialog弹出层/el-dialog修改默认样式不能在style scoped修改
  9. php 写一个大富翁游戏,抽奖系列:如何用纯js做一个大富翁游戏
  10. python3入门代码-Python3入门(三)——Python基础语法
  11. Spring5--@Indexed注解
  12. Graph_Master(连通分量_C_Trajan缩点+最小路径覆盖)
  13. EtherCAT和Ethernet的不同点有哪些, 通信周期又是什么意思?
  14. 《计算机网络实验教程》——验证性实验
  15. 高仿滴滴打车 android,仿滴滴出行页面Demo
  16. PLSQL中的存储过程
  17. 通过一个Kafka故障解决过程阐述架构师必须具备的架构思维
  18. 轻松完成Panoply安装
  19. 布尔教育mysql优化_布尔教育-资源
  20. 前缀和与差分那些不得不说的事(一维,二维)公式与图解详细解说

热门文章

  1. 剥开比原看代码07:比原节点收到“请求区块数据”的信息后如何应答?
  2. django-xadmin使用之更改菜单url
  3. IOS 获取农历方法(转)
  4. 游戏“冰川滑行”设计稿(第一版)
  5. 协议森林14 逆袭 (CIDR与NAT)
  6. 12.4scrum report
  7. 开源的关系型数据持久化组件
  8. js正则检测输入内容为数字,包括负数,整数,浮点数,亲测可用.JS检测整数,js检测浮点数,js检测负数,js检测数字,js限制输入框只输入数字,解决H5 number类型只能输入正数问题.
  9. hadoop jar包_【大数据学习】Hadoop的MR分布式开发小实战
  10. 安卓系统挂载NTFS格式硬盘_苹果电脑挥之不去的烦恼!怎样兼容NTFS格式的U盘移动硬盘?...