--索引
---哈希算法
create
index
adc
on
studebnt(sage) 创造索引
drop
index
abc 删除索引
--面试问题
索引能体改查询速度,那么索引是不是创建的越多越好?
XXX应用中,你会创建什么索引?为什么?
用的越频繁的属性
--mysql的地城索引算法是说明?
oracle的所有算法是什么?
索引的本质就是排序
索引是先排序,然后再进行哈希算法
而不同的应用程序的排序算法不同
oracle采用的两种排序规则,当数据较少的时候(
1
W条一下记录),采用堆排序
当数据较大的时候采用红黑树
--视图 view
--视图不放真实数据 ,只是快捷键
create view vavgmk as
select sid,avg(cmark) amk from mark group by sid
--修改视图 属性 or replace
create or replace view vavgmk as
select sid,trunc(avg(cmark).2) amk from mark group by sid
--面试问题 视图有哪些优点 有五大优点
-
视图能够简化用户的操作
-
视图能够使用户以多种角度看待同一数据
-
视图重构数据库踢狗一定程度的逻辑独立性
-
视图能够更清晰的表达
-
视图使用更加安全
--请同学们实验,视图能否进行增删改
--创建视图
create view vsmc as
select sname,cname,cmark
from student s join mark m on s.sid=m.sid join course c on m.cid= c.cid
--修改视图 or replace
create or replace view vsmc as
select sname,cname,cmark
from student s join mark m on s.sid=m.sid join course c on m.cid= c.cid
where cname='数学'
--drop view vsmc(视图名字) 删除视图
--select * from vsmc
--数据库编程:
--编程结构 plsql 代码块
declare
--所有的定义,这部分在编译阶段生效
begin
--这里放的是代码,在执行截断生效
exception
--这里是异常处理
end
------------------
begin
dbms_output.put_line(
'这是打印语句'
);
end
;
-----------
declare
--变量名在左侧 类型在右侧 declare 中只能放定义
i
number
:=
99
;
begin
-- begin 中放的是语句
dbms_output.put_line(i);
end
;
--& 取指符仅仅在编译阶段进行交互,编译结束不会在接受人类输入
declare
i number:=100;
j number:=&请输入一个整数;
nm varchar2(100):='&请输入学生姓名';
begin
dbms_output.put_line(i);
dbms_output.put_line(j);
dbms_output.put_line(nm);
end;
-----------------------------循环语句求和
declare
x number:=&请输入一个整数;
s number:=0;
i number;
begin
for i in 0..x loop
s:=s+i;
end loop;
dbms_output.put_line(s);
end;
------------偶数求和
declare
mx number:=&请输入一个最大数字;
s number:=0;
i number:=0;
begin
for i in 0..mx loop
if mod(i,2)=0 then
s:=i+s;
end if;
end loop;
dbms_output.put_line(s);
end;
------------if 语句
declare
nm varchar2(100):='&请输入姓名';
ag number:=&请输入年龄;
begin
if ag>60 then
dbms_output.put_line(nm||'是一位老人');
elsif ag>30 then
dbms_output.put_line(nm||'是成年人');
elsif ag>10 then
dbms_output.put_line(nm||'是青少年');
else
dbms_output.put_line(nm||'是儿童');
end if;
end;
----动态赋值 根据名字找年纪
declare
nm varchar2(100):='&请输入姓名';
ag number;
begin
select sage into ag from student where sname=nm;
if ag>60 then
dbms_output.put_line(nm||'是一位老人');
elsif ag>30 then
dbms_output.put_line(nm||'是成年人');
elsif ag>10 then
dbms_output.put_line(nm||'是青少年');
else
dbms_output.put_line(nm||'是儿童');
end if;
end;
-------------------------简化
declare
line student%rowtype;
begin
for line in(select * from student) loop
if line.sage>60 then
dbms_output_put.line(line.sname||'老人');
elsif line.sage>30 then
dbms_output_put.line(line.sname||'成人');
elsif line.sage>10 then
dbms_output_put.line(line.sname||'青年');
else
dbms_output_put.line(line.sname||'儿童');
end if;
end loop;
end;
/*请扫描每个学生,显示这个学生的姓名和均分
并对其作出评价
均分>=90 显示成绩优秀
并且显示这个学生的最高分以及对应课程名
均分》=80 显示成绩良好
>=70 普通
其他 差*/
--step1 所有人的SID sname cid cmark CNAME
create view students as
select s.sid,s.sname,m.cid,m.cmark,c.cname
from student s join mark m on s.sid=m.sid join course c on m.cid=c.cid
--step2 均分表
create view m as
select sid,trunc(avg(cmark),2) amk
from mark
group by sid
--step3
create view z as
select s.sid,m.amk,s.sname,s.cmark,s.cname
from m join students s on m.sid=s.sid
select *
from z
--step4
create view z1 as
select z.*,
row_number() over(partition by sid order by cmark) n
from z
--step5
create view z11 as
select *
from z1
where n=1
--step6
declare
line z11%rowtype;
begin
for line in(select * from z11) loop
if line.amk>80 then
dbms_output.put_line(line.sname||'成绩优秀'||line.cmark||'最高分'||line.cname);
else
dbms_output.put_line(line.sname||'一般');
end if;
end loop;
end;
---
declare
i number:=&请输入一个整数;
j number:=0;
z number:=0;
begin
for j in 0..i loop
z:=j+z;
end loop;
dbms_output.put_line(z);
end;
declare
j number:=0;
z number:=0;
begin
while j<=100 loop
z:=j+z;
j:=j+1;
end loop;
dbms_output.put_line(z);
end;
--请使用WILHE循环编写程序实现将用户传入的任意整数装换成为二进制字符串并打印
declare
d number:=&请输入你要转换的数字;
n number:=&请输入你要转换的进制;
s varchar2(100);
begin
while d!=0 loop
s:=mod(d,n)||s;
d:=trunc(d/n);
end loop;
dbms_output.put_line(s);
end;
--请将计算机专业学的学生数学成绩加上一定分数低于90则+2分,低于70+3分,不及格+5分
--step1 每个人的专业成绩
create view smark as
select s.sid,m.cmark,c.cname,m.cid,s.smajor
from student s join mark m on s.sid=m.sid join course c on m.cid=c.cid
drop view smark
select * from smark
-----
declare
i smark%rowtype;
j smark.smajor%type;
z smark.cname%type;
x smark.cmark%type
begin
select cmark into x from smark where smajor=j and cname=z
if cmark<60 then
update smark set cmark=cmark+5;
--将心理学专业的英语成绩加上一定分数,低于80+2分 不及格+3分
--其他专业的计算机基础成绩加上一定分数 低于75+1 不及格+2
--属性数值类型和表中一致
declare
x student%
rowtype
-- y student.smajor%type;
--非预定义(predefined)错误
--exception 发现异常;
--请输入学生姓名,程序打印此人均分
--如果输入姓名不存在, 提示学生不存在
--存在多个重复 学生,每个都打印出来打印此人学号的
declare
nm student.sname%type:='&请输入姓名';
amk number;
ssid student.sid%type;
line student%rowtype;
cnt number:=1
begin
select sid into ssid from student where nm=sname;
select trunc(avg(cmark),2) into amk from mark where sid=ssid;
dbms_output.put_line(nm||'的均分是'||amk);
exception
when no_data_found then
dbms_output.put_line(nm||'名字不存在');
when too_many_row than
dbms_output.put_line(nm||'名字不只一人');
for line in(select * from student where nm=sname) loop
----------------------------------
declare
nm student.sname%type:='&请输入姓名';
ssid student.sid%type;
amk number;
line student%rowtype;
cnt number:=1;
begin
select sid into ssid from student where sname=nm;
select trunc(avg(cmark),2) into amk from mark where sid=ssid;
dbms_output.put_line(nm||'的均分是'||amk);
exception
when no_data_found then
dbms_output.put_line(nm||'不存在此人,请输入正确姓名');
when too_many_rows then
dbms_output.put_line('姓名叫'||nm||'不止一人');
for line in(select * from student where sname=nm) loop
select trunc(avg(cmark),2) into amk from mark where sid=line.sid;
dbms_output.put_line('第'||cnt||nm||'的均分是'||amk);
cnt=cnt+1;
end loop;
end;
select * from student
declare
ssid student.sid%type:='&请输入学号';
sse student.ssex%type:='&请输入你的性别';
nm student.sname%type:='&请输入你的名字';
ag student.sage%type:='&请输入你的年龄';
error_sse exception;
begin
if sse not in('男','女') then
dbms_output.put_line(sse||'输入非法');
else
insert into student(sid,ssex,sname,sage) values(ssid,sse,nm,ag);
end if;
end;
select
*
from
student
-----
declare
ssid student.sid%type:=&请输入你的sid;
nm student.sname%type:='&请输入你的姓名';
ag student.sage%type:=&请输入你的年龄;
sex student.ssex%type:='&请输入你的性别';
no_sex exception;
no_ag exception;
begin
if sex not in('男','女') then
raise no_sex;
end if;
if ag not between 1 and 120 then
raise no_ag;
end if;
insert into student(sid,sname,sage,ssex) values(ssid,nm,ag,sex);
exception
when no_sex then
dbms_output.put_line('你输入的性别非法');
when no_ag then
dbms_output.put_line('年龄必须在1~120之间');
end;
--事务
基本编码结构
变量定义
控制语句
事务管理
锁和死锁
存储过程
触发器
游标