文章目录
SQL语言之增删改、约束、序列
SQL增删改–对表或字段操作
删除表
drop table 表名 ;
添加字段
alter table 表名 add 字段名 类型;
修改表中字段类型
alter table 表名 modify 字段名 新类型;
修改表中字段名
alter table 表名 rename column 原字段名 to 新名;
删除字段
alter table 表名 drop column 字段名;
实例代码如下:
-- 1.修改表名
alter table student rename to t_student;
-- 2.删除学生表
drop table t_student;
-- 3.添加字段
alter table t_student add sweigtht number(5,2);
-- 4.修改表中的字段类型
alter table t_student modify sweigtht varchar2(5);
-- 5.修改表中的字段名
alter table t_student rename column sweigtht to weight;
-- 6.删除字段
alter table t_student drop column weight;
约束
约束用于限制加入表的数据的类型、范围、或者条件
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后添加约束(通过 ALTER TABLE 语句)
非空约束
解释:限定某个字段不允许空值
create table testNull(
sid number(4) not null,
sname varchar2(20)
);
也可以在建表之后添加非空约束:
alter table 表名modify 字段名not null;
但是要注意建表之后添加非空约束的字段必须保证该字段列的所有记录没有值。
默认值约束
解释:default 约束用于向列中插入默认值
create table testDeafault(
sid number(4) not null,
sname varchar2(20) default '西门吹雪',
sage number(3) default 18
)
也可以在表已存在的情况下为字段创建 DEFAULT 约束
alter table 表名 modify 字段名 default 默认值;
唯一约束
解释:表示某个字段的取值在该字段列是唯一的,不能重复的
create table testUnique(
sid number(4) unique,----系统赋予约束名称
sname varchar2(20) default '孤独求败',
CONSTRAINT uc_testUnique UNIQUE (sname) -- 自定义约束名称
);
注意:
1、同时插入两个null值是可以的,但是如果两个字段不为null是必须惟一的
2、可以给一个字段添加多个约束,多个字段也可以添加唯一约束
如果希望在建表之后添加唯一约束,可以使用如下语句:
ALTER TABLE 表名
ADD CONSTRAINT 约束名称 UNIQUE (字段名列表);
同时我们也可以删除唯一性约束,语法如下:
ALTER TABLE 表名
DROP CONSTRAINT 约束名称;
主键约束
解释:表示设定的字段是唯一标识不能够为null,效果上等同于unique + not null。
但是主键可以加快查询速度,并且会自动创建索引
注意:每个表都应该有一个主键,并且每个表只能有一个主键。
create table testPrimaryKey(
sid number(4) primary key, -- 系统定义主键名称
sname varchar2(20),
-- CONSTRAINT pk_testPrimaryKey PRIMARY KEY (sid)
-- 自定义主键名称,也可以设置联合主键
)
如果希望再建表之后添加主键约束,可以使用如下语法:
ALTER TABLE 表名
ADD CONSTRAINT 约束名称 PRIMARY KEY (字段列表);
如果希望删除主键约束,可以使用如下语法:
ALTER TABLE 表名
DROP CONSTRAINT 约束名称;
主键约束和唯一约束的区别
相同点:
共同作用是为了约束字段/建立索引/提高查询效率
区别:
(1) 唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值。
(2) 可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的。但是,唯一性约束所在的列并不是表的主键列。
(3)建立主键的目的是让外键来引用.
(4)一个表最多只有一个主键,但可以有很多唯一键
外键约束
解释:外键就是在从表中可以重复出现,但是它的值是另一个表的主键,外键使两个表相关联
例如 学生表和班级表, 学生表中学生所属的班级编号来自于班级表的班级编号。
create table t_student(
sid number(5) primary key,
sname varchar2(20),
classid number(4),
constraint fk_student_classid foreign key (classid) references t_class (cid)
)
create table t_class(
cid number(4) primary key,
cname varchar2(20)
)
也可以在建表之后设定外键约束,语法格式如下:
ALTER TABLE 从表表名
ADD CONSTRAINT 外键约束名
FOREIGN KEY (外键字段名称)
REFERENCES 主表表名(主表主键字段名)
如果希望删除主键约束,可以使用如下语法:
ALTER TABLE 表名
DROP CONSTRAINT 约束名称;
外键的特点:
- 外键会约束表的创建,应该先创建主表,再创建从表,并且创建表时,主表的主键和从表的外键应当满足如下要求: 数据类型要统一,长度(存储大小)要统一
- 外键将会约束表的数据的添加和修改,当向从表中添加数据的时候,数据的来源应该来自于主表的主键列数据。
- 外键同时也会约束数据的删除,删除从表数据时,不会受影响,但是如果删除主表数据时,如果从表中有数据引用了主表的主键列,那么是会删除失败的,这个时候需要先把从表中关联主表的所有记录都删除,才能够删除主表对应的记录
- 外键能够帮助我们查询【多表查询】,通过外键可以连接两张表,实现对象模型和关系模型之间的相互转换。
- 外键可以为null
- 一张表可以设置多个外键,关联多个表,同时也可以自身关联,也就是一张表的外键同时引用同一张表的主键。
在开发中,也不一定要加上外键约束,因为外键会导致某些情况下添加或者删除失败,但是可以添加逻辑外键,而不添加物理外键【设置外键,却不设置外键约束】
Check约束
解释:保证某一个字段按照一定的格式,在一定范围内取值
check 约束的相关关键字或者运算符
- < >= <= = <> != =
- in / not in
- between / not between
- is null / is not null
- Or and
create table testCheck(
sid number(5),
sname varchar2(20),
sage number(3) check (sage <= 100 and sage > 0),
-- sage number(3) check (sage between 0 and 100),
-- sage number(3) check (sage not between 0 and 100),
-- sage number(3) check (sage != 0),
-- sage number(3) check (sage <> 0),
-- sgender char(3) check (sgender in ('男','女')),
-- sgender char(3) check (sgender not in ('人','鬼')),
-- sgender char(3) check (sgender = '男' or sgender = '女')
sgender char(3) check (sgender is not null),
classid number(4),
CONSTRAINT chk_testCheck CHECK (classid>0 AND classid<100)
);
同时也可以在建表之后添加check约束,语法如下:
ALTER TABLE 表名
ADD CONSTRAINT 约束名称 CHECK (条件);
如果希望删除check约束,可以使用如下语句:
ALTER TABLE 表名
DROP CONSTRAINT 约束名称;
序列
序列是Oracle中所特有的,用来作为主键自动增长。本质是一个变化的数值
语法格式:
CREATE SEQUENCE sequence_name -- seq_表名
[START WITH num] -- 起始值
[INCREMENT BY increment] -- 增量
[MAXVALUE num|NOMAXVALUE] -- 最大值
[MINVALUE num|NOMINVALUE] -- 最小值
[CYCLE|NOCYCLE] -- 循环 1-100
[CACHE num|NOCACHE]
-- 缓存大小 20 原理: 系统先帮你生成好20个数字放入缓存中,然后我们获取序列的值的时候只需要从缓存中获取,这样可以提高效率
例如:
create sequence seq_t_student
minvalue 1
maxvalue 9999999999999999
start with 1
increment by 1
cache 20;
序列的使用:
nextval: 获取下一个序列的值
currval: 获取当前会话序列的值
-
1.结合查询语句使用
select seq_t_student.nextval from dual; select seq_t_student.currval from dual;
-
在插入语句中使用
create table t_class( cid number(4), cname varchar2(20) ) SEGMENT CREATION IMMEDIATE; insert into t_class values(seq_t_class.nextval,'j1005'); commit;
注意:
- 每执行一次seq_t_class.nextval,序列都会根据增量增加一次
- 序列本质只是一个变化的数值,可以独立使用,也可以交替使用,但是不建议,一张表对应着一个序列
- seq_t_student.currval表示当前会话的值,新建一个窗口就是一个会话,新建一个连接也是一个会话,直接获取当前会话的值必须先获取下一个序列的值
- Oracle从 11.2.0.1版本开始,提供了一个“延迟段创建”特性:即当我们创建了新的表(table)和序列(sequence),在插入(insert)语句时,序列会跳过第一个值(1)。所以结果是插入的序列值从 2(序列的第二个值) 开始, 而不是 1开始。
解决方案: 在建表语句的后面加入 SEGMENT CREATION IMMEDIATE;,中间不要有分号
- Oracle和MySQL在主键自动增长上面的实现方式不一样,oracle有序列
SQL语句增删改–对表中的数据操作
DML操作(插入(insert)、更新(update)、删除(delete)和查询(select))后数据并没有立刻更新到数据库,而是写入到内存(缓存)当中去,我们需要显示地提交或者回滚,提交表示将更改后的结果保存到数据库中,回滚表示撤回刚才的提交操作,DML语句中增加、删除、修改都要显示提交,查询语句不需要提交,查询表的时候也是将表放置内存中,如果对表的数据进行操作并不会对数据库的表造成影响。
同时我们也可以使用两个sql语句来提交和回滚数据。
(1) Commit; 提交
(2) Rollback: 回滚
INSERT语句
insert into t_student(sid, sname) values(101, '张三'); //指定列插入
insert into t_class values (1001, 'java','好好学习'); //全列插入
insert into t_class_copy(cid,cname) select cid,cname from t_class where cid = 1003; //通过select子句插入数据
insert into t_class select 1005, 'java0320' from dual; //插入常量值
//表结构的复制 (注意: 这里表结构的复制不会复制约束)
//复制表不包含数据
create table t_class_copy2 as select * from t_class where 1 <> 1;
//复制表包含数据
create table t_class_copy3 as select * from t_class;
//使用inset all结合select子句 插入多条记录
insert all
into t_student values(1,'张三',18,'男',4)
into t_student values(2,'李四',19,'女',3)
into t_student values(3,'王五',20,'男',2)
select 1 from dual;
UPDATE语句
update 表名 set 字段名 = 值, column2 = value2... [where columnN = valueN];
//更新学生表中班级编号为null的学生的年龄为22
update t_student set sage = 22 where classid is null;
注意:
更新语句如果没有加入where条件,表示更新所有的记录
DELETE语句
delete from 表名 [where 条件];
//删除学生表中 id为3 的数据
delete from t_student where sid = 3;
//这种删除方式是先将数据保存到内存中,然后提交,再统一删除
//truncate 可以 删除数据
//这里删除是删除所有数据,是不能够带条件的
truncate table t_class_copy;