目录
数据的增删改和数据控制
插入数据
插入数据其实大家在前面“在命令行使用MySQL”已经接触过了,有了初步的印象。插入数据是向数据库的表中新增元组,使用关键字 INSERT...INTO 从数据插入结果看,插入的数据在表末尾(实际物理存储则不一定)。
使用INSERT可以逐行插入语句
第一种是不带列名的写法,对自己常用的数据库可以采用这种写法,INSERT 语法表述如下:
INSERT INTO 表名
(属性名)
VALUES
(插入的数据元组);
注意如果数据是字符型,必须使用单引号或者双引号。
INSERT INTO student
VALUES
('070308','李明','男','1998-07-02','信息管理系',null);
第二种是附带列名/属性的写法,能够将数据插入指定列,在与他人共用数据表时,更推荐大家使用第二种写法
INSERT INTO student
(sno, sname, ssex, sbirthday, sdept, memo)
VALUES
('070308','李明','男','1998-07-02','信息管理系',null);
注意:
指定列名时,列名顺序可改变,但是插入的数据也要对应改变。
字符串一定要加引号
从文件中插入数据
除了使用INSERT,也可以直接从文本、excel、csv等格式的文件插入数据,具体的插入方法可以回顾一下前面的内容
更新数据
更新表数据
更新数据是更改数据表中已经存在的数据,使用关键字UPFATE,更新操作可以同时更新多个字段的数据内容,注意更新操作需配合WHERE关键字使用,更新操作的语法可以表述为:
UPDATE 表名 SET 属性 WHERE子句
来看一个例子,将所有机电系的学生性别改为女生:
UPDATE student SET ssex='女' WHERE sdept='机电系';
更新表名,字段名
当我们需要修改数据表名或者修改数据表字段时,就需要使用到ALTER命令。
删除添加或修改字段
如使用ALTER来删除student表中的memo字段:
ALTER TABLE student DROP memo;
使用 ADD 子句来向数据表中添加列,如下实例在表 student中添加sroom(宿舍号)字段,并定义数据类型:
ALTER TABLE student ADD sroom INT;
如果需要修改字段类型及名称, 可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。如下实例,把sroom 的类型从 INT 改为 CHAR(3),可以执行以下命令:
ALTER TABLE student MODIFY sroom CHAR(3);
删除数据
删除表中的数据
删除表中数据的关键字是DELETE,也是对表本身已经存在的数据进行更改,如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。语法如下:
DELETE FROM 表名 [WHERE 子句];
例如,删除学号060101为学生的信息:
DELETE FROM student
WHERE sno='060101';
此外,大家回忆一下,我们使用了TRUNCATE关键字来删除整个表格,语法如下
TRUNCATE 表名;
删除表
删除表相信大家在之前接触过,删除表使用DROP关键字,和删除数据库的关键字一致。来看一个例子,删除student 数据表:
DROP TABLE student;
注意在删除表示,先要选中表对应的数据库,要是提醒没选中数据库还好,要是存在两个都有student表的数据库,删错可就悲催了。
视图
视图的概念
视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。
基表:用来创建视图的表叫做基表base table
使用视图的优点
保障数据安全性,提高查询效率。
使用视图时需要注意的问题
(1) 如果创建视图时不明确指定视图的列名,那么列名就和定义视图的select子句中的列名完全相同;如果显式的指定视图的列名就按照指定的列名。
(2) 基表与创建的视图享有共同的命名空间(namespace),因此视图的名称不能和基表相同,即创建一个基于student的视图,视图名不能为student。
(3) 可以根据单个表创建视图,也可以多表连接查询视图。这一点大家可以这么理解:使用SELECT语句进行表查询的结果都可以创建为视图。
(4) 创建视图的基表必须一直存在,若删除基表,则查询、修改视图时会报错。
创建视图
视图的创建、更改、删除与之前学习的表的创建删除更改等操作的关键字相同,因此难度不是太高,而且对视图的修改创建不会影响到基表,大家可以多多尝试,反复练习
创建视图使用关键字CREATE,OR REPLACE是可选的,表示当视图名存在时,自动删除原来的视图并创建新的视图,(SQL查询语句)表示一个SELECT语句,WITH CHECK OPTION表示视图在更新时保证在视图的权限范围之内。
CREATE [OR REPLACE] VIEW 视图名
AS (SQL查询语句)
WITH CHECK OPTION
更改视图
更改视图的方法使用关键字ALTER
ALTEER VIEW 视图名
AS (SQL查询语句)
WITH CHECK OPTION
删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除基表中的数据。
删除视图使用关键字DROP, IF EXISTS 参数指判断视图是否存在,如果存在则执行;不存在则不执行。[, view_name] … 参数表示要删除的视图的名称,可以一次性删除多个视图,各个视图名称之间用逗号隔开。
DROP VIEW [ IF EXISTS ]
view_name [, view_name] …
视图学习资料
更多关于视图的介绍可以参考下面的资料
深入解析MySQL视图VIEW - GeaoZhang - 博客园 (这个总结的很到位)
MySQL :: MySQL 8.0 Reference Manual :: 13.1.23 CREATE VIEW Statement (官方文档,十分全面)
数据库的完整性
数据库中的三种完整性
1 域完整性
域完整性是对数据表中字段属性的约束,通常指数据的有效性,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由确定关系结构时所定义的字段的属性决定的。限制数据类型,缺省值,规则,约束,是否可以为空,域完整性可以确保不会输入无效的值.
2 实体完整性
实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的所有行能唯一的标识,一般用主键,唯一索引 unique关键字,及identity属性比如说我们的身份证号码,可以唯一标识一个人。
3 参照完整性
参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性
在实际操作中,大家插入数据失败时,会发现MySQL提示的错误信息,这其实是数据库管理系统来保护插入数据的完整性。具体说,如插入的数据类型不符合,插入的数据长度不符等。
数据库系统中的约束类别
静态约束——列和表的约束
列完整性约束有如下六个,其实大家在建立数据表的时候已经接触过:
1) 主键约束(Primary Key Constraint) 唯一性,非空性
主关键字约束指定表的一列或几列的组合的值在表中具有惟一性,即能惟一地指定一行记录。比方说student中的sno属性,course表中的cno属性,sc表中的sno+cno属性,注意在sc表中,一个学生选课不止一门,因此要以学号加课程号,才能组成主键。
2)唯一约束(Unique Constraint) 唯一性,可以空(但只能有一个)
惟一性约束指定一个或多个列的组合的值具有惟一性,以防止在列中输入重复的值。惟一性约束指定的列可以有NULL 属性。由于主关键字值是具有惟一性的,因此主关键字列不能再设定惟一性约束。
3)检查约束(Check Constraint) 对该列数据的范围、格式的限制(如:年龄,性别等)
检查约束对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性。可以对每个列设置符合检查。比较常见的是在插入性别字段的数据时,只允许"男"或"女",其他的输入将被拒绝。
4)默认约束(Default Constraint)该列数据的默认值
缺省约束通过定义列的缺省值或使用数据库的缺省值对象绑定表的列,来指定列的缺省值
5)外键约束(Foreign Key Constraint)需要建立两表间的关系并引用主表的列
外关键字约束定义了表之间的关系。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它适合哪个表中哪些列相关联。这样,当在定义主关键字约束的表中更新列值,时其它表中有与之相关联的外关键字约束的表中的外关键字列也将被相应地做相同的更新。外关键字约束的作用还体现在,当向含有外关键字的表插入数据时,如果与之相关联的表的列中无与插入的外关键字列值相同的值时,系统会拒绝插入数据。注意外键一定要声明引用的外键是哪个表的主键。
6)表约束
表约束作为表定义的一部分,可以作用于多个列,换句话说表约束是多个列之间作用,比如两个列相加结果小于10。
ALTER TABLE虽然战老师没细讲,不过我们上节课已经细讲了233。
关系完整性约束
断言约束
断言是一个谓词表达式,表达了数据库总能满足的条件约束,其语法为:
CREATE ASSERTION 断言名称 CHECK 断言条件
这个大家了解一下,没有静态约束那么重要
动态约束——触发器
触发器是用来实现数据库动态约束的,当数据库中的数据发生变化时,可以设置触发器来实现动态约束(数据库中的数据更新、删除时)这个概念比较类似于Python或者JavaScript中经常使用的回调函数。(什么?不懂什么是回调函数?哦那没事了,我们继续看。。。),简单的说,就是一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行。
什么时候使用触发器:在数据变更时。
特点
触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行;
触发器可以实现很多事件,比如插入的数据不合理时,可以报错,或者改变数据库表中其他的数据等,举个例子:当插入一条同学的数据时,可以使用触发器检查性别是否为男或女,不是则报错,拒绝插入(也可以通过CHECK静态约束实现)。
更多关于触发器的介绍: