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--事务控制语言

未更新

相关推荐
qq_5298353536 分钟前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New3 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6753 小时前
数据库基础1
数据库
我爱松子鱼3 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo3 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser4 小时前
【SQL】多表查询案例
数据库·sql
Galeoto4 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)5 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231115 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白5 小时前
PostgreSQL:更新字段慢
数据库·postgresql