SQL-进阶前奏-表结构变更/索引/视图/序列的基操

SQL-进阶前奏-表结构变更/索引/视图/序列的基操

在上一章Oracle基本查询的基础上,本篇blog还是用emp表做演示,由于涉及数据库变更,我们复制一张emp表myemp

SQL> create table myemp as select * from emp ; 
 
Table created

insert(增加)

语法:

INSERT  INTO表名[(列名1,列名2...)]VALUES(1,值2...)

简单写法(不建议)

insert into myemp values(7789,'张三','开发',7839,to_date('1992-10-22', 'yyyy-MM-dd'), 2000, 200, 10)

使用简单写法必须按照表中的字段来插入值、若有空的字段使用null

update(修改)

全部修改

UPDATE 表名 SET 列名1=1,列名2=2,...
update myemp t set t.comm = 1000 

局部修改

UPDATE 表名 SET 列名1=1,列名2=2....WHERE 修改条件;
update myemp t set t.comm=5000 where t.empno = 7790
#局部修改

delete(删除)

语法:

DELETE FROM 表名 WHERE 删除条件;
delete from myemp t where t.empno in (7788,7789,7790)

事务处理

所谓的事务管理就是要保证数据的完整性,要么同时成功,要么同时失败

当我们执行完delete语句时,我们去数据库中去查看数据,发现并没有我们删除数据,这是因为oracle的事务对数据库的变更的处理,我们必须做提交事务才能让数据真正的插入到数据库中,在同样在执行完数据库变更的操作后还可以把事务进行回滚,这样就不会插入到数据库。如果事务提交后则不可以再回滚

提交:commit

回滚:rollback

表的管理

表的数据类型

No数据类型描述
1Varchar, varchar2表示一个字符串
2NUMBERNUMBER(n)表示一个整数,长度是n
NUMBER(m,n):表示一个小数,总长度是m,小数是n,整数是m-n
3DATA表示日期类型
4CLOB大对象,表示大文本数据类型,可存4G
5BLOB大对象,表示二进制数据,可存4G

建表

Create table 表名(

字段1	数据类型	[default 默认值],

字段2	数据类型	[default 默认值],

...

字段n	数据类型	[default 默认值]
  • 范例:创建person表
create table person(
	pid number(10),
 	name varchar2(10),
    gender number(1) default 1, 
    birthday date 
);

表删除

语法

drop table 表名 ; 

表修改

在sql中使用alter来修改表

添加语法:ALTER TABLE 表名称 ADD(列名1 类型 [DEFAULT 默认值],列名1 类型 [DEFAULT 默认值]...)
修改语法:ALTER TABLE 表名称 MODIFY(列名1 类型 [DEFAULT 默认值],列名1 类型 [DEFAULT 默认值]...)

范例:在person表中增加列address

alter table person add(address varchar2(10))

范例:在person表中修改列address长度为20

alter table person modify(address varchar2(20))

表截断

使用delete语句删除数据,则可以使用rollback来回滚,如果想要清空一张表的数据,同时不想回滚可以立即释放资源需要使用截断表的语法

语法

truncate table 表名; 

约束

在数据库开发中,约束是必不可少的,使用约束可以更高的保证数据的完整性

主键约束

主键约束在id上使用,内容不能为空,不可重复,建表的时候可以指定

  • 创建一张表,把pid作为主键(primary key)
create table person(
	pid number(10) primary key , 
 	name varchar2(10),
    gender number(1) default 1, 
    birthday date 
);

非空约束

使用非空约束,可以使指定的字段不为空(not null)

create table person(
	pid number(10) not null , 
 	name varchar2(10), not null , 
    gender number(1) default 1, 
    birthday date 
);

唯一约束(unique)

使用唯一约束,表中的一个字段的内容是唯一的

create table person(
	pid number(10) , 
 	name varchar2(10), unique , 
    gender number(1) default 1, 
    birthday date 
);

唯一约束的名字也可以自定义

create table person(
	pid number(10) , 
 	name varchar2(10), 
    gender number(1) default 1, 
    birthday date 
    constraint person_name_uk unique(name)  #person_name_uk就是我们自定义的名称
);

检查约束(check)

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

create table person(
       pid      number(10) ,
       name     varchar2(10),
       gender   number(1)  check(gender in (1, 2)), #1男2女
       birthday date
);

外键约束

外键约束是两张表的约束,可以保证关联数据的完整性

  • 范例:创建两张表,一张订单表,一张订单明细表,订单表和订单明细表是一对多的关系
#订单表的建立
create table orders(
       order_id      number(10) ,
       total_price   number(10,2),
       order_time date,
      constraint orders_order_id_pk primary key(order_id)
);
#订单明细表的建立
create table order_detail(
       detail_id      number(10) ,
       order_id   number(10),
       item_name  varchar2(10),
       quantity   number(10),
      constraint order_detail_detail_id_pk primary key(detail_id)
);
insert into orders values(1, 200, to_date('2015-12-12','yyyy-MM-dd'));

insert into order_detail values(1, 2, 'java',1);

我们在两张表中插入如上两条数据,我们发现在order_detail表中插入的order_id在order表中并不存在,这样在数据库中就产生了脏数据。此时需要外键来约束它。

create table order_detail(
       detail_id      number(10) ,
       order_id   number(10),
       item_name  varchar2(10),
       quantity   number(10),
      constraint order_detail_detail_id_pk primary key(detail_id),
      constraint order_detail_order_id_fk foreign key(order_id) references orders(order_id)
);

外键关联一定要注意

  • 外键是主表的主键
  • 删表先删子表再删主表,如果直接删除主表会出现由于约束存在无法删除外表的情况,但是可以强制删除(级联删除)(不建议
drop table order_detail cascade constraint
  • 删除主表的数据可以删除子表的关联数据,再删主表,也可以使用级联删除,级联删除在外键约束上要加上 on delete cascade
#在外键建表时
constraint order_detail_order_id_fk foreign key(order_id)
	references orders(order_id) on delete cascade
	#这样主表在删除数据的时候就会把子表的关联数据一同删除(主子全删)

rownum

rownum表示行号

  • 范例:查询emp表带有rownum列
select rownum, t.* from emp t 

有了rownum,我们可以取结果集的前几行,比如前5行

select rownum, t.* from emp t  where rownum<6

但是单纯rownum只能取前几行或后几行,无法取中间行,如果想取中级行,我们需要配合子查询

select * from 
(select rownum rm a.* from (select * from emp) a where rownum<11) b  where b.rm>5

视图(view)

视图就是封装了一条复杂查询的语句

  • 范例:建立一个视图,此视图包括了20部门的全部员工信息
create view empvd20 as select * from emp t where t.deptno=20
#此操作需要权限

​ 如果视图已经存在,想要覆盖视图,使用

create or replace view empvd20 as select * from emp t where t.deptno = 20

​ 设置视图为只读

create or replace view empvd20 as select * from emp t where t.deptno = 20 with read only

序列

在很多数据库中存在一个自动增长,如果现在想在oracle中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理

语法

CREATE SEQUENCE 序列名 
[INCREMENT BY n] 
[START WITH n] 
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] 
[{CYCLE|NOCYCLE}] 
[{CACHE n|NOCACHE}];
  • 范例:创建一个seqpersonid的序列,验证自动增长的操作
create sequence seq ;
#在序列中提供了以下两种操作
#nextval:取得序列的下一个内容
#currval:取得序列的下一内容
select seq.nextval from dual 

select seq.currval from dual

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

insert into person(pid,name,gender,birthday)
values(seq.nextval,'张三','1',to_date('1999-11-11','yyyy-MM-dd'))

在实际项目中每一张表都会配一个序列,但是表和序列是没有必然联系的,一个序列被哪一张表使用都可以,但是我们一般都是一张表用一个序列

序列的管理一般使用工具来管理

索引

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

图书馆

  • 将书分类,然后再建一个箱子,箱子里面放卡片,卡片里面可以按类查询,按姓名查或者类别查
  • 索引需要维护成本,故不能乱建
创建索引
  • 单例索引:基于单个列所建立的索引
create index 索引名 on 表名(列名)
  • 复合索引

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

create index emp_idx1 on emp(ename,job) ; 
###
create index emp_idx1 on emp(job,ename) ;  
  • 范例:给person表的name建立索引
create index pname_index on person(name) ; 
  • 范例:给person表创建一个name和gender索引
create index pname_gender_index on person(name,gender) ; 

索引建立原则

  • 在大表上建立索引才有意义
  • 在where子句后面或者是连接条件上建立索引
  • 索引的层次不要超过4层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值