几道sql题

xiongyu2006 2012-09-19 04:59:50
1. 创建用户kaifa(密码亦为kaifa),并分配connect,create table,resource权限。

CREATE USER kaifa IDENTIFIED BY kaifa;
GRANT connect,create table,resource TO kaifa;

2. 在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。
概要表(CCB_GYB)信息如下:
ACCOUNTING_DATE DATE 报表日期(唯一索引)
RMB_YTD_BALANCE NUMBER 人民币余额
CNY_YTD_BALANCE NUMBER 本位币余额
USD_YTD_BALANCE NUMBER 外币折美元余额
其中币种代码如下:
--RMB 人民币
--CNY 本位币
--USD 外币折美元
如果币种为RMB,则取出人民币余额作为本期余额;为CNY,则取本位币余额;为USD
则取外币折美元余额。
请编写一个函数GetCurrBal(
qrp_rq IN VARCHAR2, --报表日期
qrp_code IN VARCHAR2 --币种
)
实现此功能,并能在sqlplus里调用。
其中建表语句如下:
create table CCB_GYB
(
ACCOUNTING_DATE DATE,
RMB_YTD_BALANCE NUMBER,
CNY_YTD_BALANCE NUMBER,
USD_YTD_BALANCE NUMBER
);
创建索引:create unique index CCB_GYB_IDX on CCB_GYB (ACCOUNTING_DATE);

3. 假设有张学生成绩表(CJ)如下
[姓名] [学科] [成绩]
张三 语文 80
张三 数学 86
张三 英语 75
李四 语文 78
李四 数学 85
李四 英语 78

现有需求如下:
(1)要求统计分数段的人数。显示结果为:
[成绩] [人数]
0<成绩<60 0
60<成绩<80 0
80<成绩<100 5

(2)要求根据姓名,把各科成绩显示在一条记录里。显示结果如下:
姓名 语文 数学 英语 总成绩
---------- ---------- ---------- ---------- ----------
李四 78 85 78 241
张三 80 86 75 241
总分 158 171 153 482

使用SQL语句或存储过程(显示结果时可用dbms_output打印出来)实现这两个功能。


4. 某一客户表包含如下信息:

INDIVIDUALID 客户ID VARCHAR2(20)(唯一键)
BIRTHDATE 出生日期 Date
GENDER 性别 VARCHAR2(10)
SALARY 月收入 NUMBER(10,2)
CERT-TYPE 证件类型 VARCHAR2(10)
CERT-NO 证件号码 VARCHAR2(20)
CREATED-TS 进入系统的时间 TIMESTAMP
现要把该表数据导出成文件,导出的内容格式如下:
属性列 列长度 备注
INDIVIDUALID 20
BIRTHDATE 8 格式为:yyyymmdd
GENDER 10
SALARY 13
CERT-TYPE 10
CERT-NO 20
CREATED-TS 17 格式为:yyyymmddhh24missff3
要求每个字段列的内容长度是固定的,不足部分由空格补齐,字符串左对齐(右补空格),数字右对齐。如果列的内容为null,需先进行处理,字符串默认为空格,数字默认为0,日期默认为99991231,时间戳默认为99991231000000000。
请编写程序实现该导出功能。


创建表脚本:
create table tb1010(
INDIVIDUALID VARCHAR2(20),
BIRTHDATE date,
GENDER VARCHAR2(10),
SALARY NUMBER(10,2),
CERT_TYPE VARCHAR2(10),
CERT_NO VARCHAR2(20),
CREATED_TS TIMESTAMP
);
5. 某语音电话本表信息如下:
Call_book_info
MOBILE_ID 移动号码 VARCHAR2(12)
CALLIN_TIME 呼入时间 Date
CALLOUT_TIME 呼出时间 Date
STATUS 状态 CHAR(1)

在某次大批量操作后,数据记录达到100万,MOBILE_ID估计有2万个重复,现要求删除重复的号码(只保留一条),因为该表是业务表,删除时不能影响业务的正常使用。编写存储过程实现删除重复号码的功能。
要求如下:
(1) 为保证删除的数据以后可查,在删除时要先做备份,备份不成功则不能进行删除。
(2) 要有日志记录,比如删除所花时间,删除成功了多少条,失败多少条等操作信息。
(3) 如果出现性能问题,要跟踪原因。生成trace文件进行分析,改进程序。

6.阅读下列说明,回答问题1至问题5。
【说明】
  某工厂的信息管理数据库的部分关系模式如下所示:
职工(职工号,姓名,年龄,月工资,部门号,电话,办公室)
部门(部门号,部门名,负责人代码,任职时间)
关系模式的主要属性、含义及约束如表2-1所示,“职工”和“部门”的关系示例分别如表2-2和表2-3所示。
            表2-1主要属性、含义及约束
 
            表2-2 “职工”关系
   
            表2-3“部门”关系   
【问题1】
  根据上述说明,由SQL定义的“职工”和“部门”的关系模式,以及统计各部门的人数C、工资总数Totals、平均工资Averages的D_S视图如下所示,请在空缺处填入正确的内容。(6分)
Create Table 部门(部门号 CHAR(1) (a) ,
       部门名 CHAR(16),
       负责人代码 CHAR(4),
       任职时间 DATE,
       (b) (职工号));
Create Table 职工(职工号 CHAR(4),
       姓名 CHAR(8),
       年龄 NUMDER(3),
       月工资 NUMDER(4),
       部门号 CHAR(1),
       电话 CHAR(8),
       办公室 CHAR(8),
       (a) (职工号),
       (c) (部门号),
        CHECK( (d) ));
Create View D_S(D,C,Totals,Averages) As
       (Select 部门号, (e)
       from 职工
       (f) ;
【问题2】
  对于表2-2、表2-3所示的“职工”和“部门”关系,请指出下列各行是否可以插入,为什么?(3分)          
  (1) 1001 王新军 28 1000 1 8001234 主楼201

  (2) 2003 李 力 28 1000

  (3) 5802 赵晓啸 36 1500 6 8001568 3号楼503

【问题3】
  在问题1定义的视图D_S上,下面哪个查询或更新是允许执行的,为什么?(3分)
  (1) Update D_S set D=3 where D=4;
 
  (2) Delete from D_S where C>4;

  (3) Select D,Averages from D_S
    where C>(Select C from D_S where D=:dept);

  (4) Select D,C from D_S
    where Totals>10000;

  (5) Select * from D_S;
【问题4】
  查询每个部门中月工资最高的“职工号”的SQL查询语句如下:
  Select 职工号 from 职工 E
  Where 月工资=(Select Max(月工资)
     from 职工as M
     where M.部门号=E.部门号)
(1)请用30字以内文字简要说明该查询语句对查询效率的影响。(3分)

(2)对该查询语句进行修改,使它既可以完成相同功能,又可以提高查询效率。(3分)【问题5】
  假定分别在“职工”关系中的“年龄”和“月工资”字段上创建了索引,如下的Select查询语句可能不会促使查询优化器使用索引,从而降低查询效率,请写出既可以完成相同功能又可以提高查询效率的SQL语句(2分)
Select 姓名,年龄,月工资from 职工
where 年龄>45 or 月工资<1000;
...全文
660 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
create or replace function GetCurrBal(qrp_rq   IN VARCHAR2, --报表日期
                                      qrp_code IN VARCHAR2 --币种
                                      ) return number IS
  v_ye NUMBER;

begin

  if qrp_rq is null OR UPPER(qrp_code) NOT IN ('RMB', 'CNY', 'USD') THEN
    return null;
  end if;

  execute immediate 'select ' || upper(qrp_code) ||
                    '_YTD_BALANCE  from CCB_GYB t  WHERE TO_CHAR(T.ACCOUNTING_DATE,''YYYYMMDDHH24MISS'') =' || '''' ||
                    qrp_rq || ''''
    INTO V_YE;
  return(v_ye);
exception when no_data_found then return null;

end GetCurrBal;
xiongyu2006 2012-09-20
  • 打赏
  • 举报
回复

2.
create or replace function GetCurrBal(qrp_rq IN VARCHAR2,qrp_code IN VARCHAR2)
return number
is
Result number;
begin
if qrp_code='RMB' then
begin
select RMB_YTD_BALANCE INTO Result FROM CCB_GYB WHERE ACCOUNTING_DATE=TO_DATE(qrp_rq,'yyyy-mm-dd');
end;
elsif qrp_code='CNY' then
begin
select CNY_YTD_BALANCE INTO Result FROM CCB_GYB WHERE ACCOUNTING_DATE=TO_DATE(qrp_rq,'yyyy-mm-dd');
end;
elsif qrp_code='USD' then
begin
select USD_YTD_BALANCE INTO Result FROM CCB_GYB WHERE ACCOUNTING_DATE=TO_DATE(qrp_rq,'yyyy-mm-dd');
end;
end if;
return(Result);
end GetCurrBal;

xiongyu2006 2012-09-20
  • 打赏
  • 举报
回复
3.

(1).select case when score<60 then '0<score<60'
when score>=60 and score<80 then '60<score<80'
when score>=80 then '80<score<100' end 成绩,
count(score) 人数
from chengji
group by case when score<60 then '0<score<60'
when score>=60 and score<80 then '60<score<80'
when score>=80 then '80<score<100' end;
--如果数据库没有<60的记录,就没有'0<score<60'这一行?
(2).select t.name,t.语文 语文,t.数学 数学,t.英语 英语,t.语文+t.数学+t.英语 总分
from (select name ,sum(decode(course,'语文',score,0)) as 语文,
sum(decode(course,'数学',score,0)) as 数学,
sum(decode(course,'英语',score,0)) as 英语
from chengji
group by name) t
--'总分'这一行怎么加上呢

vanjayhsu 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
太多了,看晕了
[/Quote]

同感。。。LZ难道这些题目一个都不会做么?建议还是自己多实践吧。。。
kingxiaokang 2012-09-20
  • 打赏
  • 举报
回复
看着太累
longai123 2012-09-20
  • 打赏
  • 举报
回复
第5题 语音电话
create or replace procedure fuck
is
v_exists number;
begin
select count(*) into v_exists from user_tables where table_name = 'TEST1';
if v_exists > 0 then
execute immediate 'drop table TEST1';
end if;
execute immediate '
create table test1(
mobile_id varchar2(12),
callin_time date,
callout_time date,
status char(1)
)';
insert into test1(mobile_id,callin_time,callout_time,
status)
select * from Call_book_info;
commit;
delete from Call_book_info where mobile_id
not in (select min(mobile_id) from call_book_info);
end;
sql plus 中输入 exec fuck;
酒比花香 2012-09-20
  • 打赏
  • 举报
回复
3:1)
with aa as(
select '张三' name, '语文' class, 40 score from dual
union
select '张三' name, '数学' class, 86 score from dual
union
select '张三' name, '英语' class, 75 score from dual
union
select '李四' name, '语文' class, 78 score from dual
union
select '李四' name, '数学' class, 85 score from dual
union
select '李四' name, '英语' class, 78 score from dual
)
select count(1),cc from (
select (case
when (score>0 and score<60) then '成绩不及格'
when (score>60 and score<80) then '成绩及格'
when (score>80 and score<100) then '成绩优秀'
end )cc,name,class,score
from aa
) group by cc
2)应该是行转列,现在写的这个有点笨
with aa as(
select '张三' name, '语文' class, 40 score from dual
union
select '张三' name, '数学' class, 86 score from dual
union
select '张三' name, '英语' class, 75 score from dual
union
select '李四' name, '语文' class, 78 score from dual
union
select '李四' name, '数学' class, 85 score from dual
union
select '李四' name, '英语' class, 78 score from dual
)
select aa.name as 姓名,
sum(case class when '语文' then aa.score end)语文,
sum(case class when '数学' then aa.score end)数学,
sum(case class when '英语' then aa.score end)英语,
bb.totalscore
from aa,(
select sum(score) totalscore,name
from aa
group by name
)bb
where aa.name = bb.name
group by aa.name,bb.totalscore

f0restwow 2012-09-20
  • 打赏
  • 举报
回复
楼主这些都是基础题啊
longai123 2012-09-20
  • 打赏
  • 举报
回复
select 姓名,
sum(decode(学科,'语文', 成绩,0)) "语文",
sum(decode(学科,'数学', 成绩,0)) "数学",
sum(decode(学科,'英语', 成绩,0)) "英语",
SUM(成绩),
cast(avg(成绩*1.0) as decimal(18,2)) 平均分
from student
group by 姓名;
SELECT * FROM student s;
longai123 2012-09-20
  • 打赏
  • 举报
回复
不会做啊....
SELECT 成绩,count(case when 成绩>0 and 成绩<60 THEN 1 end) as good,
count(case when 成绩>60 and 成绩<80 THEN 1 end) fuck1,
count(case when 成绩>80 and 成绩<100 THEN 1 end) fuck1 from student group by 成绩;
SELECT * FROM student s;
搞了一个钟没搞出.睡觉;
xiongyu2006 2012-09-19
  • 打赏
  • 举报
回复
毛,这是网上的题目。哪来的大学生啊。我就想找找存储过程的一些实例练习下
ilovemk 2012-09-19
  • 打赏
  • 举报
回复
现在大学生的作业压力很大啊
jdsnhan 2012-09-19
  • 打赏
  • 举报
回复
太多了,看晕了
xiongyu2006 2012-09-19
  • 打赏
  • 举报
回复
哎。存储过程很差啊,楼上帮忙解答解答
fw0124 2012-09-19
  • 打赏
  • 举报
回复
lz要干嘛?考我们么?
BenChiM888 2012-09-19
  • 打赏
  • 举报
回复

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧