文章目录
- 前言
- 1.补充
- 1.修改表名
- 1.2.修改列名
- 1.3.修改列类型
- 1.4.增加新列
- 1.5.删除指定列
- 2.CRUD
- 3.新增(Create)
- 3.1.单行插入
- 3.2.指定列插入
- 3.3.多行插入
- 4.数据库的约束
- 4.1.约束的分类
- 4.2.NULL约束
- 4.3.Unique约束
- 4.4.Default 默认值约束
- 4.5.PRIMARY KEY:主键约束
- 4.6.FOREIGN KEY 外键约束
前言
上一篇我们学习了数据库的基础操作,这一篇我们学习数据库的增删改查等一系列操作
1.补充
首先要对上一篇表的操作,在进行一次扩充—修改表
1.修改表名
语法:
ALTER TABLE 旧表名 RENAME 新表名;
例如
创造一个student的表
create table student(id bigint,name varchar(50)
);
然后在把student表名改为stu;
alter table student rename stu;
1.2.修改列名
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型;
例如把stu表中的id字段改为stu_id
alter table stu change column id stu_id bigint;
1.3.修改列类型
ALTER TABLE 表名 MODIFY 列名 新类型;
例如把stu的stu_id类型改写成int
alter table stu modify stu_id int;
1.4.增加新列
语法
ALTER TABLE 表名 ADD COLUMN 新列名 类型;
例如:把stu表中添加分数这一列
alter table stu add column score int;
1.5.删除指定列
ALTER TABLE 表名 DROP COLUMN 列名;
例如,把stu表中的score成绩删除
alter table stu drop column score;
2.CRUD
注释:在SQL中可以使用“–空格+描述”来表示注释说明
CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写
3.新增(Create)
语法
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value]...
3.1.单行插入
语法
insert into 表名[(字段1,字段2)] values (值,值);
或者
insert into 表名 values (值,值,值...);
例如:
首先在test中建立student表,包含id和name字段
然后插入(1,‘张三’);
insert into student(id,name) values(1,"张三");
其中
select * from student;
属于查询语句,下一篇博客再讲,大家可以用这个先去查询表名中所有的信息
如果一不小心,字段名和值没有用一一对应的话
例如再插入一条数据(2,“李四”)
insert into student values(2,'李四');
3.2.指定列插入
语法:
insert into 表名(字段) values(值);
例如:
在student中加入一条数据,王五,没有编号
insert into student(name) values('王五');
3.3.多行插入
insert into 表名 [(指定列...)] values (值[,值...]) [,(值[,值...])] [,(值[,值...])]...;
例如插入三条数据,分别是小红,小刚,小明,编号分贝为4,5,6
insert into student(id,name) values (4,'小红'),(5,'小刚'),(6,'小明');
一次插入一条数据和一次插入多条数据那个效率高?
1.执行所有的SQL时都有网络开销
2.写入数据是还会有磁盘IOde开销
3.每执行一条SQL语句都会开启一个事务,事务的开启和关闭都需要消耗系统资源
一次提交多条数据(在一个可控的范围之内),比一次提交提条数据效率高一点点
4.数据库的约束
在上面再添加王五数据的时候,没有添加id编号,造成了用null填充,但是在现实中,再添加王五数据的时候,一定有一个数字来代替id,如何进行操作呢,就要使用约束,进一步限制表的具体内容。
4.1.约束的分类
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
- DEFAULT - 规定没有给列赋值时的默认值。
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
4.2.NULL约束
NOT NULL - 指示某列不能存储 NULL 值。
那么我们再创建一个表,把id这一列变成非空约束
create database test1;
use test1;
create table student(id bigint not null ,name varchar(50)
);
此时,我们添加一条数据,王五,id为NULL
4.3.Unique约束
我们往上面的表中,添加三组数据,小明,小红,小刚,其中编号都为1
这样的操作会不会出现的,不可能一个编号多个人使用,因此为了这一特性,引用Unique约束;
create database test2;
use test2;
create table student(id bigint unique,name varchar(50)
);
我们再次插入三组数据,小明,小红,小刚,其中编号都为1
就不让插入了,
但是如果编号都是NULL呢?
4.4.Default 默认值约束
在student中,如果一个学生名字不知道的话,我们使用‘无名氏’来代替。
create database test3;
use test3;
create table student(id bigint ,name varchar(50) default '无名氏'
);
我们这会只插入一条数据,只有id,没有姓名
insert into student(id) values(1);
如果插入的名字为NULL呢?
insert into student(id,name) values(2,NULL);
4.5.PRIMARY KEY:主键约束
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
在上面,我们发现id这个属性既属于NOT NULL又属于UNIQUE,因此可以使用PRIMARY KEY来代替
我们在创建一个student的表,使得其id为Primary key,sn(学号)以及name
create database test4;
use test4;
create table student(id bigint not null unique ,sn bigint unique,name varchar(50)
);
分别插入数据,1,1001,张三和NULL,1001,李四
发生了报错。
主键约束帮我们校验了非空和唯一,这两个校验在写入数据对效率是有一定影响的,但是比起不做校验来说,这个性能消耗还是可以承担的,为以后讲解索引起到作用
当然了,我们不想插入一条数据,就写编号,有什么别的方法,数据库自己生成一个编号,当然可以。
create database test5;
use test5;
create table student(id bigint primary key auto_increment,sn bigint unique,name varchar(50)
);
首先指定列插入
插入两条数据,1001,小红和1002,小明
那可不可以指定主键值呢?
可以的,只要主键值不重复
如果是插入的id为NULL呢?
继续加一
如果是上一条出错了,然后又插入一条数据,会发生什么现象呢?
其次还有一个表中只能有1个主键
但是一个主键可以有多个列共同组成(复合主键)
create database test6;
use test6;
create table student(id bigint,name varchar(50),mail varchar(50),primary key (id,name)
);
有效的解决了双胞胎,重名重姓的问题。
4.6.FOREIGN KEY 外键约束
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
创造两个表,满足下面的照片
我们发现,这两张表是通过班级编号连接起来的,为此我们引出FOREIGN KEY这一约束
语法:
foreign key (字段名) references 主表(列)
先设计班级class,在设计学生student
create database test7;
use test7;
create table class(id bigint primary key auto_increment,name varchar(50)
);
create table student(id bigint primary key auto_increment,name varchar(50),class_id bigint,foreign key (class_id) references class(id)
);
首先先写入class表中的数据
insert into class(name) values ('金工1班'),('金工2班'),('软工1班'),('软工2班'),('计算机应用与技术1班');
此时在向student中添加数据
insert into student(name,class_id) values ('张三',1),('李四',1),('小红',2),('小飞',3),('小刚',3);
插入成功
那么如果在student中插入一条class_id 和 id(class)不匹配的数据,会发生什么现象呢?
还有一个问题?
能否先删除class里面的数据,再删除student中的数据,
答案是不行的,
在这先把删除操作的代码写一下,下个博客再讲
delete from class where id = 1;
那么先删除student中的数据,再删除对应class的数据,那么就不会报错,例如
删除小红的数据,再删除对应class的数据
delete from student where name = '小红';
delete from class where id = 2;
下一篇博客,我们讲解查询,删除和查找操作,我们不见不散!