目录
2. 使用 NSERT INTO…SELECT...FROM 语句复制表数据
6.1.1. 首先执行内层查询,查询出tb_depts表中“研发部”的部门编号:
6.1.2然后执行外层查询,查询出deptId的值为1的员工姓名
6.4.1. 第1步:从scores分数表中查询出未及格课程的课程编号:
6.4.2. 第2步:从courses课程表中查询出这些课程编号的课程:
为什么使用数据库?
使用数据库可以安全高效地存储、检索、管理大量的数据
1. 实体和记录
实体:每一行数据对应一个实体
记录:实体的别名
2. 数据库和数据库表
不同的实体组织在一起,构成了数据库的“表”
数据库的表:实体的集合
数据库:表的集合
3. 数据完整性
作用:保证用户输入的数据保存到数据库中是正确的。
确保数据的完整性=在创建表时给表中添加约束
完整性的分类:
1)实体完整性:行
2)域完整性:列
3)引用完整性:学生表(学号,姓名) 成绩表(学号,科目,成绩) 科目表(科目编号,科目名称)
数据完整性(Data Integrity)是指数据的精确性(Accuracy) 和可靠性(Reliability)。
数据完整性由以下三个方面构成:
1. 域完整性:
是指一个列的输入有效性,是否允许为空值。强制域完整性的方法有:限制类型、格式或可能值的范围。
2. 实体完整性:
是指保证表中所有的行唯一。实体完整性要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列,也可能是几列的组合,称为主键。也就是说,表中的主键在所有行上必须取唯一值。
3. 参照完整性:
是指保证主关键字和外部关键字之间的参照关系。它涉及两个或两个以上表数据的一致性维护。
外键值将引用表中包含此外键的记录和被引用表中主键与外键相匹配的记录关联起来。在输入、更改或删除记录时,参照完整性保持表之间已定义的关系,确保键值在所有表中一致。
主键和外键
主键(primary key):是被挑选出来,作表的行的du惟一标识的候选关键字。一个表只有一个主关键字。主关键字又可以称为主键。 主键可以由一个字段,也可以由多个字段组成,分别成为单字段主键或多字段主键。
外键(foreign key):如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
主键
定义: 唯一标识一条记录,不能有重复的,不允许为空
作用:用来保证数据完整性,用来和其他表建立联系用的
个数 :主键只能有一个,一个表可以有多个外键
如果一列或者多列能够唯一标识表中的每一行,则这样的列可以作为主键。
外键
表的外键是另一表的主键, 外键可以有重复的, 可以是空值
数据类型
1. 整数类型
说明:不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间
2. 小数类型
从上表中可以看到,DECIMAL 的存储空间并不是固定的,而由精度值 M 决定,占用 M+2 个字节。
decimal(10,4) 中的10代表整数位数加上小数为数不能超过10位,后面的4代表小数是4位,如果插入数据时小数位数不足4位,会补0,如果大于4位,会四舍五入。 |
3. 日期和时间类型
4. 字符串类型
下面将不同的字符串保存到 CHAR(4) 和 VARCHAR(4) 列,说明 CHAR 和 VARCHAR 之间的差别,如下表所示。
5. bit类型
存储0和1,使用SQL语句往表中插入数据时,可以使用true代表1,false代表0
字节(Byte)=8位(bit) [6]
1KB( Kilobyte,千字节)=1024B [6] 1MB( Megabyte,兆字节)=1024KB [6] 1GB( Gigabyte,吉字节,千兆)=1024MB [6] 1TB( Trillionbyte,万亿字节,太字节)=1024GB [6] 1PB( Petabyte,千万亿字节,拍字节)=1024TB [6] 1EB( Exabyte,百亿亿字节,艾字节)=1024PB [6] 1 ZB(Zettabyte,十万亿亿字节,泽字节)=1024EB [6] 1YB( Yottabyte,一亿亿亿字节,尧字节)=1024ZB [6] BB( Brontobyte,千亿亿亿字节)=1024YB [6] |
数据表操作
1. 创建数据表
创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性)约束的过程。接下来我们介绍一下创建数据表的语法形式。
语法:
CREATE TABLE 表名( 列名 数据类型 约束, ... ) |
注意:
在执行上面的指令之前,先检查一下当前数据库是不是我们所期望的数据库。如果不是,则可以用USE指令切换过来。语法:
USE 数据库名
2. 查询表结构
在 MySQL 中,使用 SQL 语句创建好数据表之后,可以查看结构的定义,以确认表的定义是否正确。
指令: DESC 表名 |
3. 修改表结构
在 MySQL 中可以使用 ALTER TABLE 语句来改变原有表的结构,例如增加或删减列、更改原有列类型、重新命名列或表等。
其语法格式如下:
ALTER TABLE <表名> [修改选项] |
修改选项的语法格式如下:
{ ADD COLUMN <列名> <类型> | CHANGE COLUMN <旧列名> <新列名> <新列类型> | ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT } | MODIFY COLUMN <列名> <类型> | DROP COLUMN <列名> | RENAME TO <新表名> |
3.1. 修改表名
ALTER TABLE 表名 RENAME TO 新表名
3.2. 添加字段
3.2.1.添加到末尾:
ALTER TABLE 表名 ADD COLUMN 字段名 数据类型
3.2.2. 添加到最前
ALTER TABLE 表名 ADD COLUMN 字段名 数据类型 FIRST
3.2.3. 添加到中间
ALTER TABLE 表名 ADD COLUMN 字段名 数据类型 AFTER 已有字段名
3.2.4. 删除字段
ALTER TABLE 表名 DROP COLUMN 字段名
3.2.5. 修改字段名
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型
3.2.6. 修改字段数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型
4. 删除数据表
在删除表的同时,表的结构和表中所有的数据都会被删除,因此在删除数据表之前最好先备份,以免造成无法挽回的损失。
使用 DROP TABLE 语句可以删除一个或多个数据表,语法格式如下:
DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]
4.1. 级联删除/级联更新cascade
级联删除:当删除主表的记录时,从表的相关记录也会一起删除
级联更新:当更新主表的记录时,从表的相关记录也会一起更新
删除SET NULL:当删除主表的记录时,从表的相关记录会变成NULL
更新SET NULL:当更新主表的记录时,从表的相关记录会变成NULL
删除restrict:当删除主表的记录时,如果数据被从表引用,则不能删除,要想删除,应该先删除从表的相关记录。
更新restrict:当更新主表的记录时,如果数据被从表引用,则不能更新,要想更新,应该先修改从表的相关记录。
级联更新:ON UPDATE CASCADE 级联删除:ON DELETE CASCADE |
常见约束
1. 主键约束
主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键。主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息
通过主键,确定一个唯一的记录
使用主键应注意以下几点:
|
1.1.特点
确定为主键的列,不能为空,也不能重复
具体操作
指定主键约束,使用的是 PRIMARY KEY 关键字
一般来说,主键约束主要用在创建表时,指定约束的方式有两种:
1.2. 定义在列后
CREATE TABLE students (
sid INT (8) PRIMARY KEY,
sname VARCHAR(5),
department VARCHAR(32),
birthday date
)
1.3. 独立定义
如果在表已经创建好的前提下,还可以通过下列两种方式进行主键的指定和删除
CREATE TABLE students (
sid INT(8),
sname VARCHAR(5),
department VARCHAR(32),
birthday date,
PRIMARY KEY(sid)
)
1.4. 删除主键
ALTER TABLE students
DROP PRIMARY KEY;
1.5. 指定主键
ALTER TABLE students
ADD PRIMARY KEY(sid);
ALTER TABLE students
MODIFY sin INT PRIMARY KEY;
1.6. 主键自增
主键必须是整型,才能实现自增
CREATE TABLE students (
sid INT(8) PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(5),
department VARCHAR(32),
birthday date
)
主键自增一般用在创建表的时候,使用 AUTO_INCREMENT,直接跟在列名后即可
如果表已经创建好了,还可以进行是否自增的修改
1.6.1. 设置主键自增
ALTER TABLE students CHANGE sid sid INT AUTO_INCREMENT;
ALTER TABLE students MODIFY sid INT AUTO_INCREMENT;
1.6.2. 删除主键自增
ALTER TABLE students CHANGE sid sid INT;
ALTER TABLE students MODIFY sid INT;
说明:上面设置以及删除都给出了 CHANGE 和 MODIFY 两种,有什么区别呢?
CHANGE 后要多一个列名 sid(可以修改) ,所以总结如下:
- 只修改类型用 MODIFY
- 既修改列名,也修改类型用 CHANGE
2. 非空约束
非空约束用来约束表中的字段不能为空
指定非空约束列的值不能为空,我们使用 NOT NULL 来实现这个功能
CREATE TABLE students (
sid INT(8) PRIMARY KEY AUTO_INCREMENT,
sname varchar(5) NOT NULL, -- sname 不为空
department varchar(32),
birthday date
);
创建表完后,添加非空约束
ALTER TABLE students MODIFY sname VARCHAR(5) NOT NULL;
删除 sname 的非空约束
ALTER TABLE students MODIFY sname VARCHAR(5);
3. 唯一约束
唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性。与主键约束不同的是,唯一约束在一个表中可以有多个,并且设置唯一约束的列是允许有空值的,虽然只能有一个空值。
唯一约束,就是指定这个字段(列)的值必须是唯一的,这种感觉就类似主键,例如我们下面要求创建表的时候,指定 sname 不能重名
CREATE TABLE students (
sid INT(8) PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(5) NOT NULL UNIQUE, -- sname唯一
s department VARCHAR(32),
birthday date
);
在创建表后,添加唯一约束
ALTER TABLE students MODIFY sname VARCHAR(8) UNIQUE;
删除唯一约束(本质上就是删除索引)
ALTER TABLE students DROP INDEX sname;-- 这两种方法都是可以的
drop index sname on students;
4. 外键约束
外键约束经常和主键约束一起使用,用来确保数据的一致性。
外键的理论定义是比较复杂的,我在以前公众号写过的一篇数据库理论文章中有提及过,但是这一篇我们重点讲解 MySQL 的使用,所以,我们把理论都换成例子和通俗的大白话,先来看个问题:
学生实体和课程实体分别用关系“学生”和“课程”来表示,它们之间的联系用关系“选课”来表示
学生(学号,姓名,所在系,生日)
课程(课程编号,课程名,授课老师)
选课(学号,课程编号,成绩)
问题:判断各关系的候选键、主键、外键
答:
- 学生中(students) 学号可以确认唯一的学生是候选键,可做主键,姓名需要在不重名的情况下也可以,但是实际情况不能保证没有重名不合适,课程中(course) 课程编号可以确认唯一的课程是候选键,可做主键,而选课中(sc_relation),需要由学号和课程编号共同才能确定唯一的值,所以两者共同构成候选键,并做主键
- 选课关系中的 学号(sc_relation.sid) 和 课程号(sc_relation.cid) ,分别代表选课关系的外键,他们分别对应 学生关系的学号(students.sid)