数据库的复习(二)
2020年2月29日
今天跟着明天接着复习。
数据的完整性
作用:保证用户输入的数据保存到数据库中是正确的。确保数据的完整性 = 在创键表时给表中添加约束(对数据进行规范)
完整性的分类:
实体完整性:(行级约束)
域完整性:(列级约束)
引用完整性:
- 实体完整性
实体:即表中的一行(一条记录)代表一个实体(entity)
实体完整性的作用:标识每一行数据不重复。
约束类型: 主键约束(primary key) 唯一约束(unique) 自动增长列 (auto_increment)
1.1 主键约束(primary key)
注:每个表中要有一个主键。
特点:数据唯一,且不能为null
第一种添加方式:
CREATE TABLE student(
id int primary key,
name varchar(50)
);
第二种添加方式:此种方式优势在于,可以创建联合主键
CREATE TABLE student(
id int,
name varchar(50),
primary key(id)
);
CREATE TABLE student(
classid int,
stuid int,
name varchar(50),
primary key(classid,stuid)
);
第三种添加方式:
CREATE TABLE student(
id int,
name varchar(50)
);
ALTER TABLE student ADD PRIMARY KEY (id);
1.2 唯一约束(unique):
特点:数据不能重复。
CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);
1.3自动增长列(auto_increment)
SQLserver数据库 (identity) oracle数据库( sequence)
给主键添加自动增长的数值,列只能是整数类型
序号会一直增长,删除之前的数据也不会影响。
CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);
INSERT INTO student(name) values(‘tom’);
- 域完整性
域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较
域代表当前单元格
域完整性约束:数据类型 非空约束(not null) 默认值约束(default) check约束(mysql不支持)check(sex=‘男’ or sex=‘女’)
2.1 数据类型就是一种约束
2.2 非空约束 not null
CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10)
);
INSERT INTO student values(1,’tom’,null);
2.3 默认值约束 default
CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10) default ‘男’
);
insert into student1 values(1,'tom','女');
insert into student1 values(2,'jerry',default);
- 引用完整性(参照完整性)
外键约束:FOREIGN KEY
CREATE TABLE student(
sid int pirmary key,
name varchar(50) not null,
sex varchar(10) default ‘男’
);
create table score(
id int,
score int,
sid int , -- 外键列的数据类型一定要与主键的类型一致
CONSTRAINT fk_score_sid foreign key (sid) references student(id) ---约束-约束名-外键 -本表中的属性-连接-外表中的属性
);
第二种添加外键方式
ALTER TABLE score1 ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);
- 表与表之间的关系
一对一:
一对多:
多对多:
多表查询(*)
多表查询有如下几种:
1. 合并结果集;UNION 、 UNION ALL
2. 连接查询:
内连接 [INNER] JOIN ON
外连接 OUTER JOIN ON
左外连接 LEFT [OUTER] JOIN
右外连接 RIGHT [OUTER] JOIN
全外连接(MySQL不支持)FULL JOIN
3. 自然连接 NATURAL JOIN
4. 子查询
- 合并结果集
作用:合并结果集就是把两个select语句的查询结果合并到一起
要求:被合并的两个结果:列数、列类型必须相同。
方式:
1.1 UNION:去除重复记录
例子:SELECT * FROM s1 UNION SELECT * FROM s2;
1.2 UNION ALL:不去除重复记录
例子:SELECT * FROM s1 UNION ALL SELECT * FROM s2;
- 连接查询(**)
概念:连接查询就是求出多个表的乘积
例如,s1和s2连接,查询出来的结果就是s1*s2
代码:select * from s1,s2;
使用主外键关系做为条件来去除无用信息
例子:
代码:SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
2.1 内连接
标准内连接代码:SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;
(inner可以省略)
特点:查询的结果必须满足条件
2.2 外连接
特点:查询出来的结果存在不满足条件的可能
2.2.1 左连接:
先查询左表的,然后查询右表的,然后将右表中满足的显示出来,不满足的就显示NULL
代码:SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;
2.2.2 右连接:
右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。
代码:SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno;
2.2.3 连接查询心得:
连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件。
- 自然连接
自然连接无需你去给出主外键等式,它会自动找到这一等式。
例如:
(内连接)代码:SELECT * FROM emp2 NATURAL JOIN dept;
(右连接)代码:SELECT * FROM emp2 NATURAL LEFT JOIN dept;
(左连接)代码:SELECT * FROM emp2 NATURAL RIGHT JOIN dept;
- 子查询(*)
一个select语句中包含另一个完整的select语句。子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
例子:
4.1 查询工资高于jones的员工
第一步:先查询jones这个员工的工资
代码:select sal from emp2 where ename = 'jones';
第二步:然后查询高于jones工资的员工
代码:select * from emp2 where sal>(第一步);
第三步:将两步放在一起
代码:select * from emp2 where sal > (select sal from emp2 where ename = 'jones');
4.2 查询与SCOTT同一个部门的员工。
第一步:先查询SCOTT这个员工的部门
代码:select deptno from emp2 where ename='SCOTT';
第二步:再查询这个部门的员工
代码:select * from emp2 where deptno=(第一步);
第三步:将第一步和第二步连接在一起
代码:select *from emp2 where deptno = (select deptno from emp2 where ename = 'SCOTT');
4.3 工资高于30号部门所有人的员工信息
(工资高于30部门所有人工资,其中30部门所有人工资是子查询。高于所有需要使用all关键字)
代码:select * from emp2 where sal > all(select sal from emp2 where deptno = 30);
- 自连接:自己连接自己,起别名
练习:
5.1 求7369员工编号、姓名、经理编号和经理姓名
代码:select e1.empno,e1.ename,e2.empno,e2.ename from emp2 e1,emp2 e2 where e1.mgr=e2.empno and e1.empno = 7369;
5.2 求各个部门薪水最高的员工所有信息
(注意分组是使用group by)
代码:select e.* from emp2 e,(select max(sal) maxsal,deptno from emp2 group by deptno) a where e.deptno = a.deptno and e.sal = a.maxsal;
- MYSQL数据库的备份与恢复
6.1 生成SQL脚本,导出数据
在控制台使用mysqldump命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。(不需要登陆mysql)
mysqldump -u用户名 -p密码 数据库名>你想要生成的脚本文件路径
mysqldump -uroot -p123456 mydb1>d:\mydb1.sql
6.2 执行SQL脚本 恢复数据
执行SQL脚本需要登录mysql,然后进入指定数据库,才可以执行SQL脚本
source 生成路径
source d:\mydb1.sql
好了复习告一段落,主要是通过这次复习将大二的数据库语言再复习一下,准备即将来自大四找实习时的面试,如果有更多的建议,请你们评论告诉我,谢谢