/*create table tbemp --职员表
 (
   eid    number(7)    primary key,  --职员编号
   ename  varchar2(20) not null,     --职员姓名
   esex   varchar2(3)  not null check(esex in('男','女')),    
   eage   number       not null check(eage>=18),
   eaddr  varchar2(50) not null,  --职员地址
   etel   varchar2(30) not null,  --职员电话
   eemail varchar2(30)   --职员邮箱
 );
 -------------------------------------
 insert into tbemp (eid,ename,esex,eage,eaddr,etel)
 values(1,'陈飞飞','男',22,'广东省广州市棠德小区6栋808号','020-3434123');
insert into tbemp(eid,ename,esex,eage,eaddr,etel)
 values(2,'杜娟娟','女',23,'广东省广州市上社村1栋2号','020-34345233');
insert into tbemp (eid,ename,esex,eage,eaddr,etel)
 values(3,'刘一刀','男',25,'广东省广州市城市广场606号','020-12344321');
insert into tbemp(eid,ename,esex,eage,eaddr,etel)
 values(4,'张小杰','男',27,'广东省深圳4221工厂','0755-9876543');
insert into tbemp (eid,ename,esex,eage,eaddr,etel)
 values(5,'阿房女','女',23,'河北小桥市青色路87号','0689-5656564');
 ------------------------------
 create table tbprod
 (
   pid    number(7)    primary key,  --商品编号
   ptype  varchar2(20) not null,     --商品类型
   pmark  varchar2(20) not null,     --商品品牌
   pspec  varchar2(30)               --商品规格
 );
 ---------------------------------------
 insert into tbprod values(1,'电视机','创维','48英寸等离子电视机');
 insert into tbprod values(2,'电视机','创维','56英寸数字电视机');
 insert into tbprod values(3,'电视机','创维','32英寸背投');
 insert into tbprod values(4,'电视机','熊猫','48英寸等离子电视机');
 insert into tbprod values(5,'电视机','熊猫','56英寸数字电视机');
insert into tbprod values(6,'电视机','TCL','32英寸背投');
 insert into tbprod values(7,'笔记本','宏基','奔腾双核 T6666');
 insert into tbprod values(8,'笔记本','宏基','酷睿2双核 E7500 ');
 insert into tbprod values(9,'笔记本','联想','奔腾双核 T6666');
 insert into tbprod values(10,'笔记本','联想','酷睿2双核 E7500 ');*/
 /*create table tbsales
 (
   srno       number(7)  primary key,    --记录编号
   eid        number(7)  not null,   --职员编号
   pid        number(7)  not null,    --商品编号
   pqty       number(7)  not null check(pqty>0),    --销售数量
   pamount    number(7)  not null check(pamount>0),   --销售价值
   sdate date      --销售时间
 );
 --------------------------------------------
 insert into tbsales values(1,1,1,10,21000,to_date('2010-3-12','yyyy-mm-dd'));
 insert into tbsales values(2,1,2,5,20000,to_date('2010-3-12','yyyy-mm-dd'));
 insert into tbsales values(3,1,4,12,23500,to_date('2010-3-14','yyyy-mm-dd'));
 insert into tbsales values(4,1,5,4,16500,to_date('2010-3-14','yyyy-mm-dd'));
 insert into tbsales values(5,2,3,3,31000,to_date('2010-3-11','yyyy-mm-dd'));
 insert into tbsales values(6,2,6,4,40000,to_date('2010-3-13','yyyy-mm-dd'));
 insert into tbsales values(7,3,7,5,40000,to_date('2010-3-13','yyyy-mm-dd'));
 insert into tbsales values(8,3,8,3,36000,to_date('2010-3-14','yyyy-mm-dd'));
 insert into tbsales values(9,4,9,6,41500,to_date('2010-3-12','yyyy-mm-dd'));
 insert into tbsales values(10,4,10,5,50000,to_date('2010-3-14','yyyy-mm-dd'));
 insert into tbsales values(11,1,1,10,21000,to_date('2010-4-12','yyyy-mm-dd'));
 insert into tbsales values(12,1,2,5,20000,to_date('2010-4-12','yyyy-mm-dd'));
 insert into tbsales values(13,1,4,12,23500,to_date('2010-4-14','yyyy-mm-dd'));
 insert into tbsales values(14,1,5,4,16500,to_date('2010-4-14','yyyy-mm-dd'));
 insert into tbsales values(15,2,3,3,31000,to_date('2010-4-11','yyyy-mm-dd'));
 insert into tbsales values(16,2,6,4,40000,to_date('2010-4-13','yyyy-mm-dd'));
 insert into tbsales values(17,3,7,5,40000,to_date('2010-4-13','yyyy-mm-dd'));
 insert into tbsales values(18,3,8,3,36000,to_date('2010-4-14','yyyy-mm-dd'));
 insert into tbsales values(19,4,9,6,41500,to_date('2010-4-12','yyyy-mm-dd'));
 insert into tbsales values(20,4,10,5,50000,to_date('2010-4-14','yyyy-mm-dd'));*/
 select * from tbemp;
 select * from tbprod;
 select * from tbsales;
 --1.查询24到26岁的职员的姓名,性别:
 select ename,esex from tbemp where eage between 24 and 26;
--2.查询家住广州的女职员的姓名,电话,地址:
 select ename,etel,eaddr from tbemp where esex = '女' and eaddr like '%广州市%';
--3.查询'陈飞飞','阿房女','张小杰'的电话,地址:
 select etel,eaddr from tbemp where ename in ('陈飞飞','阿房女','张小杰');
--4.查询广州和深圳的职员的姓名,性别,年龄:
 select ename,esex,eage from tbemp where eaddr like '%广州%'or ename like '%深圳%';
--5.查询所有职员,所有商品的销售情况,包括:职员姓名,商品类别,商品品牌,商品规格,销售数量,销售价值,销售时间,按销售时间从高到低排列
 select e.ename,p.ptype,p.pmark,p.pspec,s.pqty,s.pamount,s.sdate from tbsales s left join tbprod p
 on s.pid = p.pid left join tbemp e on e.eid = s.eid order by s.sdate desc ;
 --6.查询笔记本4月份的销售情况。包括:商品编号、商品品牌、商品规格、销售数量、销售价值,按销售数量从低到高排列
 select p.pid,p.pmark,p.pspec,s.pqty, s.pamount,s.sdate from
 tbprod p join tbsales s on p.pid = s.pid 
 where p.ptype = '笔记本' and extract(month from s.sdate) = 4 order by s.pqty;
--7.查询陈飞飞3月份的销售情况,包括:商品编号、销售数量、销售价值
 select p.pid,s.pqty,s.pamount from tbemp e join tbsales s on e.eid = s.eid
 join tbprod p on p.pid = s.pid where e.ename = '陈飞飞' and extract(month from s.sdate) = 3;
--8.查询创维56英寸数字电视机的销售情况。包括:销售数量、销售价值、销售时间
 select s.pqty,s.pamount,s.sdate from tbsales s 
 join tbprod p on p.pid = s.pid where p.pspec = '56英寸数字电视机' and p.pmark = '创维';
--9.查询广州男职员4月份的销售情况。包括:职员姓名、商品类别、商品品牌、商品规格、销售数量、销售价值
 select e.ename,p.ptype,p.pmark,p.pspec,s.pqty,s.pamount from 
 tbemp e join tbsales s on e.eid = s.eid
 join tbprod p on p.pid = s.pid
 where e.esex = '男' and eaddr like '%广州市%' and extract(month from s.sdate) = 4;
--10.总共有多少个职员?
 select count(*) from tbemp;
--11.创维电视机被销售了多少次?(即总共有几条销售记录)
 select count(*) from tbsales s 
 join tbprod p on p.pid = s.pid where p.ptype = '电视机' and p.pmark = '创维'
--12.查询笔记本单笔销售价值最高的单笔销售价格:
 select max(s.pamount/s.pqty) from tbsales s 
 join tbprod p on p.pid = s.pid where p.ptype = '笔记本' 
--13.查询TCL电视机的平均销售价格:
 select distinct s.pamount/s.pqty from tbsales s 
 join tbprod p on p.pid = s.pid where p.ptype = '电视机' and p.pmark = 'TCL'
--14.查询联想笔记本4月份的销售总额:
 select  sum(s.pamount) from tbsales s 
 join tbprod p on p.pid = s.pid where p.ptype = '笔记本'
 and p.pmark = '联想' and extract(month from s.sdate) = 4
--15.按类型、品牌统计商品的销售总数量:(销售总数量低于20的不统计)
 select p.ptype,p.pmark,sum(s.pqty) from tbsales s 
 join tbprod p on p.pid = s.pid group by p.ptype,p.pmark
 having sum(s.pqty)>=20;
--16.按品牌、规格统计笔记本的平均销售价格:(按销售价格从高到低的顺序显示)
 select distinct p.pmark,p.pspec,s.pamount/s.pqty from tbsales s 
 join tbprod p on p.pid = s.pid where p.ptype = '笔记本'
 order by s.pamount/s.pqty desc;
--17.按姓名统计男职员3月份的销售总额:销售总额低于80000的不统计
 select e.ename,sum(s.pamount) from tbemp e join tbsales s on e.eid = s.eid
 join tbprod p on p.pid = s.pid where e.esex = '男'-
 and extract(month from s.sdate) = 3 
 group by e.ename having sum(s.pamount) >= 80000
--18.找出销售总额最高的前三名职员的姓名:
 select t.*,rownum from
 (select e.ename,sum(s.pamount) amount from tbemp e join tbsales s on e.eid = s.eid
 join tbprod p on p.pid = s.pid group by e.ename order by amount desc) t
 where rownum < 4;
--19.按姓名统计每个职员一共完成了多少笔销售业务:
 select e.ename,sum(s.pqty) pqty from tbemp e join tbsales s on e.eid = s.eid
 join tbprod p on p.pid = s.pid group by e.ename;
--20.找出完成销售业务笔数最少的职员的姓名和他完成的业务数:
 with t as
 (select e.ename,sum(s.pqty) pqty from tbemp e join tbsales s on e.eid = s.eid
 join tbprod p on p.pid = s.pid group by e.ename)
 select * from t where t.pqty = (select min(pqty) from t)
 -----------------------------------------------------------------------------
select * from dept_bak;
insert into dept_bak values(50,'科技','北京');
 insert into dept_bak values(60,'财务','上海');
 savepoint a;
 update dept_bak set loc='北京' where deptno=40;
 savepoint b;
 insert into dept_bak values(70,'组织','广州');
 --在该事务提交之前,可以执行rollback 命令全部或部分回滚事务中的操作。语句为: 
 rollback to b;--(回滚最后一个insert 操作)
 rollback to a;--(回滚后面的 insert 操作和 update操作)
 rollback;--(回滚全部操作)
 -----------------------------------------------------------------------------
/*CREATE TABLE F216(numb number);
 insert into f216 values (1);
 insert into f216 values (2);
 insert into f216 values (3);
 insert into f216 values (4);
 insert into f216 values (5);
 insert into f216 values (6);
 insert into f216 values (7);
 insert into f216 values (8);
 insert into f216 values (9);*/
--求出每三个或两个不同数相加的和等于10,该如何求解,有多少个解:
 select * from f216;
 select
 ((select count(*) from(
 select distinct (f1.numb * f2.numb*f3.numb) a from f216 f1 join f216 f2 on f1.numb != f2.numb 
 join f216 f3 on f2.numb !=f3.numb where f1.numb!=f3.numb and f1.numb+f2.numb+f3.numb = 10))
 +
 (select count(*) from(
 select distinct abs(f1.numb - f2.numb) from f216 f1 join f216 f2 on f1.numb != f2.numb 
 where f1.numb+f2.numb = 10 )) ) from dual;
 select 
 (select sum(decode(f1.numb+f2.numb,10,1,0))/2 from f216 f1,f216 f2 where f1.numb != f2.numb)
 +
 (select sum(decode(f1.numb+f2.numb+f3.numb,10,1,0)) from f216 f1,f216 f2 ,f216 f3 
 where f1.numb != f2.numb and f2.numb!= f3.numb and f1.numb != f3.numb and f1.numb>f2.numb and f2.numb>f3.numb )
 from dual;
--最优解
 select
 (select count(*) from F216 f1 
 join F216 f2 on f1.numb>f2.numb
 where f1.numb+f2.numb=10 )
 +
 (select count(*) from F216 f1 
 join F216 f2 on f1.numb>f2.numb
 join F216 f3 on f2.numb>f3.numb
 where f1.numb+f2.numb+f3.numb=10)
 from dual;
delete from emp_bak;
 update dept_bak set loc = '潍坊';
 select * from v$lock;
-------------------检查Oracle数据库是否存在死锁-------------------
 SELECT l.session_id sid
   ,s.serial#
   ,l.locked_mode 锁模式
   ,s.status 会话状态
   ,o.object_name 被锁对象名
   ,l.oracle_username 登录用户
   ,l.os_user_name 机器用户名
   ,s.machine 机器名
   ,s.terminal 终端用户名
   ,s.logon_time 登录数据库时间
 FROM v$locked_object l,all_objects o,v$session s
 WHERE l.object_id = o.object_id
 AND l.session_id = s.sid
 ORDER BY sid,s.serial#;
------------------------杀死用户----------------------
 alter system kill session '35,3453';
 ----------------------查看sql执行时间----------------------------
 select *
 from(
   select
     sa.SQL_TEXT "执行 SQL",
     sa.EXECUTIONS "执行次数",
     round(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",
     round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) "平均执行时间",
     sa.COMMAND_TYPE,
     sa.PARSING_USER_ID "用户ID",
     u.username "用户名",
     sa.HASH_VALUE
   from v$sqlarea sa
   left join all_users u
   on sa.PARSING_USER_ID = u.user_id
   where sa.EXECUTIONS > 0
   order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc)
 where rownum <= 50;
 ------------------------------------------------------------------------
 /*CREATE TABLE f16(
 xd_time date
 ,user_name varchar2(10));
 insert into f16 values (to_date('20170101 22:01:23','yyyyMMdd hh24:mi:ss'),'张三');
 insert into f16 values (to_date('20170102 14:20:02','yyyyMMdd hh24:mi:ss'),'张三');
 insert into f16 values (to_date('20170102 23:13:55','yyyyMMdd hh24:mi:ss'),'李四');
 insert into f16 values (to_date('20170102 23:51:20','yyyyMMdd hh24:mi:ss'),'李四');
 insert into f16 values (to_date('20170103 23:07:15','yyyyMMdd hh24:mi:ss'),'李四');*/
select * from f16;
 --7.根据如下订单表,按购买时间统计出每天的新客人数和老客人数:
 /*
 名词定义如下:
 新客:当天有购买,且之前没有购买的人为新客,新客人数+1;
 老客:当天有购买,且之前也有购买的人为老客,老客人数+1;
 此题的考察点有窗口函数的使用以及case when的语法:
 */
 select distinct t."date",sum(t.新客人数)over(partition by t."date" order by 新客人数) 新客人数,
 sum(t.旧客人数)over(partition by t."date" order by 旧客人数) 旧客人数
 from(select to_char(xd_time,'yyyy-MM-dd') as "date",decode(times,1,1,0) 新客人数,
 case when times>1 then 1 else 0 end 旧客人数
 from(select xd_time,user_name,row_number()over(partition by user_name order by xd_time) times from f16 ) )t order by t."date";