SQL分组查询(Oracle)及SQL完整的查询语句

文章目录

dql--数据查询语言

简单查询

SQL简单查询

条件查询

SQL条件查询

排序查询

SQL排序查询

分组查询

分组函数(聚合函数)

sum(列名) --求和

AVG(列名) --求平均

MIN(列名) --求最小

MAX(列名) --求最大

COUNT(列名 | * |数字) --计数

例题:

查询emp表所有员工的平均薪资;

SELECT AVG(sal) FROM emp;

注意:空值不参与聚合函数的统计

SELECT COUNT(comm),COUNT(*),COUNT(1) FROM emp;

放具体列的时候,统计的是该列非空值的个数。如comm统计数只有4 因为有奖金的人只有四个。

分组查询

根据要求,按照规则分组,统一分析各组的情况,每一组返回一个值。

SELECT *|列名|常量|计算|函数
  FROM 表名
    WHERE 过滤条件
      GROUP BY 分组内容
        HAVING 过滤条件
          ORDER BY 排序内容 ASC|DESC;

例题:

查询每个部门的平均工资

SELECT AVG(sal) FROM emp GROUP BY deptno;

当SELECT后面出现聚合函数的时候,只能展示GROUP BY后面有的字段。

例题:

查询每个部门的每个岗位平均工资

SELECT deptno,job,AVG(sal)
	FROM emp
		GROUP BY deptno,job;

GROUP BY 后面可以跟多个字段,先按第一个字段分组,每组下面再按第二列分组...

练习:

查询工资大于2000的员工中,每个部门的每个岗位平均工资

SELECT deptno,job,AVG(sal)
	FROM emp
		WHERE sal>2000
			GROUP BY deptno,job;

练习:

查询工资大于2000的员工中,每个部门的每个岗位平均工资,要求平均薪资大于3000.结果按照平均工资降序。

SELECT deptno,job,AVG(sal) 
	FROM emp
		WHERE sal > 2000
			GROUP BY deptno,job
				HAVING AVG(sal)>3000
					ORDER BY AVG(sal) DESC;

HAVING是对分组后的数据进行过滤,WHERE是对分组前的数据进行过滤,WHERE后面不能使用聚合函数,如果使用WHERE AVG() ...会报错。只要记住,但凡分组条件带聚合函数,就放 HAVING后。

整点练习题:

1.统计除10号部门的其他部门中,哪些部门的最高薪资达到三千

2.查询平均薪资超过1800的部门,显示部门编号及平均薪资

3.查询薪资合计超过5000的岗位及其平均薪资

4.查询部门人数超过4人的部门编号及薪资合计

5.查询各部门下,人数超过两人的岗位有哪些,显示部门编号、岗位名称

6.查询姓名重复的员工的姓名

SELECT deptno 
	FROM emp 
		WHERE deptno !=10 
			GROUP BY deptno 
				HAVING MAX(sal)>=3000;
SELECT deptno,AVG(sal) 
	FROM emp 
		GROUP BY deptno 
			HAVING AVG(sal)>1800;
SELECT job,AVG(sal) 
	FROM emp 
		GROUP BY job 
			HAVING SUM(sal)>5000;
SELECT deptno,SUM(sal) 
	FROM emp 
		GROUP BY deptno 
			HAVING COUNT(deptno)>4;
SELECT deptno,job 
	FROM emp 
		GROUP BY deptno,job 
			HAVING COUNT(job)>2;
SELECT ename 
	FROM emp 
		GROUP BY ename 
			HAVING COUNT(ename)>=2;

完整的查询语句

SELECT *|列名|常量|计算|函数
  FROM 表名
    WHERE 分组前的过滤条件(不能使用聚合函数的条件)
      GROUP BY 分组内容
        HAVING 过滤条件(分组后的过滤条件,能使用聚合函数的条件)
          ORDER BY 排序内容 ASC|DESC;

上述语法是数据库的书写顺序

执行顺序!

1.FROM

2.WHERE

3.GROUP BY

4.HAVING

5.SELECT

6.ORDER BY

要记住!

拿别名来举例,ORDER BY后可以加别名 ,是因为他位于取别名的SELECT之后,而WHERE不能使用别名,是因为他执行在SELECT之前。

做个练习吧

1.查询 1982年以前入职的员工,按部门、岗位分组,查出

平均薪资超过800的部门和岗位类型及其平均薪资和最高薪资,按最高薪资降序排列

2.查询部门人数超过3的部门的部门编号、最高薪资、最低薪资、部门人数,按部门人数升序排列

3.查询岗位名称不以S开头、并且岗位平均薪资超过2000的岗位的岗位名称、岗位人数、岗位平均薪资,按岗位平均薪资升序排列

4.查询各部门部门编号、最高薪资、最低薪资,以及最高和最低薪资的差值,按部门编号降序排列

5.统计岗位类型、最高薪资、最低薪资、薪资合计、平均薪资,以及人数,

各字段以中文列名展示

6.统计薪资在1000到3000之间的人员中,有佣金的员工总数及无佣金的员工总数,

SELECT deptno,job,AVG(sal),MAX(sal) 
	FROM emp 
		WHERE hiredate < to_date('1982/1/1','yyyy/mm/dd') 
			GROUP BY deptno,job HAVING AVG(sal)>800 
				ORDER BY MAX(sal) DESC;
SELECT deptno,MAX(sal),MIN(sal),COUNT(1) 
	FROM emp 
		GROUP BY deptno 
			HAVING COUNT(1)>3;
SELECT job,COUNT(1),AVG(sal) 
	FROM emp 
		WHERE job NOT LIKE 'S%' 
			GROUP BY job 
				HAVING AVG(sal)>2000 
					ORDER BY AVG(sal) ASC; 
SELECT deptno,MAX(sal),MIN(sal),(MAX(sal)-MIN(sal)) 
	FROM emp 
		GROUP BY deptno 
			ORDER BY deptno DESC;
SELECT job "岗位类型",MAX(sal) "最高薪资",MIN(sal) "最低薪资",SUM(sal) "薪资合计",AVG(sal) "平均薪资",COUNT(1) "人数" 
	FROM emp 
		GROUP BY job;
SELECT COUNT(comm),COUNT(1)-COUNT(comm) 
	FROM emp 
		WHERE sal BETWEEN 1000 AND 3000;

DML--数据操纵语言

DML数据操纵语言

DDL--数据定义语言

未更新

dcl--数据控制语言

未更新

tcl--事务控制语言

未更新

相关推荐
woshilys25 分钟前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi26 分钟前
SQL注入的那些面试题总结
数据库·sql
建投数据1 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天3 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺3 小时前
分布式系统架构:服务容错
数据库·架构
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain5 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu