前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle学习笔记三

Oracle学习笔记三

作者头像
Kevin_Zhang
发布2018-08-20 17:38:03
3.1K0
发布2018-08-20 17:38:03
举报
文章被收录于专栏:Kevin-ZhangCGKevin-ZhangCG

一、创建表空间

表空间是ORACLE数据库的逻辑单元。数据库--表空间

  一个表空间可以与多个数据文件(物理结构)关联一个数据库下可以建立多个表空间,一个表空间可以建立多个用户个用户下可以建立多个表

代码语言:javascript
复制
create tablespace kevindata

datafile 'd:\kevindata.dbf'

size 100m

autoextend on

next 10m

  kevindata为表空间名称

  datafile指定表空间对应的数据文件

  size后定义的是表空间的初始大小

  autoextend on自动增长,当表空间存储都占满时,自动增长

  next后指定的是一次自动增长的大小。

二、用户

2.1 创建用户

代码语言:javascript
复制
create user kevinuser

identified by kevin

default tablespace kevindata 

  identified by后边是用户的密码

  default tablespace后边是表空间名称

oracle数据库与其它数据库产品的区别在于,表和其它的数据库对象都是存储在用户下的。

2.2 用户赋权限

新创建的用户没有任何权限,登陆后会提示

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用户可以操作全体用户的任意基表,包括删除

代码语言:javascript
复制
grant dba to kevinuser  

进入system用户下给用户赋予dba权限,否则无法正常登录

三、创建表

语法:

代码语言:javascript
复制
CREATE TABLE tablename (column datatype [DEFAULT expr][...])

数据的类型:

创建表范例:创建person表

代码语言:javascript
复制
create table person(

pid number(10) ,

name varchar2(10),

  gender number(1) default 1,

birthday date

);

Insert into person(pid,name,gender,birthday)

values(1,”Kevin”,1,to_date(‘2018-08-14’,’yyyy-MM-dd’));

四、修改表

在sq中使用ater可以修改表

添加语法: 

代码语言:javascript
复制
ALTER TABLE 表名称 ADD(列名1 类型 [DEFAULT默认值],列名1类型

[ DEFAULT默认值].)

修改语法: 

代码语言:javascript
复制
ALTER TABLE表名称 MODIFY(列名1类型 [DEFAULT默认值],列名1类型

DEFAULT默认值])

修改列名: 

代码语言:javascript
复制
ALTER TABLE表名称 RENAME COLUMN列名1T0列名2

范例:在 person表中增加列 address

代码语言:javascript
复制
alter table person add(address varchar2 (10))

范例:把 person表的 addres列的长度修改成20长度

代码语言:javascript
复制
alter table person modify(address varchar 2(20)

五、删除表

语法:

代码语言:javascript
复制
DROP TABLE 表名

六、约束

在数据库开发中,约束是必不可少,使用约束可以更好的保证数据的完整性。在 Oracle数据库中,约束的类型包括:

主键约束( Primary Key)

  非空约束( Not nu)

  唯一约束( Unique)

  外键约東( Foreign Key)

  检查性约束( Check)

6.1 主键约束

主键约束都是在id上使用,而且本身已经默认了内容不能为空,可以在建表的时候指定。

范例:创建一张表,把pid作为主键

代码语言:javascript
复制
create table person

pid

number(10) primary key,

name

varchar 2 (10)

gender number(1)default 1,

birthday date 

  主键不可重复

6.2 非空约束

使用非空约束,可以使指定的字段不可以为空。

范例:建立一张pd和name不可以为空的表

代码语言:javascript
复制
create table person(

oid number(10) not null,

namemvarchar 2(10)not null,

gender number (1),

birthday date);

 

错误:insert into person values(l,null,null,to_date(2012-12-12,'yyyy-MM-dd'));

6.3 唯一约束

表中的一个字段的内容是唯一的

范例:建表一个name是唯一的表

代码语言:javascript
复制
create table person(

p number (10)

name varchar 2(10)unique

gender number (1)

birthday date);


insert into person values(1,'zhangsan',3,to_date(2012-12-12,'yyyy-MM-dd));

错误:insert into person values(2,'zhangsan',3,to_date(2012-12-12,'yyyy-MM-dd));

6.4 检查约束

使用检査约束可以来约束字段值的合法范围。

范例:创建一张表性别只能是1或2

代码语言:javascript
复制
create table person

pid

number (10)

name

varchar2(10),

gender number(1) check(gender in (1, 2)),

birthday date

 

insert into person values(1,' zhangsan,3, to date(2012-12-12,' yYyy-MM-dd))

6.5 外键约束

外键关联一定注意

  外键一定是主表的主键

  删表时一定先删子表再删主表,如果直接删主表会出现由于约束存在无法删除的问题

代码语言:javascript
复制
SQL> drop table orders

drop table orders


ORA-02449:表中的唯一/主键被外键引用

  但是可以强制删除 drop table orders cascade constraint;(不建议),删除主表的数据可以先删除子表的关联数据,再删主表,也可以使用级联删除。

  级联删除在外键约束上要加上 on delete cascade如

代码语言:javascript
复制
constraint order detail order id fk foreign key(order_ id)

references orders(order id)on delete cascade

这样删除主表数据的时候会把字表的关联数据一同删除

七、使用DML语句处理数据

7.1 插入数据

语法: 

代码语言:javascript
复制
INSERT INTO 表名[列名1,列名2,… ] VALUES(值1,值2,…);

标准写法

代码语言:javascript
复制
insert into person(pid,name,gender,birthday,address) values(1,'张三',1,'9-5月-1981','Beijing');

简单写法(不建议)

代码语言:javascript
复制
INSERT INTO表名 VALUES(值1,值2,…)

insert into person

values(1,张三,1,9-5月-1981,北京北七家")

注意:使用简单的写法必须按照表中的字段的顺序来插入值,而且如果有为空的字段使用null

代码语言:javascript
复制
insert into person values(2李四’,1,nu北京育新");

7.2 更新数据

全部修改: 

代码语言:javascript
复制
UPDATE 表名 SET 列名1=值1,列名2=值2;

局部修改: 

代码语言:javascript
复制
UPDATE 表名 SET 列名1=值1,列名2=值2,… WHERE修改条件;

在 update中使用子查询:

例如:给 NEW YORK地区的所有员工涨100员工资

代码语言:javascript
复制
update emp set sal=sal+100 where deptno in(select deptno from dept where loc = 'NEW YORK');

7.3 删除数据

语法:

代码语言:javascript
复制
DELETE FROM 表名 WHERE 删除条件;

  在删除语句中如果不指定删除条件的话就会删除所有的数据。Truncate table实现数据删除。

比较 truncat与 delete实现数据删除?

  delete删除的数据可以 rollback,也可以闪回

  delete删除可能产生碎片,并且不释放空间

truncate是先摧毁表结构,再重构表结构

注意:插入、更新和删除会引起数据的变化。我们就必须考虑数据的完整性。

八、Oracle中的事务

这是因为 oracle的事务对数据库的变更的处理,我们必须做提交事务才能让数据真正的插入到数据库中,在同样在执行完数据库变更的操作后还可以把事务进行回滚,这样就不会插入到数据库。如果事务提交后则不可以再回滚。

  提交:commit

  回滚::rollback

Oracle中事务的保存点:

事务的隔离级别和属性:

  Oracle支持的3种事务隔离级别:READ COMMITEDSERIALIZABLEREAD ONLY;Oracle默认的事务隔离级别为::READ COMMITED

九、管理其他数据库对象

9.1视图

什么是视图:视图就是封装了一条复杂查询的语句。视图是一个虚表,它最大的优点就是简化复杂的查询。

创建视图的语法

代码语言:javascript
复制
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW viewname AS subquery

创建视图示例

范例:建立一个视图,此视图包括了20部门的全部员工信息

代码语言:javascript
复制
create view empvd20 as select from emp t where t.deptno = 20

视图创建完毕就可以使用视图来查询,查询出来的都是20部门的员工

代码语言:javascript
复制
select from empvd20 t 

语法2: 

代码语言:javascript
复制
CREATE OR REPLACE VIEW 视图名称 AS 子查询

如果视图已经存在我们可以使用语法2来创建视图,这样已有的视图会被覆盖

代码语言:javascript
复制
create or replace view empvd20 as select * from emp t where t.deptno= 20

注意:不建议通过视图对表中的数据进行修改,因为会受到很多的限制

9.2 序列

在很多数据库中都存在一个自动增长的列,如果现在要想在 oracle中完成自动增长的功能,则只能依靠序列完成所有的自动增长操作需要用户手工完成处理。并且 Oracle将序列值装入内存可以提高访问效率。

语法:

代码语言:javascript
复制
CREATE SEQUENCE sequence

[INCREMENT BY n],

[START WITH n]

[{MAXVALUE n I NOMAXVALUE}]

[[MINVALUE n I NOMINVALUE }]

[{CYCLE | NOCYCLE}]

[I{CACHE n I NOCACHE}];

范例:

代码语言:javascript
复制
CREATE SEQUENCE dept deptid sea

INCREMENT BY 10

START WITH 120

MAXVALUE 9999

NOCACHE

NOCYCLE

序列创建完成之后所有的自动增长应该由用户自己处理所以在序列中提供了以下的两种操作:

nextval:取得序列的下一个内容

currval:取得序列的当前内容

在插入数据时需要自增的主键中可以这样使用

代码语言:javascript
复制
insert into person

value( seqpersonid.nextval,’Kevin',1,nu11,’Beijing');

序列可能产生裂缝的原因:

  回滚

  系统异常

  多个表共用一个序列

9.3 索引

索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低谚o次数,从而提高数据访问性能。

1.单列索引

单列索引是基于单个列所建立的索引,比如:

代码语言:javascript
复制
CREATE index 索引名 on 表名(列名)

2.复合索引

复合索引是基于两个列或多个列的索引。在同一张表上可以有多个索引,但是要求列的组合必须不同,比如:

代码语言:javascript
复制
Create index emp idx1 on emp(ename, job);

Create index emp idx 1 on emp(job, ename)

范例:给 person表的name建立索引

代码语言:javascript
复制
create index pname index on person (name);

范例:给 person表创建一个name和 gender的索引

代码语言:javascript
复制
create index pname gender index on person name, gender

3.索引测试

创建一个新表,向表中插入100W或500W条数据,记录查询一条数据所用时间,之后创建索引,后再査询一条数据,比较两条数据查询的时间。

创建表

代码语言:javascript
复制
create table t test(

tid number

tname varchar2 (30)

创建序列

create sequence seq test

插入数据

代码语言:javascript
复制
begin

  for i in1..5000000

  loop

    insert into t test values( seq_test.nextval,’测试数据’||i);

  end loop;

  commit;

end;

随便查询一条数据

代码语言:javascript
复制
select* from t test where tname=测试数据4789889; 用时:1797s

-创建索引

代码语言:javascript
复制
create index index test on t test(tname)

select* from t test where tname=测试数据4889889; 用时:0.047

9.4 同义词

代码语言:javascript
复制
CREATE [PUBLIC] SYNONYM synonym

FOR

object;

例如:

代码语言:javascript
复制
create publiC synonym emp for scott. emp;

select from emp;

drop public synonym emp;

同义词的作用:

  可以很方便的访问其它用户的数据库对象

  缩短了对象名字的长度

十、PL/SQL编程语言

10.1什么是PL/SQL?

PL/SQL (Procedure Language /SQL)是 Oracle对sql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,使得 PLSQL面向过程但比过程语言简单、高效、灵活和实用。

范例1:为职工涨工资,每人涨10%的工资。

代码语言:javascript
复制
update emp set sal=sal* 1.1

范例2:例按职工的职称长工资,总裁涨1000元,经理涨800元,其他人员涨400元。

这样的需求我们就无法使用一条SQL来实现,需要借助其他程序来帮助完成,也可以使用PL/SQL 。

10.2 PL/SQL语法

代码语言:javascript
复制
declare

  说明部分(量说明,光标申明,例外说明)

begin

  语句序列(DM语句)…

excepton

  例外处理语句

End

10.3 常亮和变量的定义

说明变量:

引用变量:Myname emp.ename%type

引用型变量,即 my name的类型与emp表中 ename列的类型一样,在sql中使用into来赋值

代码语言:javascript
复制
declare

  emprec emp ename%type;

begin

  select t ename into emprec from emp t where t empno = 7369;

  dbms output. put line(emprec);

end.

记录型变量:Emprec emp%rowtype

记录变量分量的引用

Emp_rec.ename: =’ADAMS’;

代码语言:javascript
复制
declare

  p empyorowtype;

begin

  select into p from emp t where t empno =7369

  dbms output put line(p ename ||'ll p. sal);
  
end

10.4 IF语句

语法1:

代码语言:javascript
复制
IF 条件 THEN 语句1 :

  语语2;

END IF;

语法2:

代码语言:javascript
复制
IF 条件 THEN 语句序列1;

ELSE 语句序列2;

END IF;

语法3:

代码语言:javascript
复制
IF 条件 THEN 语句;

ELSIF 语 句 THEN 语句;

ELSE 语句;

END IF; 

范例1:如果从控制台输入1则输出我是1

代码语言:javascript
复制
declare

  pnum number =&num

begin

  if pnum =1 then

    dbms_ output put line(我是1");

  end if:

end;

范例2:如果从控制台输入1则输出我是1否则输出我不是1

代码语言:javascript
复制
declare

  mynum number: =#

begin

  if bynum =1 then

  dbms_ output put line(我是1

  dbms output put line(我不是1);

  end if;

end;

范例3:判断人的不同年龄段18岁以下是未成年人,18岁以上40以下是成年人,40以上是老年人

代码语言:javascript
复制
declare

  mynum number =#

begin

  if bynum 18 then

  dbms_ output put line(未成年人);

  elsif mynum > 18 and mynum 40 then

    dbms_ output put line(中年人);

  elsif mynum >=40 then

  dbms_ output put line(老年人"

  end if;

end;

10.5 循环

语法:

范例:使用语法1输出1到10的数字

代码语言:javascript
复制
declare

  step number = 1

begin

  while step < 10 loop

  dbms output put line(step)

    step: step+ 1

  end loop;

end;

范例:使用语法2输出1到10的数字

代码语言:javascript
复制
declare

  step number = 1;

begin

  exit when step >10

  dbms output put line(step);

    step: =step+ 1

  end loop;

end;

范例:使用语法3输出1到10的数字

代码语言:javascript
复制
declare

    step number =1

begin

  for step in 1.. 10 loop

  dbms output put line(step)

  end loop;

end;

十一: SQL练习

多表查询:   内联接   等值联接   inner join   外连接:     left outer join     right outer join     Oracle特有的写法(+) --内联接的结果

代码语言:javascript
复制
select * from emp e1,emp t1 where e1.mgr = t1.empno;

--t1表里面的所有记录都会显示出来, 如果t1.empno 在e1.mgr中没有对应的记录,就加空值

代码语言:javascript
复制
select * from emp e1,emp t1 where e1.mgr(+) = t1.empno;

--查询不是领导的员工编号

代码语言:javascript
复制
select empno from emp where empno not in (select mgr from emp where mgr is not null);

--获取员工的名字和部门的名字

代码语言:javascript
复制
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;

----使用子查询的方式来完成

代码语言:javascript
复制
select ename,deptno from emp;

select ename,deptno,deptno from emp;

--关联子查询, 子查询依赖外部查询的条件

代码语言:javascript
复制
select e.ename,e.deptno,(select d.dname from dept d where d.deptno = e.deptno ) aa from emp e;

--统计薪资大于薪资最高的员工所在部门的平均工资和薪资最低的员工所在部门的平均工资的平均工资的员工信息。

Oracle体系结构: 数据库 ---> 数据库实例ORCL ---> 表空间 (用户里面的创建表) ---> 数据文件 地球 ---> 中国 ---> 省份 (人民) ---> 土地山川河流 雄安新区 ---> 人(开发荒地,种地) 创建表空间: 逻辑单位, 通常我们新建一个项目,就会去新建表空间,在表空间中创建用户来创建表 语法:

代码语言:javascript
复制
create tablespace 表空间的名称
datafile '文件的路径(服务器上)'
size 大小
autoextend on 自动扩展
next 每次扩展的大小

--切换到system帐号下创建 --创建一个表空间 --- 汉东

代码语言:javascript
复制
create tablespace handong
datafile 'c:\handong.dbf'
size 100m
autoextend on
next 10m;

--删除表空间

代码语言:javascript
复制
drop tablespace handong;

创建用户

代码语言:javascript
复制
create user 用户名
identified by 密码
default tablespace 表空间的名称
代码语言:javascript
复制
create user dakang
identified by dakang
default tablespace handong;

授权 grant 角色 | 权限 to 用户

代码语言:javascript
复制
grant connect to dakang;

--授予 dba的角色

代码语言:javascript
复制
grant dba to dakang;
代码语言:javascript
复制
select * from scott.emp;

创建表:

代码语言:javascript
复制
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 存进去, 再读取出来

使用子查询的方式创建表

代码语言:javascript
复制
create table 表名 as 查询语句; 

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

代码语言:javascript
复制
create table test1(
name1 varchar2(10),
name2 char(10),
age number(2,3) 
);

insert into test1(name1,name2) values('hello','hello');

select * from test1 where name1 like 'hello'; --可以查询数据
select * from test1 where name2 like 'hello'; --查不出数据

insert into test1(age) values(2);

select current_date from dual;
select current_timestamp from dual;

select * from test1;

-- create table 表名 as 查询语句; 复制表

代码语言:javascript
复制
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;


select * from emp1;

修改表:   添加列   修改列 vharchar2(10)   删除列   修改列名   重命名表 SQL分类: DDL : 数据定义语言, 修改的结构 alter create drop truncate DML : 数据操纵语言 , 操作表中数据 insert update delete DCL : 数据控制语言 , grant  DQL : select

代码语言:javascript
复制
create table stu(
stuid number,
sname varchar(10) 
);

--添加一列

代码语言:javascript
复制
alter table stu add phone varchar2(11);

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

--修改列的类型

代码语言:javascript
复制
alter table stu modify sex varchar2(4);

--修改列名 sex --- gender

代码语言:javascript
复制
alter table stu rename column sex to gender;

--删除列

代码语言:javascript
复制
alter table stu drop column gender;

--修改表名

代码语言:javascript
复制
rename stu to student;

--删除表

代码语言:javascript
复制
drop table student;

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

代码语言:javascript
复制
create table student(
stuid number primary key,
sname varchar2(10) unique,
age varchar2(10) not null,
gender varchar2(4) check( gender in ('男','女','人妖'))
);

--主键约束违反

代码语言:javascript
复制
insert into student values(1,'张三','31','男');
insert into student values(1,'李四','31','男');

--唯一约束违反

代码语言:javascript
复制
insert into student values(1,'徐立','31','男');
insert into student values(2,'徐立','31','男');

--非空约束

代码语言:javascript
复制
insert into student values(1,'徐立',null,'男');

--检查约束

代码语言:javascript
复制
insert into student values(1,'徐立','31','男');

insert into student values(1,'徐立','31','妖');

select * from student;

--商品分类表

代码语言:javascript
复制
create table category(
cid number primary key,
cname varchar2(20)
);

--创建一个商品表

代码语言:javascript
复制
create table product(
pid number primary key,
pname varchar2(20),
cno number
);

insert into category values(1,'手机数码');

insert into product values(10,'锤子',11);

--添加外键约束

代码语言:javascript
复制
alter table product add foreign key(cno) references category(cid);
insert into product values(10,'锤子',11);--插入失败

--1.首先主表中必须存在11号, 先往主表中插入数据,再往从表中插入数据

代码语言:javascript
复制
insert into category values(2,'电脑办公');
insert into product values(11,'外星人',2);

--删除Category

代码语言:javascript
复制
drop table category; --表中记录被外键关联无法删除

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

代码语言:javascript
复制
drop table category cascade constraint;

--级联删除 ----添加外键约束,使用级联约束 ,在删除的时候,使用级联删除

代码语言:javascript
复制
alter table product add foreign key(cno) references category(cid) on delete cascade;


insert into category values(2,'电脑办公');
insert into product values(11,'外星人',2);

--级联删除 : 首先去从表中找有没有 关联数据, 如果在从表中找到关联数据,先删除从表中关联数据,然后再删除表中的数据

代码语言:javascript
复制
delete from category where cid = 2;


select * from category;
select * from product;

drop table product;
truncate table product;
truncate table category;

插入数据:

代码语言:javascript
复制
insert into 表名 values(所有列的值都要对应写上)
insert into 表名(列1,列2) values(值1,值2);

使用子查询插入数据

代码语言:javascript
复制
insert into 表名 查询语句

select * from emp1;

select * from emp;

--将emp中10号部门的员工信息,插入到emp1中

代码语言:javascript
复制
insert into emp1 select * from emp where deptno = 10;

更新数据

代码语言:javascript
复制
update 表名 set 列名 = 列的值 [where 条件]

update emp1 set ename='HUAAN' where ename = 'KING';
select * from emp1;

删除数据:

代码语言:javascript
复制
delete from 表名 [where 条件]

delete和truncate 区别

delete: truncate:

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

代码语言:javascript
复制
delete from emp1 where empno=7839;

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

代码语言:javascript
复制
create table louti(
lou number primary key 
);

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);
rollback to dangban
commit;


declare

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;

select * from louti;

视图: 是对查询结果的一个封装   视图里面所有的数据,都是来自于它查询的那张表,视图本身不存储任何数据   1.能够封装复杂的查询结果   2.屏蔽表中的细节 语法: 

代码语言:javascript
复制
create [or replace] view 视图的名称 as 查询语句 [ with read only]

注意::通常不要通过视图去修改,视图创建的时候,通常要加上with read only

代码语言:javascript
复制
select * from emp;

--创建一个视图

代码语言:javascript
复制
create or replace view view_test1 as select ename,job,mgr from emp;

--通过视图修改数据

代码语言:javascript
复制
update view_test1 set ename='SMITH2' where ename = 'SMITH';

--创建一个只读视图

代码语言:javascript
复制
create or replace view view_test2 as select ename,job,mgr from emp with read only;

update view_test2 set ename='SMITH3' where ename = 'SMITH2';

--视图封装复杂的查询语句

代码语言:javascript
复制
create view view_test3 as select
sum(cc) "TOTAL",
sum(case yy when '1980' then cc end) "1980",
sum(case yy when '1981' then cc end) "1981",
sum(case yy when '1982' then cc end) "1982",
sum(case yy when '1987' then cc end) "1987"
from
(select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt;

--同义词的概念

代码语言:javascript
复制
create synonym dept for view_test3;


create synonym yuangong for view_test2;

select * from yuangong;

select * from dept;

select * from view_test3;

select * from view_test2;

序列: 生成类似于 auto_increment 这种ID自动增长 1,2,3,4,5.... auto_increment 这个是mysql  语法:

代码语言:javascript
复制
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 

代码语言:javascript
复制
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;

--序列用的最多的一种写法

代码语言:javascript
复制
create sequence seq_test2;
select seq_test2.nextval from dual;


create sequence seq_test3
start with 1
increment by 2
maxvalue 30
minvalue 0
cycle
cache 10;

select seq_test3.nextval from dual;

索引:相当于是一本书的目录,能够提高我们的查询效率,如果某一列,你经常用来作为查询条件,那么就有必要创建索引,数据量比较的情况 语法: 

代码语言:javascript
复制
create index 索引的名称 on 表名(列) 

注意:主键约束自带主键索引, 唯一约束自带唯一索引 索引原理:btree balance Tree 平衡二叉树 如果某列作为查询条件的时候,可以提高查询效率,但是修改的时候,会变慢 索引创建好之后,过了一段,DBA都会去做重构索引 SQL调优:   1.查看执行计划F5   2. 分析里面的cost 和 影响行数, 想办法降低 --五百万数据测试

代码语言:javascript
复制
create table wubaiwan(
name varchar2(30),
address varchar2(20) 
);

insert into wubaiwan values('')

--插入500000万条数据

代码语言:javascript
复制
declare

begin
for i in 1..5000000 loop
insert into wubaiwan values('姓名'||i,'地址'||i);
end loop;
commit; 
end;

--在没有添加索引的情况下,去查询 name='姓名3000000' --2.985

代码语言:javascript
复制
select * from wubaiwan where name='姓名3000000';

--创建索引 name 再去查询 name='姓名3000000'

代码语言:javascript
复制
create index ind_wubaiwan on wubaiwan(name);
select * from wubaiwan where name='姓名3000000'; --0.016

--在没有添加复合索引的情况下,再去查询 name='姓名3000000' and '地址3000000'

代码语言:javascript
复制
select * from wubaiwan where name='姓名3000000' and address='地址3000000'; --0.032

--创建复合索引的情况下, 再去查询

代码语言:javascript
复制
create index ind_wubaiwan2 on wubaiwan(name,address);
select * from wubaiwan where name='姓名3000000' and address='地址3000000'; --0.015 

DDL表空间操作:   创建表空间   创建用户   授权 创建表   子查询创建表 修改表 : 添加列,删除列,修改列,修改列名, 修改表名 约束:   主键约束,唯一约束,非空约束,检查约束,外键约束 外键约束:   强制删除   级联删除 DML表中数据:   插入数据   子查询插入数据   更新数据   删除数据: delete 和 truncate 事务操作:   savepoint 保存点   rollback to 保存点   ORACLE事务隔离级别 : READ COMMITTED  视图: 就像窗户一样, 封装查询结果 , 通常视图创建只读视图 序列: 主要是用来实现ID自增长 索引: 相当于是书的目录,能够提高查询效率, 原理 平衡二叉树, 每隔一段时间DBA都需要去重建索引 同义词: create synonym 名称 for 对象的名称

PLSQL编程 : procedure Language 过程语言 Oracle对SQL的一个扩展,让我们能够像在java中一样写 if else else if 条件,还可以编写循环逻辑 for while

代码语言:javascript
复制
declare
--声明变量
  变量名 变量类型;
  变量名 变量类型 := 初始值;
  vsal emp.sal%type; --引用型的变量 
  vrow emp%rowtype; --声明记录型变量 
begin
--业务逻辑
end;

dbms_output.put_line()相当于java中 syso 

代码语言:javascript
复制
declare
  i varchar2(10) := '张三'; 
begin
  dbms_output.put_line(i);
end;

--查询7369的工资,并且打印出来

代码语言:javascript
复制
declare
vsal emp.sal%type;
begin

--将查询出的结果赋值给vsal

代码语言:javascript
复制
select sal into vsal from emp where empno = 7369;

dbms_output.put_line(vsal);
end;

--查询7369的员工信息,并且打印出来

代码语言:javascript
复制
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;

PL条件判断

代码语言:javascript
复制
if then

elsif then

else 

end if;

--根据不同年纪,输出相关内容

代码语言:javascript
复制
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;

循环操作 while 循环

代码语言:javascript
复制
while 条件 loop
end loop;

for循环

代码语言:javascript
复制
for 变量 in [reverse] 起始值..结束值 loop

end loop;

loop循环

代码语言:javascript
复制
loop
exit when 条件
end loop;

--输出1~10

代码语言:javascript
复制
declare
  i number :=1;
begin
  while i<=10 loop
    dbms_output.put_line(i);
    i := i+1; 
  end loop;
end;

--输出1~10

代码语言:javascript
复制
declare

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

--输出1~10

代码语言:javascript
复制
declare
  i number :=1;
begin
  loop
   exit when i>10;
    dbms_output.put_line(i); 
    i := i+1;
  end loop;
end;

输出 m  x : [-m,m] y : [-m,m] 输出所有满足条件的 : abs(y)+abs(x) <=m m取值 --使用PLSQL输出菱形

代码语言:javascript
复制
declare
  m number := 10;
begin
  for x in -m..m loop
    for y in -m..m loop
      if abs(y) + abs(x) <= m then
        dbms_output.put('*');
      else
        dbms_output.put(' ');
      end if; 
    end loop;
      dbms_output.new_line();
  end loop; 
end;

--使用PLSQL输出三角形,只要是三个角

代码语言:javascript
复制
declare
  m number := 10;
begin
  for x in reverse -m..m loop
    for y in -m..m loop
      if abs(y) + abs(x) <= m and x>=0 then
        dbms_output.put('*');
      else
        dbms_output.put(' ');
      end if; 
    end loop;
      dbms_output.new_line();
  end loop; 
end;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、创建表空间
  • 二、用户
    • 2.1 创建用户
      • 2.2 用户赋权限
      • 三、创建表
      • 四、修改表
      • 五、删除表
      • 六、约束
        • 6.1 主键约束
          • 6.2 非空约束
            • 6.3 唯一约束
              • 6.4 检查约束
                • 6.5 外键约束
                • 七、使用DML语句处理数据
                  • 7.1 插入数据
                    • 7.2 更新数据
                      • 7.3 删除数据
                      • 八、Oracle中的事务
                      • 九、管理其他数据库对象
                        • 9.1视图
                          • 9.2 序列
                            • 9.3 索引
                              • 1.单列索引
                              • 2.复合索引
                              • 3.索引测试
                            • 9.4 同义词
                            • 十、PL/SQL编程语言
                              • 10.1什么是PL/SQL?
                                • 10.2 PL/SQL语法
                                  • 10.3 常亮和变量的定义
                                    • 10.4 IF语句
                                      • 10.5 循环
                                      • 十一: SQL练习
                                      相关产品与服务
                                      对象存储
                                      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                                      领券
                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档