二、Oracle的结构学习
1.结构 数据库-->数据库实例(ORCL)-->表空间(用户里面的创建表)-->文件 2.创建表和删除空间 创建语法: create tablespace 表空间的名称 datafile '文件的路径(服务器上的)' size 大小 autoextend on 自动扩展 next 每次扩展的大小 例: create tablespace handong datafile 'c:\handong.dbf' size 100m autoextend on next 10m; 删除表空间: drop tablespace 表空间名称 例: drop tablespace handong; 注意: 创建表空间时要切换到系统账户 删除表空间时要先执行删除语句,但磁盘上文件还是有的,磁盘文件需手动删除 3.创建用户并授予权限(在系统账户中创建) 语法: create user 用户名 indentified by 密码 default tablespace 表空间的名称; grant 角色|权限 to 用户名; 例: create user dakang indentified by dakang default tablespace handong; grant dba to dakang; 角色|权限相关: Oracle中已存在三个重要的角色:connect角色,resource角色,dba角色 connect角色:是授予最终用户的典型权力,最基本的 alter session --修改会话 create cluster --建立聚簇 create database link --建立数据库链接 create sequence --建立序列 create session --建立会话 create synonym --建立同义词 create view --建立视图 resource角色:--是授予开发人员的 create cluster --建立聚簇 create procedure --建立过程 create sequence --建立序列 create table --建立表 create trigger --建立触发器 create type --建立类型 dba角色:拥有全部特权,是系统的最高权限,只有dba才可以创建数据库结构,并且系统权限也需要dba授出,且dba用户可以操作全体用户的任意表包括删除 4.表的约束 主键约束:primary key 非空约束:not null 唯一约束:unique 检查约束:check() 外键约束: 添加外键约束: alter table product add foreign key(cno) reference category(cid); 强制级联删除:先删除外键约束,然后删除自己(不好) drop table category cascade constaint; 添加外键约束,使用级联约束,在删除的时候,使用级联删除 alter table product add foreign key(cno) reference category(cid) on delete cascade; 级联删除:首先去从表中找有没有关联数据,如果在从表中有关联数据,先删除从表中的数据,然后再删除表中的数据 delete from category where cid=2; 5.子查询插入数据 insert into emp1 select * from emp where dptno=10; 6.delete和truncate的区别 delete:DML、逐条删除、支持事务操作 truncate:DDL、先删除表在创建表、不支持事务操作、执行效率要高 7.视图 是对查询结果的一个封装 视图里面的所有的数据,都是来自于它查询的那张表,试图本身不存储任何数据 能够封装复杂的查询结构 屏蔽表中的细节 语法: create [or replace] view 视图名称 as 查询语句 [with read only] 注意: 通常不要通过视图去修改,视图创建的时候,通常要加上with read only 例: create or replace view view_test1 as select ename,job,mgr from emp with read only; 同义词:synonym create synonym dept for view_test1; 8.序列 生成类似于auto_increment这样ID自动增长 1,2,3... auto_increment这个是mysql的 语法: create sequence 序列名称 start with 从几开始 increment by 每次增长多少 maxvalue 最大值| nomaxvalue minvalue 最小值| nominvalue cycle | nocycle 是否循环 cache 缓存的数量 | nocache 例: create sequence seq_test1 start with 1 increment by 2 maxvalue 30 cycle cache 10; 如何从序列中获取值 currval:当前值 nextval:下一个值 注意: currval 需要在nextval调用之后再调用 例: select seq_test1.nextval from dual; select seq_test1.currval from dual; 9.索引 (原理:平衡二叉树) 相当于一本书,能够提高我们的查询效率 如果某一列,经常用来作为查询条件,那么有必要创建索引,在数量比较多的情况下 语法: create index 索引的名称 on 表名(列); 例: create index ind_wubaiwan on wubaiwan(name); 创建复合索引 create index ind_wubaiwan on wubaiwan(name,address); 注意: 主键约束自带主键索引,唯一约束自带唯一索引 10.PLSQL入门 Procedure Language 过程语言,Oracle对SQL的一个扩展 语法: declare --声明变量 变量名 变量类型; 变量名 变量类型 := 初始值; 例: vsal emp.sal%type; --声明引用型的变量 vrow emp%rowtype; --声明记录型变量 begin --业务逻辑 end; dbms_outputput.put_line(); --相当于java的System.out.println(); 例: declare i varchar2(10) := '张三'; begin dbms_output.put_line(i); end; --查询7369号员工的工资,并打印出来 declare vsal emp.sal%type; begin --将查询结果赋值给vsal select sal into vsal from emp where empno=7369; dbms_output.put_line(vsal); end; --查询7369号员工的信息 declare vrow emp%rowtype; begin select * into vrow from emp where empno=7369; dbms_output.put_line(vrow); end; PL条件判断 语法: if then elsif then else end if; 例: --根据不同的年纪,输出相关的内容 declare age number := &aaa; --可以控制台输入,控制台输入付给aaa,aaa 赋给age begin if age < 18 then dbms_output.put_line('小屁孩'); elsif age >= 18 and age < 24 then dbms_output.put_line('年轻人'); elsif age > 24 and age < 45 then dbms_output.put_line('中年人'); else dbms_output.put_line('老年人'); end if; end; PL循环 语法: while循环 while 条件 loop end loop; for循环 for 变量 in[reverse] 起始值..结束值 loop end loop; loop循环 loop exit when 条件 end loop; 例: --输出1~10 while循环 declare i number := 1; begin while i <= 10 loop dbms_output.put_line(i); i := i+1; end loop; end; for循环 declare begin for i in 1..10 loop dbms_output.put_line(i); end loop; end; loop循环 declare i number := 1; begin loop exit when i > 10 dbms_output.put_line(i); i := i + 1; end loop; end;