oracle-常用sql语句、游标、触发器、存储过程、函数、包......

一、常用sql语句

聚合函数
COUNT(*)计算元组个数
COUNT(列名)对一列中的值计算个数
SUM(列名)求某一列值的总合
AVG(列名)求某一列值的平均值
MAX(列名)
MIN(列名)

--按照本门号从高到底,工资从高到底查询员工表
select * from personnel order by section desc,sal desc;

--求各个部门工资的平均值
select s.name, avg(p.sal)
  from personnel p
 inner join section s
    on p.section = s.id
 group by s.name
 
 --求各个部门工资的和
select s.name, sum(p.sal)
  from personnel p
 inner join section s
    on p.section = s.id
 group by s.name

--求工资大于财务部平均工资的员工的信息
select *
  from personnel
 where sal > (select avg(sal)
                from personnel
               where section = (select id from section where name = '财务部'))
 
--查询寻所有部门4的工作岗位,在根据工作岗位查询所有在这些工作呢岗位工作呢的员工            
select p.name,p.sal,j.name, s.name
  from personnel p
 inner join job j
    on p.job = j.id
 inner join section s
    on p.section = s.id
 where p.job in (select job from personnel where section = 4 group by job)
 


--各部门工资大于部门平均工资的员工信息
select *
  from personnel p
 where sal > (select avg(sal) from personnel where p.section = section);

--各部门工资大于部门平均工资的员工数量和部门编号
select count(*),p.section
  from personnel p
 where sal > (select avg(sal) from personnel where p.section = section) group by p.section;

 --排序
 select * from personnel order by id desc
 
 --插入
 insert into section (id,name) values(5,'市场部');
 
 --删
 delete section where id = 5;
 
 --改
 update section set name = '尼玛' where id = 5;

 --分页
select *
  from (select e1.*, rownum r
          from (select * from employee) e1
         where rownum < 5)
 where r > 2

--别名
select s.name as "部门",avg(sal) as "平均工资"
  from personnel p
 inner join section s
    on p.section = s.id
 group by s.name


--建表
create table text(
   id number(6) primary key,
   name varchar2(20) not null,
   age number(6) not null,
   manager number(6)
)tablespace users;

--插入数据
insert into text (id,name,age,manager) values (106,'A',30,104);
insert into text (id,name,age,manager) values (109,'B',19,104);
insert into text (id,name,age,manager) values (104,'A',20,111);
insert into text (id,name,age,manager) values (107,'D',35,109);
insert into text (id,name,age,manager) values (112,'E',25,120);
insert into text (id,name,age,manager) values (119,'F',45,null);




//选修了java课程的学生的id和姓名
select s.studentid, s.name
  from student s
 inner join sc x
    on s.studentid = x.studentid
 where x.courseid = (select courseid from course where coursename = 'Java');

--查看熊敏选修了那几门课程
select c.coursename
  from course c
 inner join sc x
    on c.courseid = x.courseid
 where x.studentid = (select studentid from student where name = '熊敏');

--打印选课数大于3的学生的id和姓名
select stu.studentid, stu.name
  from student stu
 where (select count(*) from sc where studentid = stu.studentid) > 3;

--:列出所有年龄比所属主管年龄大的人的ID 和名字?
select em.id,em.name from text em where em.age > (select age from text where em.manager = id);

--删除相同数据
delete from text t where t.id > (select min(x.id) from text x where t.name = x.name);



--用exists代替in
select * from employee e where e.section in (select id from section) order by id;

select * from employee e where exists (select id from section s where e.section = s.id) order by id;


--exists与in比较
select * from 表A where exists(select * from 表B where 表B.id=表A.id)  
--这句相当于 
select * from 表A where id in (select id from 表B)

二、游标、触发器、存储过程、函数、包......

打开输出选项 set serveroutput on;
关闭输出选项 set serveroutput off;

一、游标的应用

实例1:
declare
  id number;--申明变量接受游标里查出来的值
  department varchar2(20);
  --申明一个游标:aaaa
  cursor aaaa is select studentid,name from student where name  = '熊敏';
begin
  --打开游标
  open aaaa;
  --判断是否返回记录
  if aaaa%notfound then
    dbms_output.put_line('没有找到相应的记录');
  else
    --从游标中读取数据
    fetch aaaa
      into id,department;
    dbms_output.put_line(id || ',' || department);
  end if;
  close aaaa;
end;

实例2:
--游标循环读取数据
declare --申明  
    id   number; --变量
    name varchar2(20);
 cursor user_table is select studentid,name from student; --申明游标:user_table
begin  --开始
  for user_tables in user_table loop  --循环读取,user_tables为临时变量
    id   := user_tables.studentid;
    name := user_tables.name;
    dbms_output.put_line('学员编号:' || id || '学员姓名:' || name);
  end loop;
end; --结束

二、创建和调用过程
	--无参过程pro_01
	create or replace procedure pro_01 is
begin
  insert into job (id,name) values (4,'总经理');
  end;
 
--调用过程(在命令行中调)
	exec pro_01;

--有参过程pro_02
create  or replace procedure pro_02 
 ----申明五个个输入参数,
----输入字符串不让加长度
 (
       student_id in number,
       student_name in varchar2,
       student_sex in varchar2,
       student_age in number,
       student_department in varchar2
 ) as 
 begin
   insert into student values(student_id,student_name,student_sex,student_age,student_department);
   end;

--调用
exec pro_02(7,'林文伟','男',23,'学习部');
三、函数
--创建一个返回插入条数信息的函数
--申明5个参数的函数
--函数名function_insert_student
--返回值run_number
create or replace function function_insert_student
(
    student in number,
    stu_name in varchar2,
    sex in varchar2,
    age in number,
    department in varchar2
)return number as ret_number number :=0;
begin
  insert into student values(student,stu_name,sex,age,department);
  ret_number := ret_number + 1;
  commit;
  return ret_number;
  end;
--调用函数
  declare 
  --申明一个变量接受函数返回值
  receive_number number;
  begin
    receive_number :=function_insert_student(9,'王正国','男',23,'学习部');
    dbms_output.put_line('一共插入--' || receive_number || '条数据。');
end;

四、包

--创建包头
    create or replace package pack_age as
      --申明过程
      procedure my_procedure(studentid	number,stu_name varchar2,sex varchar2,age number,department varchar2);
      --申明函数
      function my_function(studentid number,stu_name varchar2,sex varchar2,age number,department varchar2) return number;
    end pack_age;
    
    --创建包体
    create or replace package body pack_age as
      --实现过程
      procedure my_procedure(studentid number,stu_name varchar2,sex varchar2,age number,department varchar2) is
        begin
          insert into student values (studentid,stu_name,sex,age,department);
          commit;
        end my_procedure;
     --函数的实现
     function my_function(studentid in number,stu_name in varchar2,sex in varchar2,age in number,department in varchar2)
       return number as return_number number := 0;
       begin
         insert into student values (studentid,stu_name,sex,age,department);
         return_number := return_number + 1;
         commit;
         return return_number;
         end my_function;
    end pack_age;
    
    --包的调用
    declare 
      --申明变量接收函数的返回值
      num_number number;
      begin
          pack_age.my_procedure(10,'黄广','男',23,'学习部');
          num_number := pack_age.my_function(11,'黄云生','男',23,'学习部');
        end;

五、视图

--创建视图
     create or replace view my_view as
     select * from student;
    
     --调用视图
     select * from my_view;

六、触发器

1、测试表结构
  create table a(
    id number(6),
    s_name varchar2(30)
)

create table b(
   id number(6),
s_name varchar2(30)
)

2、--创建出发器-- bck_trg
--单向表a插入数据的时候同时向表b里插入数据
--insert into b values (1,'熊敏')

  create or replace trigger bck_trg
  after insert on a for each row
begin
       insert into b values (1,'熊敏');
end;

--测试
insert into a values(1,'熊敏');



--复制表数据的写法
create or replace trigger tig_test
  after insert on a  
declare
begin
   insert into b (select * from a where a.id=(select max(a.id) from a ));
end tig_test;


--将插入的信息插入到目标表
create or replace trigger tig_a
  after insert on a  
  for each row
declare
  -- 在这里申明变量
begin
   insert into b(id,s_name) values(:NEW.ID,:NEW.S_NAME);
end tig_a;

--将A表删除的数据插入到B表
create or replace trigger tig_a
  after delete on a  
  for each row
declare
  -- local variables here
begin
   insert into b(id,s_name) values(:old.ID,:old.S_NAME);
end tig_a;

猜你喜欢

转载自x125858805.iteye.com/blog/1683011