三、表操作、约束
1、创建表(create table)
-
语法格式:表名一般建议使用 t_或 tbl _开头
create table 表名( 字段名1 数据类型, 字段名2 数据类型, .... );
-
Mysql字段中常见的数据类型:
数据类型 描述 int 整数型(java中的int) bigint 长整型(java中的long) float 浮点型(java中的float 和 double) char 定长字符串(java中的String) varchar 可变长字符串(java中的StringBuffer/StringBuilder) date 日期类型(java中的java.sql.Date) BLOB 二进制大对象(存储图片、视频等流媒体信息,java中的Object) CLOB 字符大对象(存储较大文本,4G的字符串,java中的Object) -
char和varchar怎么选择?
- 当一个字符的数据长度不发生改变时,是定长的如:性别、生日采用char
- 当一个字符串的长度不确定时,如:简介,姓名等都是采用varchar
-
创建学生表
-
学生信息:学号、姓名、性别、班级编号、生日
create table t_student( no bigint, name varchar(255), sex char(1), classno varchar(255), birth char(10) );
-
2、数据插入(insert into)
-
语法格式:
insert into 表名( 字段1,字段2... ) values( 值1,值2... );
-
插入的数据的要点:
-
字段的数量和值的数量要相同,并且数据类型要对应相同
-
当将前面的字段省略时,后面的values()中的内容,字段数量不可缺少,不可调换顺序
-
一次可以插入多条数据使用 ","分隔开来
-- 插入多条数据 insert into 表名 (字段1,字段2...) values (值1,值2...), ...... (值1,值2);
-
可以选择那些字段插入数据,没有插入的字段由默认值代替,默认值可有desc 表名 查看
-- 可以省略一些字段不插入,可以调换插入的顺序 insert into 表名 (字段2,字段4,字段1) values (值2,值4,值1);
-
当一条insert语句执行成功后,表格中必然多了一行记录即使多的这一行记录中存在null,后期也无法用insert语句进行改变,必须使用update语句
-
3、表的复制
-
语法:
create table 表名 as select语句; -- 将查询出来的结果作为表创建出来
-
案例:
create table dept_copy as select * from dept;
4、将查询结果插入到另一张表中
-
语法:
insert into 表名 select语句
-
要求:表的字段和select语句查询出来的字段要一致
-
案例:
insert into dept_copy select * from dept;
5、修改数据(update)
-
语法
update 表名 set 字段1 = 值1, 字段2 = 值2 ... where 修改条件
-
注意点:没有where条件全部都修改了
-
案例:
-- 将部门10的LOC修改为SHANGHAI,将部门名称修改为RENSHIBU update dept set LOC = 'SHANGHAI', DNAME = 'RENSHIBU' where deptno = 10;
6、删除表数据(delete)
-
语法格式
delete from 表名 where 删除条件
-
注意点:没有条件全部删除
-
案例:
-- 删除10部门的数据 delete from dept where deptno = 10;
-
删除一张很大的表
truncate table 表名;-- 表被截断,不可回滚,永久丢失 -- 删除表? drop table 表名;-- 这个通用 drop table if exists 表名; -- oracle不支持这种写法
7、约束(constraint)
-
约束的概念:在创建表的时候,可以给表的字段添加响应的约束,添加约束的目的是为了保证表中数据的合法性、有效性和完整性
-
常见约束有哪些:
- 非空约束(not null) : 约束的字段不能为null
- 唯一约束(unique) : 约束的字段不能重复,但是可以为null
- 主键约束(primary key) : 约束的字段既不能为null,也不能重复(简称pk)
- 外键约束(foreign key): (简称fk)
- 检查约束(check) : mysql没有,oreacle有
-
not null (非空约束)
drop table if exists t_user; create table t_user( username varchar(255) not null, password varchar(255) ); -- not null 只有列级约束,没有非空约束
-
unique(唯一约束)
drop table if exists t_user; create table t_user( id int unique, username varchar(255) unique -- 这个叫列级约束 ); -- 和下面这种方式添加约束有啥区别? drop table if exists t_user; create table t_user( id int, username varchar(255), unique(id,username) -- 这个叫做表级约束 ); -- 方式一是列级约束,方式二是表级约束 -- 方式一是两个字段各自都不能重复,方式二:是两个字段联合来不能重复 -- 看一个例子: insert into t_user(id,username) values(1,'zs'); insert into t_user(id,username) values(1,'ls'); -- 这两条插入语句同时执行,对于方式一创建的表,后面ls的数据插入不进去 -- 对于方式二创建的表,两条语句都是可以插入进去的,因为方式二的是将连个字段联合起来不能重复
-
primary key(主键约束,一张表只能有一个)
-
添加了主键约束,主键字段中的数据不能为null,也不能重复
-
主键和唯一性约束一样,存在表级约束和列级约束
-
主键的作用:主键值是这行记录在这张表中唯一标识,第一范式要求任何一张表应该有主键
-
主键的分类:
- 根据主键的字段数量来划分:
- 单一主键(常用)
- 复合主键(多个字段联合起来添加一个主键约束)(不建议使用,违背了三范式)
- 根据主键的性质来划分:
- 自然主键(常用,和业务没有关系的普通自然数)
- 业务主键(主键值和业务挂钩,不推荐使用)
- 根据主键的字段数量来划分:
-
主键自增(auto_increment)
drop table if exists t_user; create table t_user( id int primary key auto_increment, -- id字段会自动维护一个自增的数字,从1开始 username varchar(255) ); -- oracle中也提供了自增机制叫做序列(sequence)
-
-
foreign key(外键约束)
-
-- 请设计数据库表,用来维护学生和班级的信息? t_class 班级表 cno(pk) cname ----------------------- 101 高三1班 102 高三2班 t_student 学生表 sno(pk) sname classno(该字段添加外键约束fk) ---------------------------------------------------- 1 zs1 101 2 zs2 101 3 zs3 102 4 zs4 102 5 zs5 102
-
t_student中的classno字段引用了t_class表中的cno字段,此时t_student表叫做子表t_class表叫做父表
-
顺序要求:
删除数据的时候,先删除父表,再删除父表
添加数据的时候,先添加子表,再添加子表
创建表的时候,先创建父表,再创建子表
删除表的时候,先删除字表,再删除父表
-
-
将上表的建表语句写出来
drop table if exists t_student; drop table if exists t_class; create table t_class( cno int primary key, cname varchar(255) ); create table t_student( sno int primary key, sname varchar(255), classno int, foreign key(classno) references t_class(cno) ); insert into t_class(101,'xxxx'); insert into t_class(102,'xxxx'); insert into t_student(1,'zs1',101); insert into t_student(2,'zs2',101); insert into t_student(3,'zs3',102); insert into t_student(4,'zs4',102); insert into t_student(5,'zs5',101); select * from t_class; select * from t_student;
-