一、oralce数据库
首先明白,oracle数据库、实例、和表空间的关系。
Oracle数据库和传统说的数据库不一样,一个相当于管理系统,而且只有一个。
实例:实例是后台进程和和内存结构,oracle数据库可以有很多个实例
每个实例下面有自己的用户,和数据库对象(表、同义词、序列、视图、索引)。
表空间:
用户可以创建自己的表空间,或者使用系统的表空间。
一个用户只能对应一个表空间。一个表空间可以对应多个用户。
1/表空间是数据库中最大的逻辑单位,一个 Oracle 数据库至少包含一个表空间,就是名为SYSTEM的系统表空间。
2/
每个表空间是由一个或多个数据文件组成的,一个数据文件只能与一个表空间相关联。3/表空间的大小等于构成该表空间的所有数据文件大小之和。
二、创建用户和表
创建数据库实例之后,在实例下创建用户
--注意:创建了用户,必须给用户赋予登陆权限和使用存储空间的权限,不然新创建的用户无法登陆
--允许用户连接数据库并创建数据库对象
grant connect to lmj;
--允许用户使用数据库中的存储空间
grant resource to lmj;
--创建表和插入数据,查询数据
--在数据库中,变量名写在前面,变量类型写在后面,与java程序相反
create table student
(
sname varchar2(30),
sid number not null
);
insert into student values('zhansan',1);
select * from student;
三、数据库对象
数据库对象包括:表、同义词、序列、视图、索引。
数据库对象是每个用户拥有的,自己拥有自己的数据库对象,同义词、序列、索引都是独立于表存在的。
1、同义词,他就相当于查询表的时候使用的别名,给表创建一个同义词可以简化复杂的表名方便引用,还可以提高表的安全性,也可以给同一个表创建多个同义词分配给不同的用户,那么大家看到的表名都是不一样的。
同义词分为公有和私有,公有大家可见,私有自己可见
----同义词的创建和使用代码
--定义私有同义词
create synonym e for emp;
--使用同义词查询表
Select * from e;
--删除同义词
drop synonym e;
--赋权限
grant select on dept to zhangsan;
--定义公共的同义词
create or replace public synonym e for emp;
2、序列:自增长的一个变量,它独立于表存在,每次的值都保存下来,下次使用的时候接着增长或者减少。
--创建序列
create sequence seq_num
start with 1
increment by 2
maxvalue 20
minvalue 1
NOCYCLE
CACHE 2
3、视图
视图就是查询语句的封装,它的不存储数据,所有的数据都来自表,他的具体列来自查询语句。
--创建视图
create view v_emp as select empno,ename,job from
emp;
--创建一个视图,名字为v_emp 他的列来自emp表
视图使用:
Select * from v_emp;
--现在得到的就是select empno,ename,job from emp;的数据
视图就相当于一个虚拟表,视图主要是用于查询。
4、索引
它是为了提高查询效率,他根据rowid创建,rowid是保存了每一行数据的内存地址,所以找到了行的rowid就找到了整个行。
索引也是独立于表存在的,它由数据库自动维护,每次更新表的数据,索引都会重新创建,所以建立索引会降低更新的效率。
为什么索引可以提高效率?
比如在查找 where name=“zhangs” and id=11;
如果id建立了索引,就可以直接先匹配每一行的id,提取出满足id的行
再匹配name,就可以不用全部匹配每一行的name和id
如果id没有索引,就会一行一行的,全部匹配每一行的name和id。
语法:
唯一索引和组合索引
Create index my_index on student(sid);
Create index my2_index on student(sid,sname);
PL/SQL
PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言。
一、为什么需要PL/SQL编程。
原来我们操作数据库的方式
每次发送一个字符串给oracle,数据库都要编译在运行,这样效率很慢,而且在网络中字符串容易被串改。
利用PL/SQL编程,将操作过程都写在oracle中,编译好后放在那里,只等着java应用来调用,这样效率和安全性都得到提高。
缺点:
移植性差,数据库操作都写在oracle,如果需要换成sql2005数据库,那么将无法移植需要全部重写数据库操作。
1、PL/SQL 分为三个部分,声明部分、可执行部分和异常处理部分
[DECLARE
declarations]
BEGIN
executable statements
[EXCEPTION
handlers]
END;
Begin 到end的内容成为块;
过程:可以重复调用
创建过程的语法:
CREATE [OR REPLACE] PROCEDURE
<procedure name> [(<parameter list>)]
IS|AS
<local variable declaration>
BEGIN
<executable statements>
[EXCEPTION
<exception handlers>]
END;
create or replace procedure pro_1 is
begin
insert into student values('zhangsanfeng',6);
end;
执行的时候需要输入/再按回车
调用的命令
--调用过程
exec pro_1
2、打开输出
set serveroutput on;
打印
begin
dbms_output.put_line('aaaaa');
end;
/
3、将查询结果输出
--声明变量
--变量名在前,类型在后
set serveroutput on;
declare
myname varchar2(20);
myid number(10);
begin
select sname,sid into myname,myid from student where sid=1;
dbms_output.put_line('姓名'||myname||'编号'||myid);
end;
带输入的查询
declare
myname varchar2(30);
myid number(10);
begin
select sname,sid into myname,myid from student where sid=&aa;
dbms_output.put_line('姓名:'||myname||'编号:'||myid);
end;
注意:
通过&aa,aa随便取名,用来接收输入的数据,如果是字符串输入要加‘’
异常处理:(找不到数据)
declare
myname varchar2(30);
myid number(10);
begin
select sname,sid into myname,myid from student where sname=&aa;
dbms_output.put_line('姓名:'||myname||'编号:'||myid);
exception
when no_data_found
then
dbms_output.put_line('没有该学生');
end;
带有参数的过程
create or replace procedure my_pro(name varchar2)
is myid number(10);
begin
select sid into myid from student where sname=name;
dbms_output.put_line('编号:'||myid);
exception
when
no_data_found
then
dbms_output.put_line('没有该学生');
end;
<!--EndFragment-->