一、常用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;