《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·010【高级查询】
文章目录
- 一、分组函数(聚合函数)
- 1、介绍
- 2、格式
- 3、常用函数
- (1).MIN函数、MAX函数
- (2).SUM函数、AVG函数
- (3).COUNT函数
- 4、group by子句
- 5、having子句
- 二、子查询(嵌套查询)
- 1、单行子查询
- 2、多行子查询
一、分组函数(聚合函数)
1、介绍
分组查询对数据行的集合进行操作并按组给出一个结果
2、格式
select [列名列表,] 分组函数(列)
from 表名
[where 条件语句]
[group by 列]
[having 关于 分组函数(列) 的条件表达式]
[order by 列 | 表达式]
3、常用函数
(1).MIN函数、MAX函数
使用示例
select min(hiredate), max(hiredate)
from emp;
注意点
min
或max
在没有使用group by
子句的情况下,不要查询其他列(因为这样没有意义)
(2).SUM函数、AVG函数
使用示例
select max(sal) 最高工资, min(sal) 最低工资, avg(sal) 平均工资, sum(sal) 工资总和
from emp
where job="SALESMAN";-- 发奖金的员工的平均奖金
select avg(comm) from emp;-- 所有员工的平均奖金
select avg(ifnull(comm, 0)) from emp;
注意点
- 所有聚合函数在有
where
子句的情况下,where
子句会被执行,然后再分组 sum
函数、avg
函数不会对null
值进行统计,可以使用ifnull
函数强制对空值进行统计
(3).COUNT函数
使用示例
-- 员工人数
select count(*) from emp;-- 拿薪水的员工人数
select count(sal) from emp;-- 拿奖金的员工人数
select count(COMM) from emp;-- 员工的部门数
select count(distinct deptno) from emp;
注意点
count
不会为null
的列进行计数- 要消除重复行的计数需要加上关键字
distinct
4、group by子句
使用示例
-- 查询所有部门的平均工资,并进行升序排列
select d.dname 部门名称, avg(sal) 部门平均工资
from emp e
join dept d
on e.deptno = d.deptno
group by d.dname
order by 2;-- 按每个部门、每个岗位显示部门名称、岗位、平均工资,并按照平均工资进行升序排列
select d.dname 部门名称, e.job 岗位, avg(e.sal) 平均工资
from emp e
join dept d
on e.deptno = d.deptno
group by d.dname, e.job
order by avg(e.sal);
注意点
group by
中出现的列,尽可能出现在select中group by
中未出现的列,在select
中应该使用聚合函数
5、having子句
作用
使用having
子句排出组结果
使用示例
-- 查询平均工资大于2900的部门
select d.dname, max(sal)
from emp e
join dept d
on e.deptno = d.deptno
group by d.dname
having max(sal) > 2900--
select job, avg(sal) 平均工资
from emp
where job in ('CLERK', 'SALEMAN', 'MANAGER')
group by job
order by avg(sal);
注意点
where
子句不能限制分组函数的条件,必须用having
子句来限制- SQL语句执行顺序:
select
(获取表数据)→where
(筛选)→group by
(分组)→having
(筛选)→select
(整理分组后的数据)→order by
(排序)
二、子查询(嵌套查询)
1、单行子查询
使用示例
-- 查询比JONES员工工资高的其他员工
select ename
from emp
where sal > (select sal from emp where ename = 'JONES');-- 错误示例
select ename
from emp
where sal > (select sal from emp where ename in ('JONES', 'SCOTT'));
注意点
- 不能拿单个值和嵌套查询结果的多行值进行大小比较
2、多行子查询
说明
子查询返回的记录条数也可以是多条,这时候往往就需要使用多行操作符(in
、any
、all
)
使用示例
-- 多列相等也可以直接等值判断
select empno, ename, sal
from emo
where (ename, sal) = (select ename, sal from emp where empno = 7902);-- 查询管理者
select ename, sal
from emp
where empno in (select mgr from emp)-- 查询工资比JONES或SCOTT中的某一个大的所有员工
select ename, sal
from emp
where sal > any (select sal from emp where ename in ('JONES', 'SCOTT'));-- 查询工资比JONES或SCOTT中的所有都大的所有员工
select ename, sal
from emp
where sal > all (select sal from emp where ename in ('JONES', 'SCOTT'));-- 查询管理者的姓名和薪水
select ename, sal
from emp e
where empno exists (select mgr from emp m where m.mgr = e.empno)-- 查询不是管理者的员工的姓名和薪水
select ename, sal
from emp e
where empno not exists (select mgr from emp m where m.mgr = e.empno)
注意点
- 对于
any
和all
,可以近似理解为数学意义上的存在
和任意
- 注意
null
值的处理,要使用exists
关键字而不是in
关键字
《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·010【高级查询】相关推荐
- 阿里云原生数据仓库AnalyticDB MySQL版学习
阿里云原生数据仓库AnalyticDB MySQL版是融合数据库.大数据技术于一体的阿里云原生企业级数据仓库服务.AnalyticDB MySQL版支持高吞吐的数据实时增删改.低延时的实时分析和复杂E ...
- SQL必知必会(第五版)学习笔记
文章目录 第一课 了解SQL 1.1数据库基础 1.1.1 数据库(database) 1.1.2 表(table) 1.1.3 列和数据类型 1.1.4 行(row) 1.1.5 主键(primar ...
- sql必知必会(第四版) 学习笔记二 视图
本书用到的几个表的建表sql语句如下: --销售产品供应商 CREATE TABLE Vendors (vend_id varchar(20) not null,vend_name varchar(5 ...
- sql必知必会(第四版) 学习笔记一
温习一遍简单的sql语法,把自己掌握还不够的地方,做了些笔记.... 1 去重复关键词,distinct select distinct sname from student; 2 限制结果top的用 ...
- 云原生数据仓库AnalyticDB MySQL版用户手册
控制流函数 - 云原生数据仓库AnalyticDB MySQL版 - 阿里云 [ps:常用的adb函数] 备注:一些mysql函数adb不支持
- MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01
MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...
- MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02
MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 最新、最全、最详细的 MySQL 数据库学习笔记总结(2021最新版)
数据库是什么 数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统. DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 ...
- MySQL语法学习笔记
MySQL语法学习笔记 学习之道,非尽心竭力者不能进也!我是小七黛,欢迎查看我的笔记,有问题欢迎交流探讨. SQL是一种结构查询语言,用于查询关系数据库的标准语言,包括若干关键字和一致的语法,便于数据 ...
最新文章
- 计算机网络管理的常用命令,网络管理常用命令图文详解.pdf
- 取代人类医生?AI给你做的诊断你敢信吗
- Tensorflow:如何保存/恢复模型?
- 汉语转拼音pinyin4j
- html text全删,删除没有/ text()。extract()的HTML标记
- c++ 一个函数包括多个返回值判断_轻松玩转函数式编程
- Oracle基本查询
- 我的Android学习之旅--1环境配置
- View结合组策略进行应用程序下发
- linux双网卡绑定同一IP步骤,linux系统双网卡绑定单个IP地址
- 项目以任务还是以功能为中心?
- 易语言中动态地址的理解
- java thread 线程_Java Thread类简述
- Python 如何拆分数据集
- 测试后台管理系统思路和方法
- 台式计算机cpu允许温度,玩游戏cpu温度多少正常(台式电脑夏季CPU一般温度多少)...
- 达芬奇密码--buuctf密码学
- 使用Git提交代码时出现Author identity unknow
- wamp下载和使用PHPDocumentor
- Guacamole会话记录屏幕录像
热门文章
- android每秒 1,在Android 5.1中调度每秒的警报
- html 空格占位符_HTML常用英文单词,快来背单词吧
- 让电脑代码满屏飞_程序员想让你的电脑死机,需要多久?
- Javaspring 1-6课 基本概念及第一个Javaspring程序
- 推荐几个值得关注的爬虫库
- WampServer安装教程
- Tutorial of Codeforces Round 729 (Div.2)
- Python中Youki使用索引快速为数组或矩阵赋值的技巧
- Markdown数学公式、特殊字符、上下标、积分、分式/根式 亲测有效
- maven的setting文件简单配置