第一节课:创建表和字段讲解
--创建表学习
1、 创建表的基本语句:create table 表名(字段名 类型,字段名 类型,字段名 类型....)
创建学生表:学号,姓名,性别,年龄,qq号,邮箱。
create table student(
snum number(10),---指定学号的数字长度为10
sname varchar2(100),---指定姓名的存储上限为100个字节
sex char(4),
age number,
qq number,
sal number(6,2),--指定工资的整数位为6和小数位为2
mail varchar2(50)
)
2、字段类型
number类型:数字类型,用来声明存储数字的字段。 number(指定数字的整数长度,指定数字的小数位长度)
varchar2类型:字符类型,用来声明存储字符的字段。会根据存储的数据自动增长大小,varchar2(存储上限)
char类型:字符类型,用来声明存储字符的字符。会开辟指定大小的内存来存储数据。
区别1:char的存储效率高于varchar2
区别2:char是开辟指定大小的内存空间,varchar2是根据数据大小来开辟空间的大小
date类型:存储日期类型
第二节课:修改表学习:
修改表
在命令窗口查看表结构 desc 表名
添加新字段 alter table 表名 add 字段名 类型
alter table student add phone number(11)
修改字段类型 alter table 表名 modify 字段名 类型
alter table student modify sname varchar2(200)
删除字段 alter table 表名 drop column 字段名
alter table student drop column phone
修改表名 rename 表名 to 新的表名
rename student to stu
rename stu to student
删除表 drop table 表名
drop table student
第三节课:约束学习(根据情况切分成两节课)
select * from student for update
添加数据
问题1:学号重复了,数据还可以插入成功
insert into student(snum,sna,sex,age,qq,sal,mail)values('123','张三','男',18,12345678,88.88,'12345678@qq.com')
insert into student values(123,'李四','男',18,7890122,88.99,'7890122@qq.com')
问题2:姓名可以为空。
insert into student values(456,'柳岩','女',18,666999,99.66,'666999@qq.com')
insert into student (snum,sex,age,qq,sal,mail) values(789,'女',18,888444,99.66,'888444@qq.com')
问题3:性别不但可以为空,还可以为其他不知道的字符
insert into student (snum,sna,age,qq,sal,mail) values(108,'景甜',18,000999,99.66,'000999@qq.com')
insert into student (snum,sna,sex,age,qq,sal,mail) values(102,'景甜','a',18,000999,99.66,'000999@qq.com')
insert into student (snum,sna,sex,age,qq,sal,mail) values(102,'景甜','女',18,000999,99.66,'000999@qq.com')
问题4:年龄可以超过200
insert into student (snum,sna,sex,age,qq,sal,mail) values(103,'唐嫣','女',23,78900,99.66,'78900@qq.com')
insert into student (snum,sna,sex,age,qq,sal,mail) values(103,'唐嫣','女',230,78900,99.66,'78900@qq.com')
问题5:qq号一致
insert into student (snum,sna,sex,age,qq,sal,mail) values(104,'关晓彤','女',19,111000,99.66,'111000@qq.com')
insert into student (snum,sna,sex,age,qq,sal,mail) values(105,'袁华','男',22,111000,99.66,'111000@qq.com')
--------------------------------------------------------------------------------------------------------
约束学习:
create table student(
snum number(10),--primary key,--使用主键约束
sna varchar2(100), --not null,
sex char(4), --default '男' check(sex='男' or sex='女') not null,
age number check(age>0 and age<120),
qq number, --unique,
sal number(6,2),
mail varchar2(50)
-- constraints pk_student_snum primary key(snum)
-- constraints ck_student_sna check(sna is not null)
-- constraints ck_student_sex check(sex ='男' or sex='女')
--constraints uk_student_qq unique(qq)
)
alter table student add constraints pk_student_snum primary key(snum);--在创建表后添加主键
alter table student drop constraints pk_student_snum--删除主键
alter table student modify sna varchar2(100) not null;--添加非空约束
alter table student modify sna varchar2(100) null;--修改字段为空
alter table student add constraints ck_student_sex check(sex='男' or sex='女')--添加检查约束
alter table student drop constraints ck_student_sex --删除检查约束
alter table student add constraints uk_student_qq unique(qq)
alter table student drop constraints uk_student_qq
drop table student
问题1:学号重复了,数据还可以插入成功
使用主键约束:学号是唯一标识一条数据的,所以必须唯一且不能为空
---(1)、在确定为主键的字段后添加 primary key关键字
---(2)、在创建表的后面使用:constraints pk_表名_字段名 primary key(字段名)
--(3)、在创建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(字段名);
--删除主键:alter table 表名 drop constraints pk_表名_字段名
问题2:姓名可以为空。
使用非空约束
---(1)、创建表的时候在字段后面添加not null
---(2)、在创建表字段后使用 constraints ck_表名_字段名 check(字段名 is not null) 了解
--(3)、在创建表后使用alter table 表名 modify 字段名 类型 not null;
---(4)、修改字段可以存储空值:alter table 表名 modify 字段名 类型 null;
问题3:性别不但可以为空,还可以为其他不知道的字符
使用检查约束
---(1)、创建表的时候在字段后使用 default 值 check(条件),
---------但是会允许空值的出现,并且默认值只有在字段不声明的情况下生效
---(2)、在创建表所有字段后使用:constraints ck_表名_字段名 check(条件)
---(3)、在创建表后使用:alter table 表名 add constraints ck_表名_字段名 check(条件)
问题4:年龄可以超过200
--使用检查约束条件
问题5:qq号一致
使用唯一约束
--(1)、在字段后直接使用unique关键字
--(2)、在所有字段后使用:constraints uk_表名_字段名 unique(字段名)
--(3)、 alter table 表名 add constraints uk_表名_字段名 unique(字段名)
--删除唯一约束:alter table 表名 drop constraints uk_表名_字段名
第四节课:外键约束学习:
创建学生表
create table stu(
snum number(10) primary key,
sname varchar2(100) not null,
sex char(4) check(sex='男' or sex='女'),
cinfo number(10)-- references clazz(cid)--外键
-- constraints fk_stu_cinfo foreign key(cinfo) references clazz(cid)
)
alter table stu add constraints fk_stu_cinfo foreign key(cinfo) references clazz(cid) on delete cascade--添加外键
alter table stu add constraints fk_stu_cinfo foreign key(cinfo) references clazz(cid) on delete set null--添加外键
alter table stu drop constraints fk_stu_cinfo --删除外键
drop table stu
创建班级表
create table clazz(
cid number(10) primary key,
cname varchar2(100) not null,
cdesc varchar2(500)
)
创建班级表数据
insert into clazz values(1,'软件01班','最厉害的班级');
insert into clazz values(2,'软件02班','挂科最多的班级');
insert into clazz values(3,'508班','大牛和最帅的班级');
select * from clazz
delete from clazz where cid=1
创建学生数据
insert into stu values(1002,'张三','男',1);
insert into stu values(1003,'李四','女',2);
insert into stu values(1004,'王五','男',3);
insert into stu values(1005,'赵四','男',4);
select * from stu
问题1:在插入学生信息的时候,出现了不存在的班级信息?
使用外键约束
--(1)、在字段后使用 references 参照表表名(参照字段)
--(2)、在所有字段后使用 constraints fk_表名_字段名 foreign key(字段名) references 参照表名(参照字段名)
--(3)、在创建表后使用alter table 表名 add constraints fk_表名_字段名 foreign key(字段名) references 参照表名(参照字段名)
--删除外键 alter table 表名 drop constraints fk_表名_字段名
select table_name from all_all_tables where owner='SCOTT'
问题2:在删除父表数据的时候需要先删除子表数据?
解决方式1:先解除主外键关联,然后删除数据,再然后添加主外键关联
解决方式2:在创建外键的时候使用级联操作。
--在创建外键时 on delete cascade
--在创建外键时 on delete set null
怎么选取外键?
一般将主表的主键作为子表的外键
外键的值能为 not null? 不建议在外键后使用非空约束