2021-05-10

--索引
---哈希算法
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
 
--面试问题  视图有哪些优点  有五大优点
  1. 视图能够简化用户的操作
  2. 视图能够使用户以多种角度看待同一数据
  3. 视图重构数据库踢狗一定程度的逻辑独立性
  4. 视图能够更清晰的表达
  5. 视图使用更加安全
--请同学们实验,视图能否进行增删改
--创建视图
 
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;
 
 
--事务
基本编码结构
变量定义
控制语句
事务管理
锁和死锁
存储过程
触发器
游标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值