Oracle day03 DDL,DML,视图,PLSQL编程

1.DDL语句管理表

1-1 创建表空间

创建表空间: 逻辑单位, 通常我们新建一个项目,就会去新建表空间,在表空间中创建用户来创建表

语法:
  create tablespace 表空间的名称
  datafile ‘文件的路径(服务器上)’
  size 大小
  autoextend on 自动扩展
  next 每次扩展的大小

--切换到system帐号下创建
--创建一个表空间 --- 汉东
create tablespace handong
datafile 'c:\handong.dbf'
size 100m
autoextend on
next 10m;


--删除表空间
drop tablespace handong;

1-2 创建用户

创建用户

语法
 create user 用户名
 identified by 密码
 default tablespace 表空间的名称

create user dakang
identified by dakang
default tablespace handong;

1-3 授权

授权

语法:
 grant 角色 | 权限 to 用户
enter description here

--授予connect角色
grant connect to dakang;
--授予resource角色
grant connect to dakang;
--授予 dba的角色
grant dba to dakang;

1-4 创建表

直接创建表

语法
create table 表名(
  列名 列的类型 [列的约束],
  列名 列的类型 [列的约束]
);
列的类型:
  varchar   在Oracle中,目前是支持的, 但是不保证以后还支持
  varchar2(长度)  可变字符长度   varchar2(10) hello 占5个字符
  char(长度)     固定长度字符   char(10) hello 占10个字符,用空格填充
  number(总长度,小数长度)   数字类型   --小数长度不能大于等于总长度
  date       年月日时分秒 2017/4/13 9:43:49
  timestamp 时间戳, 比date类型更加精确 13-APR-17 09.44.08.272000 AM +08:00
  LONG/CLOB :   存放一本小说
  BLOB :       存放电影 java 存进去, 再读取出来

create table test1(
 	  name1 varchar2(10),
  	 name2 char(10),
 	  age   number(5,3)    --此处总长度一定要大于小数长度
);

使用子查询的方式创建表

语法
  create table 表名 as 查询语句;
注意:
只会复制表结构和表中的数据,不会复制列的约束
如果查询语句有结果, 就是复制 表结构和数据
如果查询语句没有结果, 就是复制 表结构

--  create table 表名 as 查询语句; 复制表     
select * from scott.emp;

create table emp as select * from scott.emp;

--如果查询语句是没有任何的结果的,只复制表结构
select * from scott.emp where 1=2;
create table emp1 as select * from scott.emp where 1=2;

1-5 修改表

修改表:
  添加列
  修改列 vharchar2(10)
  删除列
  修改列名
  重命名表

--添加一列  
alter table stu add phone varchar2(11);

alter table stu add (
                          mobile varchar2(11),
                          sex    varchar2(2)
                     );

--修改列的类型
alter table stu modify sex varchar2(4);

--修改列名 sex --- gender
alter table stu rename column sex to gender;

--删除列
alter table stu drop column gender;

--修改表名
rename stu to student;

--删除表
drop table student;

1-6 约束

表的五大约束

列的约束: 约束主要是用来约束表中数据的规则
  主键约束: primary key 不能为空, 必须唯一
  非空约束
  唯一约束
  检查约束 check(条件) 在mysql中是可以写的,但是mysql直接忽略了检查约束
外键约束:
  主要是用来约束从表A中的记录,必须是存在于主表B中

create table student(
    stuid number primary key,
    sname varchar2(10) unique,
    age   varchar2(10) not null,
    gender varchar2(4) check( gender in ('男','女','人妖'))
);

外键约束:
  主要是用来约束从表A中的记录,必须是存在于主表B中

--商品分类表
create table category(
       cid number primary key,
       cname varchar2(20)
);

--创建一个商品表
create table product(
       pid number primary key,
       pname varchar2(20),
       cno number
);

--添加外键约束
alter table product add foreign key(cno) references category(cid);
insert into product values(10,'锤子',11);--插入失败

--1.首先主表中必须存在11号, 先往主表中插入数据,再往从表中插入数据
insert into category values(2,'电脑办公');
insert into product values(11,'外星人',2);


--删除Category
drop table category; --表中记录被外键关联无法删除

--强制删除表(不建议使用) : 先删除外键关联表的外键约束,然后再删除自己, 先删除product的外键约束,再删除category
drop table category cascade constraint;

--级联删除
----添加外键约束,使用级联约束  ,在删除的时候,使用级联删除
alter table product add foreign key(cno) references category(cid) on delete cascade;

--级联删除 : 首先去从表中找有没有 关联数据, 如果在从表中找到关联数据,先删除从表中关联数据,然后再删除表中的数据
delete from category where cid = 2;

2. DML管理表数据

2-1 插入数据

插入数据:
  insert into 表名 values(所有列的值都要对应写上)
  insert into 表名(列1,列2) values(值1,值2);
使用子查询插入数据
  insert into 表名 查询语句

--将emp中10号部门的员工信息,插入到emp1中
insert into emp1 select * from emp where deptno = 10;

2-2 更新数据

更新数据
update 表名 set 列名 = 列的值 [where 条件]

update emp1 set ename='HUAAN' where ename = 'KING';

2-3 删除数据

删除数据:
delete from 表名 [where 条件]

delete from emp1 where empno=7839;

delete和truncate 区别

delete truncate
DML DDL
逐条删除 先删除表再创建表
支持事务操作 不支持事务操作
执行效率要高

2-4 事务

事务:
  就是一系列的操作,要么都成功,要么都失败
四大特性:
  原子性,隔离性,持久性,一致性
如果不考虑隔离级别:
  脏读,虚读,不可重复读
MYSQL隔离级别:
  READ UNCOMMITTED , READ COMMITTED, REPEATABLE READ, SERIALIAZABLE
ORACLE隔离级别:
  READ COMMITTED SERIALIZABLE READ ONLY
默认隔离级别: READ COMMITTED
提交 : commit
事务的保存点/回滚点: savepoint 保存点的名称
回滚: rollback

create table louti(
   lou number primary key    
);
begin
  insert into louti values(1);
  insert into louti values(2);
  insert into louti values(3);
  insert into louti values(4);
  insert into louti values(5);
  savepoint dangban;
  insert into louti values(5);  --这行代码会发生异常
  insert into louti values(6);
  commit;
exception  --捕获异常
  when others then
     rollback to dangban;
     commit;
end;

3.其它数据库对象

3-1 视图

视图: 是对查询结果的一个封装
  视图里面所有的数据,都是来自于它查询的那张表,视图本身不存储任何数据
  1.能够封装复杂的查询结果
  2.屏蔽表中的细节
语法:
  create [or replace] view 视图的名称 as 查询语句 [ with read only]
注意: 通常不要通过视图去修改,视图创建的时候,通常要加上with read only
enter description here

--创建一个视图
create or replace view view_test1 as select ename,job,mgr from emp;

--通过视图修改数据
update view_test1 set ename='SMITH2' where ename = 'SMITH';

--创建一个只读视图
create or replace view view_test2 as select ename,job,mgr from emp with read only;

--同义词的概念
create synonym dept for view_test3;
create synonym yuangong for view_test2;

3-2 序列

序列: 生成类似于 auto_increment 这种ID自动增长 1,2,3,4,5…
.  auto_increment 这个是mysql
语法:
  create sequence 序列的名称
  start with 从几开始
  increment by 每次增长多少
  maxvalue 最大值 | nomaxvalue
  minvalue 最小值 | nominvalue
  cycle | nocycle 是否循环 1,2,3,1,2,3
  cache 缓存的数量3 | nocache 1,2,3,4,5,6
如何从序列获取值
  currval : 当前值
  nextval : 下一个值
注意: currval 需要在调用nextval之后才能使用

--创建一个 1,3,5,7,9......30 
create sequence seq_test1
start with 1
increment by 2
maxvalue 30
cycle
cache 10;

select seq_test1.nextval from dual;
select seq_test1.currval from dual;

--序列用的最多的一种写法
create sequence seq_test2;
select seq_test2.nextval from dual;

3-3 索引

索引:相当于是一本书的目录,能够提高我们的查询效率
  如果某一列,你经常用来作为查询条件,那么就有必要创建索引,数据量比较的情况
语法:
  create index 索引的名称 on 表名(列)
注意
  主键约束自带主键索引, 唯一约束自带唯一索引
索引原理: btree balance Tree 平衡二叉树
  如果某列作为查询条件的时候,可以提高查询效率,但是修改的时候,会变慢
  索引创建好之后,过了一段,DBA都会去做重构索引
SQL调优:
  1.查看执行计划F5
  2. 分析里面的cost 和 影响行数, 想办法降低
enter description here

--五百万数据测试
create table wubaiwan(
      name varchar2(30),
      address varchar2(20) 
);

--插入500000万条数据
declare
begin
     for i in 1..5000000 loop
       insert into wubaiwan values('姓名'||i,'地址'||i);
     end loop;
     commit;  
end;

--在没有添加索引的情况下,去查询  name='姓名3000000'  --2.985
select * from wubaiwan where name='姓名3000000';

--创建索引 name 再去查询 name='姓名3000000'
create index ind_wubaiwan on wubaiwan(name);
select * from wubaiwan where name='姓名3000000';  --0.016

--在没有添加复合索引的情况下,再去查询 name='姓名3000000' and '地址3000000'
select * from wubaiwan where name='姓名3000000' and address='地址3000000'; --0.032

--创建复合索引的情况下, 再去查询
create index ind_wubaiwan2 on wubaiwan(name,address);
select * from wubaiwan where name='姓名3000000' and address='地址3000000'; --0.015

4. PLSQL编程

4-1 输出

PLSQL编程 : procedure Language 过程语言 Oracle对SQL的一个扩展
  让我们能够像在java中一样写 if else else if 条件, 还可以编写循环逻辑 for while
语法
declare
  --声明变量
  变量名 变量类型;
  变量名 变量类型 := 初始值;
  vsal emp.sal%type; --引用型的变量
  vrow emp%rowtype; --声明记录型变量
begin
 --业务逻辑
end;

  dbms_output.put_line()相当于java中 syso

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的员工信息,并且打印出来
 select * from emp where empno = 7369;

declare
  vrow emp%rowtype;      
begin
  select * into vrow from emp where empno = 7369;
  
  dbms_output.put_line('姓名:'||vrow.ename || '工资'|| vrow.sal);
end;

4-2 条件判断

语法
if then
elsif then
else
end if;

--根据不同年纪,输出相关内容
declare
   age number := &aaa;
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 < 40 then
    dbms_output.put_line('老司机');
  else 
      dbms_output.put_line('老年人');    
  end if;
end;

4-3 循环操作

语法
while 循环
  while 条件 loop
  end loop;
for循环
  for 变量 in [reverse] 起始值…结束值 loop
  end loop;
loop循环
  loop
  exit when 条件
  end loop;

--输出1~10
declare
  i number :=1;
begin
  while i<=10 loop
    dbms_output.put_line(i);
    i := i+1;    
  end loop;
end;

--输出1~10
declare

begin
  for i in reverse 1..10 loop
    dbms_output.put_line(i);
  end loop;
end;

--输出1~10
declare
   i number :=1;
begin
   loop
     exit when i>10;
      dbms_output.put_line(i);  
     i := i+1;
   end loop;
end;

猜你喜欢

转载自blog.csdn.net/m_awdawdw/article/details/103964651