初识数据库(分组函数)

分组函数

  --什么是分组函数 : 可以对结果集中的一组记录进行一次计算

    select sal from emp

  --单行分组函数

    --MAX、MIN (最大、最小)

  --查询emp表中工资最大的和工资最小的工资

    select max(sal),min(sal)

    from emp

  --SUM、AVG(总和,平均数)

  --查询员工表中部门号是20的员工工资的总和以及平均工资

    select sum(sal),avg(sal)

    from emp e

    where e.deptno = ‘20‘

  --count 用来记录结果集中的数据条数

    select count(*)

    from emp

    where deptno = ‘30‘

  --注意 : 所有的分组函数都是忽略null的

    select avg(comm)

    from emp

    select avg(nvl(comm,0))

    from emp

  --查询员工表中有几个不同的职位

    select count(distinct(job))

    from emp e

多行函数

  --查询emp表各部门的最大工资

    --group by 关键字

  --显示部门、最大工资

    select deptno,max(sal)

    from emp

    group by deptno

  --注意多行分组函数的关键字 group by 要求是from子句后必须是每一组唯一值

    --在select 子句后可以检索的也是每一组的唯一值

  --查询不同部门下有哪些岗位,计算出不同岗位的平均工资

    select deptno,job,avg(sal)

    from emp

    group by deptno,job

    order by deptno

  --having 子句 : 对分组结果进行条件判断

    --查询emp表中的平均工资高于2000的部门编号以及平均工资

    select deptno,avg(sal)

    from emp

    group by deptno

    having avg(sal)>2000

  --为什么不用where子句

    --因为执行顺序 : from -> where -> group by -> having -> select -> order by

分组嵌套

  --查询各部门人数的平均值

    select avg(count(*))

    from emp

    group by deptno

  --分析函数

  --可以在数据中进行分组

  --计算基于组的某种统计值

  --每一组的每一行都会返回一个值

  --包含三个子句

    --分组子句(partition by)

    --排序子句(order by)

    --窗口子句(rows)

    --over() 开窗函数

  --显示员工编号,员工姓名,部门编号,工资,按部门提取工资和,按部门累计工资

    select e.ename as "员工姓名", e.empno as "员工编号",e.deptno as 部门编号,e.sal as 工资,

    sum(sal) over(partition by deptno)  按部门分组 ,sum(sal) over(partition by deptno order by sal) as  按部门累计工资

    from emp e

  --分级函数 rank() : 按照某种排序显示等级

    --显示岗位工资和等级

    select e.ename as "员工姓名", e.empno as "员工编号",e.deptno as 部门编号,e.sal 工资,e.job 岗位,

    rank() over(partition by e.job order by e.sal desc) 岗位工资等级

    from emp e

子查询

  --就是把一条完整的sql语句嵌套到另外一条sql语句中

    --范围 : select , from , wherer , having

  --单行子查询

    --子查询结果是一行一列的

  --查询和SCOTT用户同领导的员工信息,但不包含他

    select *

    from emp

    where mgr =

    (select mgr

    from emp

    where ename = ‘SCOTT‘)

    and ename != ‘SCOTT‘

  --查询KING、的直属下属

    select *

    from emp

    where mgr =

    (select empno

    from emp

    where ename = ‘KING‘)

  --查询平均工资高于20部门的平均工资部门编号和平均工资

    select deptno,avg(sal)

    from emp

    group by deptno

    having avg(sal)>(select avg(sal) from emp where deptno = ‘20‘)

  --查询人数多于平均人数的部门编号以及人数

    select deptno,count(*)

    from emp

    group by deptno

    having count(*)>

    (select avg(count(*))

    from emp

    group by deptno)

  --查询和SMITH同部门并且工资比SMITH高的

    select *

    from emp

    where

    deptno =

    (select deptno

    from emp

    where ename = ‘SMITH‘) and

    sal >

    (select sal

    from emp

    where ename = ‘SMITH‘)

多行子查询

  --子查询的结果是一列多行

    --不能使用比较运算符

    --可以使用逻辑运算符

  --in 依次匹配

  --查询哪些员工是领导

    select *

    from emp

    where empno

    in(select mgr from emp)

  --查询各部门工资排倒数第一、第二的

    select * from

    (select min(sal) 倒第一,deptno

    from emp

    group by deptno)

    join

    (select min(sal) 倒第二 ,deptno

    from emp

    where sal not in

    (select min(sal)

    from emp

    group by deptno)

    group by deptno)

    using(deptno)

  --排序函数

    --row_number () : 对固定的数据进行排序,根据序号进行判断

  --查询各部门工资在前两位的

    select *

    from

    (select deptno,ename,sal,row_number() over(partition by deptno order by sal desc) rn

    from emp)

    where rn < 3

  --any : 与子查询表中任意的一条数据相匹配(最小的数据相匹配)

  --查询20部门下的工资不低于10部门下的任意员工的工资的员工

    select deptno,sal from emp where sal > any

    (select sal from emp where deptno = ‘10‘)

    and deptno = ‘20‘

    select deptno,sal from emp where sal >

    (select min(sal) from emp where deptno = ‘10‘)

    and deptno = ‘20‘

  --all

  --与子查询表中所有的数据进行匹配(最大的数据进行匹配)

    select deptno,sal from emp where sal > all

    (select sal from emp where deptno = ‘10‘)

    and deptno = ‘20‘

  --多行多列子查询

    --就是子查询结果集是多行多列的

    --主查询也应该是多行多列的

  --查询员工表中各部门员工工资的最大值以及员工的姓名

    select deptno 部门编号,ename MAX工资员工姓名,sal 工资

    from emp

    where (deptno,sal) in

    (select deptno,max(sal)

    from emp

    group by deptno)

表合并

  --union : 累计 -- 去掉重复

  --union all : 累计 -- 不去掉重复

    select * from haha

    select name , num, sl,(sl*num) 小计

    from haha

    union all

    (select ‘合计‘,sum(num),sum(sl),sum(sl*num)

    from haha)

  --内联视图

  --查询和SMITH同部门入职比SMITH晚,且工资比他高的

    select e.*

    from emp e ,

    (select deptno,hiredate,sal from emp

    where ename = ‘SMITH‘) a

    where e.deptno = a.deptno and e.hiredate > a.hiredate

    and e.sal > a.sal

  --伪列:oracle对所有的表都提供了一个排序的隐藏列

    --rownum

    select rownum, dept.* from dept

  --特性:

    --1、rownum编号 是在 order by 之前进行

      select rownum, dept.* from dept

      order by dname

    --2、rownum 的比较只能使用 < 或 <=

      select rownum, dept.* from dept

      where rownum <= 2

分页

  --查询员工表中5-8位的员工信息

    select b.*

    from

    (select a.*,rownum rn

    from (select * from emp) a

    where rownum <= 8) b

    where rn >= 5

    select b.*

    from

    (select emp.*,rownum rn

    from emp

    where rownum <= 8) b

    where rn >= 5

时间: 2024-10-07 04:30:33

初识数据库(分组函数)的相关文章

数据库SQL的分组函数

分组函数:(五个) 1···max(expr):求expr的最大值 }\ 2···min(expr):求expr的最小值 }-- 数据类型是有规定的 3···sum(expr):求expr的总和 }-- 必须是字符型或数字 4···avg(expr):求expr的平均值 }/ 5···count(expr):求expr的个数 expr的类型不能是空,如果是空,则不计入其中, 因此需要用到nvl()来进行转换 group by expr1,expr2,...的用法: group by 的后面跟的是

Oracle数据库(六)—— 分组函数

(一)组函数 avg:平均函数 max:最大值函数 min:最小值函数 sum:求和函数 stddev:标准差函数 count():计数函数 count(expr) 返回expr不为空的记录总数 NVL函数使分组函数无法忽略空值 COUNT(DISTINCT expr)返回expr非空且不重复的记录总数 (二) group by 1.对单个列分组 -- 求出employees表中各部门的平均工资 2.对多个列分组 -- 求出employees表中各部门.各工种的平均工资 在SELECT 列表中所

SQL Server数据库ROW_NUMBER()函数使用

下面以几个实例来说明ROW_NUMBER()函数的使用. 实例如下: 1.使用row_number()函数进行编号,如 select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Customer 原理:先按psd进行排序,排序完后,给每条数据进行编号. 2.在订单中按价格的升序进行排序,并给每条记录进行排序代码如下: select DID,customerID,totalPrice,ROW_NUMBER() 

Oracle数据库实用函数

实用函数 DECODE 语法如下: DECODE(value, if1, then1, if2,then2,if3,then3, . . . else )  Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果.当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1:如果value等于if2,Decode函数结果是then2:等等.事实上,可以给出多个if/then 配对.如果value结果不等于给出的任何配对时,Decode 结果就返回els

Oracle基本语法&amp;&amp;函数&amp;&amp;子查询&amp;&amp;分页查询&amp;&amp;排序&amp;&amp;集合操作&amp;&amp;高级分组函数

一.  数据库 手工---文件管理---数据库 DB:Database 数据库. DBMS:管理数据库的软件.(oracle) 主流关系数据库: 1.      Oracle 2.      DB2 3.      SQL Server 基本没人使 4.      MySQL  基本没人用,免费 Linux 开源,可以发现漏洞补上 Windows服务器会有补丁,数据易泄漏 eclipse 日食 数据表(Table): 表的行(Row):记录 表的列(Column):字段 二.  关系型数据库 一

Oracle学习(4):分组函数

分组函数 什么是分组函数? 分组函数作用于一组数据,并对一组数据返回一个值 组函数的类型 lAVG lCOUNT lMAX lMIN lSUM 数值求和 SQL> --求员工工资总额 SQL> select sum(sal) from emp; SUM(SAL) ---------- 29025 求数据条数 SQL> --求员工的人数 SQL> select count(*)from emp; COUNT(*) ---------- 14 求平均 SQL> --平均工资 SQ

SQL Server数据库ROW_NUMBER()函数使用详解

SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_NUMBER()函数的使用是本文我们要介绍的内容,接下来我们就通过几个实例来一一介绍ROW_NUMBER()函数的使用. 实例如下: 1.使用row_number()函数进行编号,如 select email,customerID, ROW_NUMBER() over(order by psd) a

Sybase数据库常用函数

Sybase数据库常用函数 一.字符串函数 1,ISNULL(EXP1,EXP2,EXP3,...) :返回第一个非空值,用法与COALESCE(exp1,exp2[,exp3...])相同: 2,TRIM(exp) :去除两边空格: 3,DATEFORMAT(date_exp,date_format) :日期型转字符型: 4,STRING(exp):转为字符型: 5,SUBSTRING(exp,int-exp1,[int-exp2]):截取exp从int-exp1开始,截取int-exp2个字

DQL---条件查询、单行函数、多行函数、分组函数、数据类型

一.DQL 1.基本规则: (1)对于日期型数据,做 *,/ 运算不合法,可以进行 +, - 运算.比如给日期加一天或减一个月,结果仍为一个日期.两个日期间只能为减法,返回两个日期相差的天数,两个日期间做加法没任何意义. (2)包含空值(null)的数学表达式计算结果均为空值. (3)给字段取别名时,别名使用 双引号 括起来(根据双引号里的内容显示),不加双引号时会转为大写.字段与别名间可以使用AS关键字,也可使用空格. (4)oracle中连接字符是 || (也可以使用单行函数concat()