Oracle学习的第三天(使用DDL语句管理表_视图_序列_索引_PLSQL入门)

一、使用DDL语句管理表

1.Oracle的体系结构

数据库--> 数据库实例Orcl--> 表空间(创建用户,创建表)--> 数据文件

2.创建数据库表空间

--创建表空间
create tablespace datafile
--创建表空间文件的路径
datafile 'D:\oracle\io\datafile.dbf'  
--表空间文件的初始化大小
size 10M
--如果空间不够自动扩展
autoextend on
--自动扩展5M
next 5M
--删除表空间
drop tablespace datafile;

3.创建用户

--创建用户
create user jerry --用户名
identified by 123 --密码
default tablespace datafile; --用户默认存在的表空间
--给用户赋予权限
grant dba to jerry 

4.重新使用jerry 123 orcl nomal登录,然后查询select * from scott.emp;
5.字段常用的数据类型

char 固定长度字符串 最大长度2000 bytes    
varchar2 可变长度的字符串 最大长度4000 bytes  可做索引的最大长度749 
nchar 根据字符集而定的固定长度字符串 最大长度2000 bytes    
nvarchar2 根据字符集而定的可变长度字符串 最大长度4000 bytes   
number(总长度,小数长度)  数字类型
date  日期类型
Timestamp 时间戳  比date更加精确

select current_timestamp from dual

select current_date from dual

6.创建表

--使用普通的方式创建表
create table test1(
    name varchar(10),
    address char(10),
    age number(3)
)
-- 往test1表中插入数据
insert into test1 values('张三','长沙',25);
select * from test1
--使用子查询的方式创建表 create table 表名 as 查询语句
--注意:这种复制表结构的数据只会复制表的结构和数据,并不会复制表的约束
--如果只想复制表结构,那么as后面的查询语句可以是一个没有查询结果的语句
create table emp as select * from scott.emp;  --复制了表结构和数据,但不会复约束
create table emp1 as select * from scott.emp where 1=2; --由于这个查询语句查询不到结果所以只复制表结构
select * from emp1;

7.修改表:修改表包括添加字段,删除字段,修改字段的名称,修改字段的数据类型,修改表名称,删除表等等

create table stu(
    stuId number,
    sname varchar2(10)
)
--添加一列
alter table stu add address varchar2(30);
alter table stu add sex varchar2(10);
alter table stu add email varchar2(10);
--修改字段的数据类型
alter table stu modify sname varchar(15);
--修改列名
alter table stu rename column sex to gender;
--删除列名
alter table stu drop column email;
--修改表名
rename stu to student;

8.约束:用来约束表中数据的规则,约束主要有主键约束、非空约束、唯一约束、检查约束、外键约束。

单表约束

--删除表
drop table student;
--在创建表的同时添加约束
create table student(
    stuid number primary key, --主键约束
    sname varchar2(20) not null, --非空约束
    email varchar2(10) unique, --唯一约束
    gender varchar2(2) check(gender in ('男','女'))--检查约束
)
alter table student modify gender varchar2(4);
insert into student values(1,'张三','456@qq.com','男');
select * from student;

多表约束

--创建商品类别表
create table category(
    cid number primary key,
    cname varchar2(30) not null
)
--商品表
create table product(
    pid number primary key,
    pname varchar2(10) not null,
    cid number
)
--给商品表添加外键约束
alter table product add foreign key(cid) references category(cid);
--分别给两个表插入数据
insert into category values(1,'手机数码');
insert into product values(1,'redmiNote7',1)
--存在主外键关系的表,主键表是不能直接删除的,但是可以忽略外键约束强制删除
--强制删除的步骤是先删除约束,再删除表(不建议使用,这样会破坏表的完整性)
drop table category cascade constraint;
--可以在设置外键约束的时候设置级联删除
alter table product add foreign key(cid) references category(cid) on
delete cascade;
--级联删除:先去外键表查询是否存在关联数据,如果存在就先删除外键表中的关联数据,然后再删除主表中的数据
delete from category where cid=1

9.Delete和truncate删除数据的区别

语法:DELETE FROM 表名 WHERE 删除条件;
在删除语句中如果不指定删除条件的话会删除所有的数据
Truncate table 实现数据删除

比较truncate与delete实现数据删除?
delete删除的数据可以rollback,也可以闪回
delete删除可能会产生碎片,并且不释放空间
truncate是先摧毁表结构,再重构表结构

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

1.什么是视图:

视图是对查询结果的一个封装,能够封装复杂的查询结果,屏蔽表中的细节。视图里面所有的数据本身来源于查询的那张表。视图本身不存储任何的数据

2.视图与表之间的区别:

1、表需要占用磁盘空间,视图不需要
2、视图不能添加索引(所以查询速度略微慢点)
3、使用视图可以简化,复杂查询
4、视图的使用利于提高安全性

3.Oracle的视图大约可以分为以下几类

1、简单视图,基于单个表所建视图,不包含任何函数、表达式及分组数据的视图。
2、复杂视图,包含函数、表达式或者分组数据的视图。
3、连接视图,基于多表所建立的视图。
4、只读视图,只允许执行查询操作。
5、内联视图(Inline View),也叫内嵌视图、临时视图、行内视图、或内建视图,它是出现在FROM子句中的子查询,内联视图不属于数据库对象。

4.语法:create [or replace] view 视图的名称 as 查询语句 [with read only]

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

5.应用

--创建一个视图
create or replace view view_test1 as select ename,job,mgr from emp;
--直接从视图中去查就行
select * from view_test1
--注意:通常不需要通过视图去修改数据,视图创建的时候一般设置成只读状态(with read only)
create or replace view view_test2 as select ename,job,mgr from emp with read only;
--查询视图
select * from view_test2;
--不能修改视图
update view_test2 set mgr = 7901 where ename='SMITH';
--创建同义词
create synonym view_test3 for view_test2;
select * from view_test3;
三、序列

1.序列:类似设置auto_increment这种ID自动增长
在这里插入图片描述

-- 调用序列
select seq_test1.nextval from dual;  --序列最开始是指向0,必须调用nextval才能显示1
select seq_test1.currval from dual;  --如果一开始就调用当前序列是不行的,因为指针还没指向1,所以会报错


--序列最常用的写法
create sequence seq_test2;
select seq_test2.nextval from dual;
--如何使用序列
create table test_sequence(
    pid number primary key,
    pname varchar2(10) not null
)
insert into test_sequence values(seq_test2.nextval,'sunny')
select * from test_sequence;
--删除序列
drop table test_sequence;
--删除表
drop sequence seq_test2;


2.oracle序列为什么不是从1开始

当我们使用序列作为插入数据时,如果使用了“延迟段”技术,则跳过序列的第一个值
Oracle从 11.2.0.1版本开始,提供了一个“延迟段创建”特性
当我们创建了新的表(table)和序列(sequence),
在插入(insert)语句时,序列会跳过第一个值(1)。
所以结果是插入的序列值从2(序列的第二个值) 开始,而不是1开始。

想要解决这个问题有两种方法: 
1.更改数据库的“延迟段创建”特性为false(需要有相应的权限)
	ALTER SYSTEM SET deferred_segment_creation=FALSE;
2.在创建表时让seqment立即执行
CREATE TABLE tbl_test(
    test_id NUMBER PRIMARY KEY, 
    test_name VARCHAR2(20)
)
SEGMENT CREATION IMMEDIATE;
四、索引

1.什么是索引

2.添加索引会影响增删改效率。
3.索引分为单列索引和复合索引。

单行索引的触发规则,条件必须是索引列中的原始值,单行函数。模糊查询都会影响索引的触发。
复合索引的触发规则,复合索引中的第一列为优先检索列,必须要包含优先检索列中的原始值

五、PLSQL入门

declare
  i varchar2(30):='张三';
begin
  dbms_output.put_line(i);
end;
--查询7639的工资并打印出来
declare 
  vsal emp.sal%type;
begin
  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.empno||'工资'||vrow.sal);
end;

//根据不同的年龄,输出不同的内容
declare
  age number:=12;
begin
  if age<=18 then
    dbms_output.put_line('小屁孩');
  elsif age>18 and age<=30 then
    dbms_output.put_line('年轻');
  elsif age>31 and age<=50 then
    dbms_output.put_line('老司机');
  else
    dbms_output.put_line('老年人');
  end if;
end;

--while循环
declare 
  i number:=1;
begin 
  while i<=100 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>200; --跳出循环的条件
    dbms_output.put_line(i);
    i:=i+1;
  end loop;
end;

--反序输出
declare
begin
  for i in reverse 1..10 loop
    dbms_output.put_line(i);
  end loop;
end;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值