乐科测试 www.leketest.com
版权所有, 联系作者:qq2293913554
数据库:
1 delete、drop、truncate 的区别?delete:删除某条记录;
drop:删除表或者某列;truncate 清空表的内容。
delete:会发起事务,可以有 where 过滤条件(即删除指定的数据,列名不变),属于 dml 语句,
删除效率比 truncate 低
drop:属于 DDL 语句,删除表,删除列
truncate:不会发起事务,不能有 where 过滤条件(即默认删除表中所有的数据,列名不变),
属于 ddl 语句,删除效率比 delete 高,但有危险性
2 什么是视图,有什么特点,表和视图的区别
答:视图指的是为了方便调用而记录的一条 select 语句。他只是记录了一条 select 语句。
特点:占内存小,只有执行时才有数据,不能增删改,只能查询。
区别:1 表一直有数据,视图只有执行才有数据
2 表可以进行增删查改,而视图只能查询
3 普通索引和唯一索引有什么区别,索引有什么作用
区别:唯一索引,不允许具有索引值相同的行。
索引的作用:提升查询数据的效率,相当于表的一个附表,通常有一个索引列。
4 外连接有哪些?有什么特点
答:外连接分为左连接和右连接,左连接指左表为主表,显示左表的每一行,右连接反之。
5 什么是事务?
通俗理解就是做一件事情的过程,事务封装了一条 dml、或者多条 dml 语句。
这个过程有两种结果:要么全部成功、要么全部失败。
事务的四个特点:原子性,一致性,持久性,隔离性。
1
6 plsql 是什么?
乐科测试 www.leketest.com
版权所有, 联系作者:qq2293913554
plsql 是专用于 Oracle 服务器,在 SQL 基础之上,添加了一些过程化控制语句,叫 PLSQL。
plsql 强调过程,主要有判断,循环语句。
7 定义一个存储过程,比如传入某个值 n,计算从 1 到 n 的和。
create or replace procedure qiuhe(n number) as
i number(20) :=0;
j number(20) :=0;
begin
loop
exit when i>n;
j:=j+i;
i:=i+1;
end loop;
dbms_output.put_line('1 到'||n||'的和:'||j);
end;
--调用方式1
declare
m number;
begin
m:=&q;--&符号表示从键盘取值,后面的变量任意。
qiuhe(m);
end;
8 有学生各科成绩表:table1
2
乐科测试 www.leketest.com
版权所有, 联系作者:qq2293913554
8.1 写出对 table1 表中的记录进行增删改查的 sql,where 条件可自定义:
新增:
insert into table1 values ('张三','英语',100);
删除:
delete from table1 where xingming='张三';
修改:
update table1 set fenshu=100 where xingming='张三' and
kecheng='数学';
查询:
select * from table1 where xingming='张三';
8.2 查询分数都大于或者等于 80 的学生
select t.xingming
from table1 t
group by t.xingming
having min(t.fenshu)>=80;
或
select t.xingming
from table1 t
where t.fenshu>=80
group by t.xingming
having sum(t.fenshu)>=240;
8.3 查询平均分大于 80 的学生
select t.xingming
3
乐科测试 www.leketest.com
版权所有, 联系作者:qq2293913554
from table1 t
group by t.xingming
having avg(t.fenshu)>80;
8.4 假如 80 分及格,请写出一条 sql 展示下图的结果:
select t.*,decode(sign(t.fenshu-80),0,'及格',1,'及格',-1,'
不及格') 是否及格 from table1 t;
或者
select t.*,
case
when t.fenshu>=80 then '及格'
else '不及格'
end 是否及格
from table1 t;
8.5 表二结构如下,请写一条 sql 把表 1 的数据拷贝到表 2
insert into table2
(select t.xingming,t.kecheng,
decode(sign(t.fenshu-80),0,'及格',1,'及格',-1,'不及格') 是否及格
4
from table1 t);
乐科测试 www.leketest.com
版权所有, 联系作者:qq2293913554
9 把这样的图 1 学生表 xs 用一条 SQL 语句查询得到图 2 的效果。
(分别用 decode 和 case when then 做出来)
图 1: 学生表 xs
图 2:
解题思路:利用 decode 临时增加列名,并且对 decode 别名,同时利用子查询。
--decode 函数的高级运用的建表语句
--创建xs 学生表
create table xs(
xno varchar2(3) ,
name varchar2(10),
course varchar2(10),
score number(5,2)
)
--插入数据
insert into xs values ('01','张三','数学','80');
insert into xs values('01','张三','语文','81');
insert into xs values('01','张三','英语','88');
insert into xs values('02','王五','数学','70');
5
乐科测试 www.leketest.com
版权所有, 联系作者:qq2293913554
insert into xs values('02','王五','语文','90');
insert into xs values('02','王五','英语','77');
commit;
select x.* from xs x;
答案如下:
--用decode 实现
select x1.xno,x1.name,
sum(x1.shuxue) shuxue,
sum(x1.yuwen) yuwen,
sum(x1.yingyu) yingyu
from
(select x.xno,x.name,
decode(x.course,'数学',x.score) shuxue,
decode(x.course,'语文',x.score) yuwen,
decode(x.course,'英语',x.score) yingyu
from xs x) x1
group by x1.xno,x1.name;
--用case when then 实现
select x1.xno,x1.name,
sum(x1.shuxue) shuxue,
sum(x1.yuwen) yuwen,
sum(x1.yingyu) yingyu
from (select x.xno,x.name,
case x.course
when '数学' then x.score
end shuxue,
case x.course
when '语文' then x.score
end yuwen,
case x.course
when '英语' then x.score
end yingyu
from xs x) x1
group by x1.xno,x1.name;
6
--drop table xs;
乐科测试 www.leketest.com
版权所有, 联系作者:qq2293913554
10 有 3 个表 S,C,SC:
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)
问题:
1 找出没选过“黎明”老师的所有学生姓名。(分别使用嵌套和非嵌套 2 种方式)
select sname from s where sno not in
(select sno from sc where cno in (select cno from c where cteacher='黎明'))
或 select S.SNAME from S,C,SC
where C.CNO=SC.CNO and SC.SNO=S.SNO and C.CTEACHER !='黎明'
2 列出 2 门以上(含 2 门)不及格学生姓名及平均成绩。
select S.SNAME,avg(SC.SCGRADE) from S,SC
where S.SNO=SC.SNO and SC.SCGRADE<60 group by S.SNO,S.SNAME having count(1)>=2;
或者
select s.sname, t.pj from s inner join
(select sno, avg(scgrade) pj from sc
where scgrade < 60 group by sno having count(*) >= 2) t on s.sno = t.sno;
3 即学过 1 号课程又学过 2 号课所有学生的姓名。
select S.SNAME from S
where S.SNO in
(select a.SNO from SC a,SC b where a.SNO=b.SNO and a.CNO=1 and b.CNO=2);
或 select sname from s where
and
sno in (select sno from sc where cno = 1)
sno in (select sno from sc where cno = 2)
7
乐科测试 www.leketest.com
版权所有, 联系作者:qq2293913554
11 有以下三张表 S,SC,C
学生表 S(S#,SNAME,AGE,SEX),其属性表示学生的学号,姓名,年纪,性别;
成绩表 SC(S#,C#,GRADE),其属性表示学号,课程号,成绩;
课程表 C(C#,CNAME,TEACHER),其属性表示课程号,课程名,任课教师名。
1)把 SC 表 的 每 门 课 程 的 平 均 成 绩 插 入 到 另 一 个 已 经 存 在 的 表 SC_C (C# ,CNAME ,
AVG_GRADE)中,AVG_GRADE 为每门课程的平均成绩。
insert into SC_C (select SC.C#,C.CNAME,avg(SC.GRADE) from
SC,C where SC.C#=C.C# group by SC.C#,C.CNAME);
2)把 SC 表的 WU 老师的女学生选课元组删除。
delete from sc where sc.c# in
(select c.c# from c where c.TEACHER='wu 老师') and
sc.s# in
(select s.s# from s where s.sex='女')
或
delete from SC
where SC.S# in
(select S.S# from S,SC,C
where S.S#=SC.S# and SC.C#=C.C# and C.TEACHER='WU' and S.SEX='女')
and
SC.C# in(select C.C# from C where C.TEACHER='WU');
3) 查询前 5 名的学生成绩。
select t.S#,t.cj
from (select SC.S#,sum(SC.GRADE) cj,rownum rr from SC group
by SC.S# order by sum(SC.GRADE) desc) t
where t.rr between 1 and 5;
或者(rownum 本身不属于任何一张表)
select t.S#,t.cj
from (select SC.S#,sum(SC.GRADE) cj from SC group by SC.S#
order by sum(SC.GRADE) desc) t
where rownum between 1 and 5;
8