视图
什么是视图?
视图(view)也被称作虚表,也就是虚拟的表,是一组数据的逻辑表示.
视图对应一个select语句,结果集被赋予一个名字,就是视图的名字.
视图本身不包含任何数据,他只是包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之发变化.
视图创建后,可以像操作表一样操作视图,主要是查询.
根据视图所对应的子查询种类分为几种类型:
select语句是基于单表建立,并且不包含任何函数运算,表达式或者分组函数,叫做简单视图,此时视图是基表的子集.
select语句是基于单表建立,但是包含了单行函数,表达式,分组函数后者group by子句,叫做复杂视图.
select语句是基于多个表的,叫做连接视图.
视图的作用
1--如果需要经常执行某种复杂查询,可以基于这个复杂查询建立视图,以后查询此视图即可,可以简化复杂查询
2--视图本质上是一条select语句,所以当访问视图时,只能访问到对应的select语句中涉及到的列,
对基表中的其他列起到安全和保密的作用,限制数据的访问
创建视图的用户必须要获得创建视图的权限
在sysdb角色下为指定用户权限
conn sys/s as sysdba;
show user;
grant create view to scott;
conn scott/a;
show user;
create or replace view v_emp
as
select empno,ename,sal from emp;
desc v_emp;
drop view v_emp;
select * from v_emp;
create or replace view v_emp_2
as
select empno no,ename name,job job,sal sal from emp;
创建视图时使用别名,查询视图时也要使用别名
--------------------------------------------------------------------------------------------
序列(sequence)
用在哪里?
在mysql数据库中,可以设置id字段以自动增长的方式,实现数据的插入
create table mysql_tbl(
id int primary key auto_increment,
name varchar(100)
)
在oracle数据库中,如何实现mysql表中的字段自动增长
使用序列,序列是oracle中的一种对象
create sequence seq_user ; --创建序列的关键字和序列名称
increment by 1 --自动增加的步长 (默认1)
start with 1 --开始的大小值 (默认1)
maxvalue | minvalue num --最大值和最小值 (默认 nomaxvalue 10的26次方)
nomaxvalue --默认的 不限制
cycle | nocycle --是否轮回 (默认 nocycle)
cache num| nocache --缓存区大小 (默认 20)
使用序列
select seq_user.nextval from dual;
select seq_user.currval from dual;
建表
create table t_user(
id number,
username varchar2(100),
password varchar2(48),
regtime date,
constraint pk_user primary key(id)
);
insert into t_user values(seq_user.nextval,'sun','123123',sysdate);
删除序列
drop sequence seq_user;
需要一张表t_product
编号 主键 自动增长
产品名称 非空
产品销量 非空 默认为零
产品库存 非空 默认为0
产品初始化销量
创建表
create table t_product(
id number,
p_name varchar2(100) not null,
p_sales number default 0 not null,
p_sum number default 0 not null,
p_start_sum number,
constraint pk_product primary key(id)
);
create sequence seq_id;
插入五条数据
insert into t_product values(seq_id.nextval,'tudou',100,1000,50);
建立视图(视图中不显示 产品初始化销量)
create or replace view v_product
as
select id,p_name,p_sales,p_sum from t_product;
查询视图
select * from v_product;
从视图插入一条数据
insert into v_product values(seq_id.nextval,'maodou',500,2500);
----------------------------------------------------------------------------------------------------------------
存储过程
存储过程适合更新操作,特别是大数据量的更新
创建存储过程
create or replace procedure proc1
as|is --相当于declare 声明的意思
abc varchar2(100); --定义该存储过程的变量,作用域就是本储存过程中
begin
update t_user set username='lucy' where id=3;
end;
/
-----------------------------------
例如 修改
create or replace procedure proc1
as
begin
update t_user set username='lucy' where id=4;
commit;
end;
/
------------------------------------
添加
create or replace procedure proc1
as
begin
insert into t_user values(seq_user.nextval,'tom','111222',sysdate);
commit;
end;
/
调用存储过程
exec proc1;
--------------------------------------
带输入参数的存储过程
创建
create or replace procedure proc2(
param1 varchar2,param2 varchar2 default '888888' --存储过程的参数 类型不需要指定宽度(范围)
)
as
begin
insert into t_user values(seq_user.nextval,param1,param2,sysdate);
commit;
end;
/
执行
exec proc2('ganjun');
call proc2('mary');
----------------------------------------
带输出参数的存储过程
create or replace procedure proc3(
param1 in varchar2,param2 out varchar2 --in 代表输入参数, out代表输出参数
)
as
begin
select password into param2 from t_user where username=param1;
dbms_output.put_line(param2);
end;
/
set serverout on;
var pp varchar2(100);
exec proc3('tom',:pp);
-----------------------------------------
查询结果返回多个字段值的存储过程
create or replace procedure proc4(
param1 in varchar2,param2 out varchar2,param3 out varchar2 --in 代表输入参数, out代表输出参数
)
as
begin --注意:这里只能处理返回的是一条记录的结果集,如果结果集含有多条记录,oracle没有提供直接处理的方式,
必须间接借助游标,但是游标本身的效率很差,所以,实际开发中基本不适用
select id,password into param2,param3 from t_user where username=param1;
dbms_output.put_line(param2||param3);
end;
/
set serverout on;
var pp varchar2(100);
var pp1 varchar2(100);
exec proc4('tom',:pp,:pp1);
-------------------------------------------------
定义变量
param1 varchar2(100); --变量的类型 可以是oracle系统所有合法的数据类型
param2 number;
给变量赋值
param1:='who am i!';
param2:=123;
------------------------------
带变量的存储
create or replace procedure proc5(
param1 in varchar2,param2 out varchar2,param3 out varchar2 --in 代表输入参数, out代表输出参数
)
as
param varchar2(100);
begin
select id,password into param2,param3 from t_user where username=param1;
param:='who am i?';
dbms_output.put_line(param2||param3);
dbms_output.put_line(param);
end;
/
set serverout on;
var pp varchar2(100);
var pp1 varchar2(100);
exec proc5('tom',:pp,:pp1);
-------------------------------------------------
if 判断
if t_value=1 then
begin
do ...
end;
end if;
----------------------
create or replace procedure proc_if(pp in number)
as
total number;
begin
total:=pp;
if total<5 then
begin
insert into t_user values(seq_user.nextval,'苏乞儿','666666',sysdate);
commit;
end;
end if;
end;
/
call proc_if(3);
--------------------------------------------------
while循环
while t_value=1 loop
begin
do.....
end;
end loop;
--------------------------
create or replace procedure proc_while(pp in number)
as
total number;
begin
total:=pp;
while total<10 loop
begin
total:=total+1;
dbms_output.put_line(total||'我是谁?');
end;
end loop;
end;
/
create or replace procedure proc_while(x in number) for ( int i = 0; ---- total number; total:=0;
as i < x; ---- while total<x
total number; i++) ----- total:=total+1;
begin {system.out.println()} -----dbms_output.put_line(total||'我是谁?');
total:=0;
while total<x loop
begin
total:=total+1;
dbms_output.put_line(total||'我是谁?');
end;
end loop;
end;
/
set serverout on;
call proc_while(10);
---------------------------------------------------
for y in 1..100 loop
i:=x*y;
exit when i=300;
end loop inner_zzl;
create or replace procedure proc_for(x in number)
as
i number;
begin
for y in 1..100 loop
i:=x*y;
exit when i=300;
dbms_output.put_line(i);
end loop;
end;
/
set serverout on;
什么是视图?
视图(view)也被称作虚表,也就是虚拟的表,是一组数据的逻辑表示.
视图对应一个select语句,结果集被赋予一个名字,就是视图的名字.
视图本身不包含任何数据,他只是包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之发变化.
视图创建后,可以像操作表一样操作视图,主要是查询.
根据视图所对应的子查询种类分为几种类型:
select语句是基于单表建立,并且不包含任何函数运算,表达式或者分组函数,叫做简单视图,此时视图是基表的子集.
select语句是基于单表建立,但是包含了单行函数,表达式,分组函数后者group by子句,叫做复杂视图.
select语句是基于多个表的,叫做连接视图.
视图的作用
1--如果需要经常执行某种复杂查询,可以基于这个复杂查询建立视图,以后查询此视图即可,可以简化复杂查询
2--视图本质上是一条select语句,所以当访问视图时,只能访问到对应的select语句中涉及到的列,
对基表中的其他列起到安全和保密的作用,限制数据的访问
创建视图的用户必须要获得创建视图的权限
在sysdb角色下为指定用户权限
conn sys/s as sysdba;
show user;
grant create view to scott;
conn scott/a;
show user;
create or replace view v_emp
as
select empno,ename,sal from emp;
desc v_emp;
drop view v_emp;
select * from v_emp;
create or replace view v_emp_2
as
select empno no,ename name,job job,sal sal from emp;
创建视图时使用别名,查询视图时也要使用别名
--------------------------------------------------------------------------------------------
序列(sequence)
用在哪里?
在mysql数据库中,可以设置id字段以自动增长的方式,实现数据的插入
create table mysql_tbl(
id int primary key auto_increment,
name varchar(100)
)
在oracle数据库中,如何实现mysql表中的字段自动增长
使用序列,序列是oracle中的一种对象
create sequence seq_user ; --创建序列的关键字和序列名称
increment by 1 --自动增加的步长 (默认1)
start with 1 --开始的大小值 (默认1)
maxvalue | minvalue num --最大值和最小值 (默认 nomaxvalue 10的26次方)
nomaxvalue --默认的 不限制
cycle | nocycle --是否轮回 (默认 nocycle)
cache num| nocache --缓存区大小 (默认 20)
使用序列
select seq_user.nextval from dual;
select seq_user.currval from dual;
建表
create table t_user(
id number,
username varchar2(100),
password varchar2(48),
regtime date,
constraint pk_user primary key(id)
);
insert into t_user values(seq_user.nextval,'sun','123123',sysdate);
删除序列
drop sequence seq_user;
需要一张表t_product
编号 主键 自动增长
产品名称 非空
产品销量 非空 默认为零
产品库存 非空 默认为0
产品初始化销量
创建表
create table t_product(
id number,
p_name varchar2(100) not null,
p_sales number default 0 not null,
p_sum number default 0 not null,
p_start_sum number,
constraint pk_product primary key(id)
);
create sequence seq_id;
插入五条数据
insert into t_product values(seq_id.nextval,'tudou',100,1000,50);
建立视图(视图中不显示 产品初始化销量)
create or replace view v_product
as
select id,p_name,p_sales,p_sum from t_product;
查询视图
select * from v_product;
从视图插入一条数据
insert into v_product values(seq_id.nextval,'maodou',500,2500);
----------------------------------------------------------------------------------------------------------------
存储过程
存储过程适合更新操作,特别是大数据量的更新
创建存储过程
create or replace procedure proc1
as|is --相当于declare 声明的意思
abc varchar2(100); --定义该存储过程的变量,作用域就是本储存过程中
begin
update t_user set username='lucy' where id=3;
end;
/
-----------------------------------
例如 修改
create or replace procedure proc1
as
begin
update t_user set username='lucy' where id=4;
commit;
end;
/
------------------------------------
添加
create or replace procedure proc1
as
begin
insert into t_user values(seq_user.nextval,'tom','111222',sysdate);
commit;
end;
/
调用存储过程
exec proc1;
--------------------------------------
带输入参数的存储过程
创建
create or replace procedure proc2(
param1 varchar2,param2 varchar2 default '888888' --存储过程的参数 类型不需要指定宽度(范围)
)
as
begin
insert into t_user values(seq_user.nextval,param1,param2,sysdate);
commit;
end;
/
执行
exec proc2('ganjun');
call proc2('mary');
----------------------------------------
带输出参数的存储过程
create or replace procedure proc3(
param1 in varchar2,param2 out varchar2 --in 代表输入参数, out代表输出参数
)
as
begin
select password into param2 from t_user where username=param1;
dbms_output.put_line(param2);
end;
/
set serverout on;
var pp varchar2(100);
exec proc3('tom',:pp);
-----------------------------------------
查询结果返回多个字段值的存储过程
create or replace procedure proc4(
param1 in varchar2,param2 out varchar2,param3 out varchar2 --in 代表输入参数, out代表输出参数
)
as
begin --注意:这里只能处理返回的是一条记录的结果集,如果结果集含有多条记录,oracle没有提供直接处理的方式,
必须间接借助游标,但是游标本身的效率很差,所以,实际开发中基本不适用
select id,password into param2,param3 from t_user where username=param1;
dbms_output.put_line(param2||param3);
end;
/
set serverout on;
var pp varchar2(100);
var pp1 varchar2(100);
exec proc4('tom',:pp,:pp1);
-------------------------------------------------
定义变量
param1 varchar2(100); --变量的类型 可以是oracle系统所有合法的数据类型
param2 number;
给变量赋值
param1:='who am i!';
param2:=123;
------------------------------
带变量的存储
create or replace procedure proc5(
param1 in varchar2,param2 out varchar2,param3 out varchar2 --in 代表输入参数, out代表输出参数
)
as
param varchar2(100);
begin
select id,password into param2,param3 from t_user where username=param1;
param:='who am i?';
dbms_output.put_line(param2||param3);
dbms_output.put_line(param);
end;
/
set serverout on;
var pp varchar2(100);
var pp1 varchar2(100);
exec proc5('tom',:pp,:pp1);
-------------------------------------------------
if 判断
if t_value=1 then
begin
do ...
end;
end if;
----------------------
create or replace procedure proc_if(pp in number)
as
total number;
begin
total:=pp;
if total<5 then
begin
insert into t_user values(seq_user.nextval,'苏乞儿','666666',sysdate);
commit;
end;
end if;
end;
/
call proc_if(3);
--------------------------------------------------
while循环
while t_value=1 loop
begin
do.....
end;
end loop;
--------------------------
create or replace procedure proc_while(pp in number)
as
total number;
begin
total:=pp;
while total<10 loop
begin
total:=total+1;
dbms_output.put_line(total||'我是谁?');
end;
end loop;
end;
/
create or replace procedure proc_while(x in number) for ( int i = 0; ---- total number; total:=0;
as i < x; ---- while total<x
total number; i++) ----- total:=total+1;
begin {system.out.println()} -----dbms_output.put_line(total||'我是谁?');
total:=0;
while total<x loop
begin
total:=total+1;
dbms_output.put_line(total||'我是谁?');
end;
end loop;
end;
/
set serverout on;
call proc_while(10);
---------------------------------------------------
for y in 1..100 loop
i:=x*y;
exit when i=300;
end loop inner_zzl;
create or replace procedure proc_for(x in number)
as
i number;
begin
for y in 1..100 loop
i:=x*y;
exit when i=300;
dbms_output.put_line(i);
end loop;
end;
/
set serverout on;
call proc_for(3);