递归查询+随机抽取数据+grouping rollup cube

本文详细介绍了SQL中的递归查询、数据抽样及统计分析方法,包括使用START WITH和CONNECT BY查找员工的上下级关系,利用dbms_random进行随机数据选择,以及GROUP BY子句的各种应用如ROLLUP、CUBE和GROUPING SETS。此外,还讲解了MERGE语句在数据更新和插入中的应用,展示了如何根据条件更新或插入员工奖金。
摘要由CSDN通过智能技术生成

1.递归查询
查询smith有哪些下级
SELECT ename FROM emp
START WITH ename=‘SMITH’ --从谁开始查(当前节点)
CONNECT BY PRIOR empno=mgr --查询的方式是从上往下,还是从下往上
PRIOR 修饰下级当前节点向下找, 修饰上级从当前节点往上找

查询smith有哪些领导
SELECT ename FROM emp
START WITH ename=‘SMITH’ --从谁开始查
CONNECT BY empno=PRIOR mgr --查询的方式是从上往下,还是从下往上

显示等级
SELECT LEVEL ,ename FROM emp
WHERE LEVEL=2
START WITH ename=‘KING’ --从谁开始查
CONNECT BY PRIOR empno= mgr

2.随机抽取n条数据
固定抽取前十条数据
SELECT * FROM emp WHERE ROWNUM <=10

随机抽取 dbsm_random.random()
dbms_random是一个存储过程, random() 代表是存储过程的一个方法
SELECT * FROM (SELECT * FROM emp ORDER BY dbms_random.random())
WHERE ROWNUM<=10

生成一个1-10的随机小数
SELECT dbms_random.value(1,10) FROM dual
生成一个1-10随机整数
SELECT TRUNC (dbms_random.value(1,10)) FROM dual

统计, 每个部门有多少人, 每个部门每个工种有多少人
UNION ,列的数量一致,类型一致,名称一致

SELECT deptno,NULL AS job, COUNT(1) FROM emp GROUP BY deptno
UNION
SELECT deptno,job,COUNT(1) FROM emp GROUP BY deptno,job

3.ROLLUP,CUBE ,GROUPING SET
SELECT deptno,job,COUNT(1) FROM emp
GROUP BY ROLLUP(deptno,job)
ROLLUP(A,B,C)—从右往左依次分组
GROUP BY abc
GROUP BY ab
GROUP BY a

SELECT deptno,job,COUNT(1) FROM emp
GROUP BY ROLLUP(job,(deptno,ename))
带括号的分组,括号内为一组不可分割
job, (deptno,ename)
job

各种组合分组
SELECT deptno,job,ename,COUNT(1) FROM emp
GROUP BY CUBE(deptno,job,ename)

GROUPING SETS 按照单列汇总,没有总汇总
SELECT deptno,job,COUNT(1) FROM emp
GROUP BY GROUPING SETS(deptno,job)

deptno
job

MERGE 用一个结果集去更新另一张表
MERGE INTO 目标表 别名
USING (sql) 别名
ON(条件)
WHEN MATCHED THEN
UPDATE
DELETE
WHEN NOT MATCHED THEN
INSERT
更新bonus表,如果bonus中没有该员工信息,则插入员工信息并给该员工添加奖金,奖金为工资的10%,
如果已有该员工信息,则将奖金更新为工资的10%
MERGE INTO bonus b
USING (SELECT * FROM emp) e
ON(b.ename=e.ename)
WHEN MATCHED THEN
UPDATE SET b.comm=e.sal0.2
WHEN NOT MATCHED THEN
INSERT (ename,job,sal,comm)
VALUES(e.ename,e.job,e.sal,e.sal
0.1);
(WHERE e.sal>3000);–只改工资高于3000的员工奖金

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值