Oracle语法 及 SQL题目

课例复制

OCM (Oracle Certified Master)

1.你所做的任何操作,都会在数据字典中被记录。
2.你所不理解的任何ORACLE的咨询都可以在文档找到资料。

清屏命令
clear screen
clear scr
cle scr
(只要书写三个字母即可)
只写clean也是可以的

若是删除表格,需要先删除从表,解除依赖,再删除主表

create table g_cardapply(
       apply_no varchar2(8),
       apply_date date not null,
       state varchar2(2) not null,
       constraint PK_APPLY_NO PRIMARY KEY (apply_no)
    );
--  创建工卡申请明细表,apply_no即是主键又是外键,我们称为主外键重合,是一种经典的一对一设计方案 
 create table g_cardapplydetail(
      apply_no varchar2(8) ,
      apply_name varchar2(30) not null,
      idcard char(18) not null,
      state varchar2(2) not null,
      constraint PK_APPLY_DETAIL_NO PRIMARY KEY (apply_no),
      constraint FK_CARDAPPLY_DETAIL foreign key (apply_no) references g_cardapply(apply_no)
    );
    
-- oracle字符串转日期,必须使用to_date函数,然后做好日期格式的适配
insert into g_cardapply values('00000010',to_date('2011-11-12','yyyy-mm-dd'),'01');
insert into g_cardapply values('00000011',to_date('2011-11-13','yyyy-mm-dd'),'01');
insert into g_cardapply values('00000012',to_date( '2011-11-14','yyyy-mm-dd'),'02');
insert into g_cardapply values('00000013',to_date('2011-11-15','yyyy-mm-dd'),'03');
insert into g_cardapply values('00000014',to_date('2011-11-16','yyyy-mm-dd'),'03');
insert into g_cardapplydetail values('00000010','mary', '440401430103082','01');
insert into g_cardapplydetail values('00000011','david ', '440401430103083','01');
insert into g_cardapplydetail values('00000012','mary', '440401430103082','02');
insert into g_cardapplydetail values('00000013','mike ', '440401430103084','03');
insert into g_cardapplydetail values('00000014','mary', '440401430103082','03');
commit;

模糊查询

delete from g_cardapplydetail where apply_name like 'm%';

子查询

update g_cardapply
    set state='07'
    where apply_no in
    (
      select apply_no
      from g_cardapplydetail
      where idcard='440401430103082'
    );

内关联

select apply_date
    from g_cardapply a inner join g_cardapplydetail b
    on a.apply_no=b.apply_no and b.idcard='440401430103082';

事务回滚

rollback;

事务提交

commit;

SQL思考题

思考题一

有一个工厂,非常繁忙,同时在进行多个订单的生产任务。。

每个订单都有自己的订单编号(WORKORDER_ ID),每个订单要生产的物品要拆分成多个工序,这些工序并行进行,每个工序都有自己的编号STEP_ NBR,测试数据如下:

C-完成 W-等待

请编写SQL语句,找出STEP_ NBR=0,其 STEP STATUS='C',同时本订单其它工序STEP_ STATUS均为W的订单,比如对以上数据的分析结果就是:。

WORKORDER ID↓

ww023

要求:至少实现2种写法(多写更好),语句越短越好。。

-- 条件1: 
where step_nbr=0 and step_status='c'
-- 条件2:
‘W’= ALL (select step_status from XXX where step_nbr> = 1)

select workorder_id from projects p 
where p.step_nbr=0 and p.step_status='C' .
and 'W'= ALL (select step_status from projects where step _nbr>=1 and workorder_ld=p.workorder_id)·.

select workorder_id,sum(step_nbr)
from projects
where step_status='C' group by workorder_id
having sum(step_nbr)=0;.
-- 建表语句
create table projects(
    workorder_id varchar2(10) not null,
    step_nbr int not null,
    step_status char(1) not null,
    constraint PK_PROJECTS PRIMARY KEY (workorder_id,step_nbr)
    );
insert into projects values('ww023',0,'C');
insert into projects values('ww023',1,'W');
insert into projects values('ww023',2,'W');
insert into projects values('ww024',0,'W');
insert into projects values('ww024',1,'W');
insert into projects values('ww025',0,'C');
insert into projects values('ww025',1,'C');.

思考题二

Northwind商贸公司,业务日益发展,公司OA系统正不断推出新版本以紧跟公司的发展.

在OA系统中,有一员工角色表,情况如下:

数据:
EMP_NAME EMP_ROLE


陈城 W
刘海 D
刘海 O
田亮 O
王晓刚 D
张玲 S
张天明 D
张天明 O

其中: W – 搬运工人 D – 主任 O – 高级职员 S – 秘书

OA开发组的SQL程序员张明得到了上级的一个任务:
领导要求得到的高级职员信息表如下:
EMP_NAME COMBINE_ROLE


刘海 B
田亮 O
王晓刚 D
张天明 B

要求:
1)只列出主任和高级职员的信息
2)如果即是高级职员又是主任,用B表示其角色, 其它信息不用再显示 (只一条记录)。

你能不能用单条SQL语句帮助张明实现这个查询?

-- 建表语句
create table roles(
  emp_name varchar2(20) not null,
  emp_role char(1) not null,
  constraint pk_roles primary key(emp_name,emp_role)
 );
insert into roles values('mary','W');
insert into roles values('david','D');
insert into roles values('david','O');
insert into roles values('henry','O');
insert into roles values('cherry','D');
insert into roles values('sally','S');
insert into roles values('tom','D');
insert into roles values('tom','O');

-- 解决方法一
select emp_name,
case when count(*)=1
then max(emp_role)
else 'B'
end 
as emp_role
from roles
where emp_role in ('D','O')
group by emp_name;

-- 解决方法二
select emp_name,
substr('DOB',sum(instr('DO',emp_role)),l) combine_role    from roles
where emp_role in ('D','O')group by emp_name;

思考题三

最近,经过你的努力,你得到了一份工作,成为了百货公司的一位经理。 到位后,你发现你的销售数据库中有两张表,一个是商店促销时间的日历,另一个是在促销期间的销售额列表。你需要编写一个查询,告诉我们在每次促销中哪位职员的销售额最高,这样可以给那个职员发绩效奖金。

--商店促销时间的日历

create table promotions (
     promo_name varchar2(50) not null primary key,  -- 促销活动名称
     start_date date not null,                     -- 开始时间
     end_date date not null,                      -- 终止时间
     check(start_date<=end_date)
 );
 insert into promotions values('spring sales',to_date('2009-2-1','yyyy/mm/dd'),to_date('2009-2-15','yyyy/mm/dd'));
insert into promotions values('worker sale',to_date('2009-5-1','yyyy/mm/dd'),to_date('2009-5-4','yyyy/mm/dd'));
insert into promotions values('children sale',to_date('2009-6-1','yyyy/mm/dd'),to_date('2009-6-1','yyyy/mm/dd'));
insert into promotions values('national day sale',to_date('2009-10-1','yyyy/mm/dd'),to_date('2009-10-7','yyyy/mm/dd'));

---促销期间的销售额表 (注意:该表只是保存促销期间的销售额)

 create table sales
 (
     ticket_nbr int not null primary key,  --销售票据编号 (自增)
     clerk_name varchar2(20) not null,      --销售员姓名
     sale_date date not null,                 --销售日期
     sale_amount number(9,2) not null       --销售金额
 );

create sequence seq_nbr;

insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-1','yyyy/mm/dd'),30);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-1','yyyy/mm/dd'),73);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-1','yyyy/mm/dd'),110);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-2','yyyy/mm/dd'),190);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-2','yyyy/mm/dd'),30);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-2','yyyy/mm/dd'),92);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-3','yyyy/mm/dd'),130);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-3','yyyy/mm/dd'),90);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-3','yyyy/mm/dd'),110);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-4','yyyy/mm/dd'),70);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-4','yyyy/mm/dd'),9);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-5','yyyy/mm/dd'),88);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-5','yyyy/mm/dd'),70);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-13','yyyy/mm/dd'),50);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-13','yyyy/mm/dd'),170);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-14','yyyy/mm/dd'),270);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-15','yyyy/mm/dd'),67.5);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-5-1','yyyy/mm/dd'),280.5);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-5-1','yyyy/mm/dd'),190);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-5-1','yyyy/mm/dd'),113);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-5-2','yyyy/mm/dd'),88);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-5-2','yyyy/mm/dd'),35.5); 
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-5-2','yyyy/mm/dd'),125);
insert into sales values(seq_nbr.nextval,'david',  to_date('2009-5-3','yyyy/mm/dd'),92);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-5-3','yyyy/mm/dd'),93);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-5-3','yyyy/mm/dd'),167);
insert into sales values(seq_nbr.nextval,'david',  to_date('2009-5-4','yyyy/mm/dd'),123.5);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-5-4','yyyy/mm/dd'),200);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-5-4','yyyy/mm/dd'),2);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-6-1','yyyy/mm/dd'),190);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-6-1','yyyy/mm/dd'),110.5);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-6-1','yyyy/mm/dd'),213);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-10-1','yyyy/mm/dd'),1123);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-10-1','yyyy/mm/dd'),780);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-10-1','yyyy/mm/dd'),310);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-10-2','yyyy/mm/dd'),139);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-10-2','yyyy/mm/dd'),1110.5);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-10-2','yyyy/mm/dd'),998);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-10-3','yyyy/mm/dd'),120);
insert into sales values(seq_nbr.nextval,'mary',to_date('2009-10-4','yyyy/mm/dd'),10);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-10-4','yyyy/mm/dd'),234);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-10-5','yyyy/mm/dd'),110.5);
insert into sales values(seq_nbr.nextval,'tom',to_date('2009-10-6','yyyy/mm/dd'),23);
insert into sales values(seq_nbr.nextval,'david',to_date('2009-10-7','yyyy/mm/dd'),10.5); 

找出在各次促销活动中,销售量最高的销售员。

请编制一条SQL来完成这个查询。(尽量考虑多种写法)

解题思路

select p.promo_name,s.clerk_name,sum(s.sale_amount) top_sale
    from promotions p inner join sales s
    on s.sale_date between p.start_date and p.end_date
    group by p.promo_name,s.clerk_name,p.start_date,p.end_date
    having sum(s.sale_amount) > all(
       select sum(s2.sale_amount)
       from sales s2
       where s.clerk_name <> s2.clerk_name and s2.sale_date between p.start_date and p.end_date
       group by s2.clerk_name
   );
   
SELECT s1.clerk_name,p.promo_name,p.start_date,p.end_date,SUM(s1.sale_amount)
    FROM sales s1
    INNER JOIN promotions p
    ON s1.sale_date BETWEEN p.start_date AND p.end_date
    group by s1.clerk_name,p.promo_name,p.start_date,p.end_date
    HAVING SUM(s1.sale_amount)>= ALL 
    (
        SELECT SUM(s2.sale_amount)
            FROM sales s2
            WHERE s2.sale_date BETWEEN p.start_date AND p.end_date
            GROUP BY s2.clerk_name
    );

思考题四

财务咨询顾问的收入统计问题

金太阳财务咨询服务公司,聘请了一些财务顾问提供财务操作咨询服务,这些顾问都以兼职形式为公司服务,公司将按小时为顾问工作计算薪酬。

具体表信息如下:

a. 顾问信息表 (consultant)

create table consultant(
    cst_id   int         primary key,
    cst_name varchar2(30) not null
);
insert into consultant values(1, 'david');
insert into consultant values(2, 'henry');
insert into consultant values(3, 'mary');
insert into consultant values(4, 'kent');

b. 顾问费率表 (billings)

不同级别的顾问,在不同的时期,每小时的收费是不同的,公司会根据情况上调或者下调顾问的小时佣金待遇。

create table billings(
    cst_id int not null,
    bill_date date not null,
    bill_rate int not null,
    constraint PK_BILLING PRIMARY KEY(cst_id,bill_date),
    constraint FK_BILLING_EMP FOREIGN KEY (cst_id) references consultant(cst_id)
);
insert into billings values(1, to_date('2010-1-1' ,'yyyy/mm/dd'),50);
insert into billings values(2, to_date('2010-1-1' ,'yyyy/mm/dd'),60);
insert into billings values(3, to_date('2010-1-1' ,'yyyy/mm/dd'),70);
insert into billings values(4, to_date('2010-1-1' ,'yyyy/mm/dd'),40);
insert into billings values(1, to_date('2011-1-1' ,'yyyy/mm/dd'),60);
insert into billings values(4, to_date('2011-1-1' ,'yyyy/mm/dd'),45);

c. 顾问工作情况记录表 (hoursworked)

create table hoursworked(
     list_id int primary key, 
     cst_id int not null,
     work_date date not null,
     bill_hrs  decimal(5,2) not null,
     constraint FK_HW_EMP FOREIGN KEY (cst_id) references consultant(cst_id)
   );
insert into hoursworked values(1,1, to_date('2010-7-1','yyyy/mm/dd'),3);
insert into hoursworked values(2,1, to_date('2010-8-1','yyyy/mm/dd'),5);
insert into hoursworked values(3,2, to_date('2010-7-1','yyyy/mm/dd'),2);
insert into hoursworked values(4,1, to_date('2011-7-1','yyyy/mm/dd'),4);
insert into hoursworked values(5,3, to_date('2011-8-1','yyyy/mm/dd'),3.5);
insert into hoursworked values(6,4, to_date('2010-9-1','yyyy/mm/dd'),10);
insert into hoursworked values(7,4, to_date('2011-8-1','yyyy/mm/dd'),6);

求解:

我们需要你编写一个SQL查询语句,显示顾问的名字以及其总的顾问费用。

select c.cst_id,e.cst_name,sum(d.bill_rate*c.bill_hrs) total_fee
    from
    (
     select a.cst_id,a.work_date,max(b.bill_date) bill_date, a.bill_hrs
     from billings b inner join hoursworked a
     on a.cst_id=b.cst_id and a.work_date>=b.bill_date
     group by a.cst_id,a.work_date,a.bill_hrs
    )c,billings d,consultant e
    where c.cst_id=d.cst_id and c.bill_date=d.bill_date and c.cst_id=e.cst_id
   group by c.cst_id,e.cst_name
   order by c.cst_id
   ;

笔记

instr('DO',emp_ role)

表示emp_ role变量在'DO'中出现的位置,比如emp_ role是'D',则返回值为1;若emp_ role是'D'和'O',则返回为3,是1+2;

substr('DOB' , sum(instr('DO',emp_ role)),l)

通过返回值的位置取一个字符

substr('DOB' , sum(instr('DO','DO')),l)

取得是B

substr('DOB' , sum(instr('DO','D')),l)

取得是D

substr('DOB' , sum(instr('DO','O')),l)

取得是O

猜你喜欢

转载自www.cnblogs.com/mumuyinxin/p/10787579.html
今日推荐