数据库复习(二)

114 阅读7分钟

数据的完整性

  • 作用:保证用户输入的数据保存到数据库中是正确的。确保数据的完整性 = 在创键表时给表中添加约束(对数据进行规范)
    • 完整性的分类:
      • 实体完整性:(行级约束)
      • 域完整性:(列级约束)
      • 引用完整性:
  • 实体完整性
    • 实体:即表中的一行(一条记录)代表一个实体(entity)
    • 实体完整性的作用:标识每一行数据不重复。
    • 约束类型: 主键约束(primary key) 唯一约束(unique) 自动增长列 (auto_increment)
      • 主键约束(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’);
  1. 域完整性 域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较 域代表当前单元格 域完整性约束:数据类型 非空约束(not null) 默认值约束(default) check约束(mysql不支持)check(sex='男' or sex='女')

2.1 数据类型就是一种约束 2.2 非空约束 not null

CREATE TABLE student(
Id int primary key,
Name varchar(50) not null,
Sex varchar(10)
);
INSERT INTO student values(1,’tom’,null);

2.3 默认值约束 default

CREATE TABLE student(
Id int primary key,
Name varchar(50) not null,
Sex varchar(10) default ‘男’
);
insert into student1 values(1,'tom','女');
insert into student1 values(2,'jerry',default);
  1. 引用完整性(参照完整性) 外键约束:FOREIGN KEY
CREATE TABLE student(
sid int primary 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. 表与表之间的关系 一对一: 在这里插入图片描述 一对多: 在这里插入图片描述 多对多: 在这里插入图片描述

多表查询(*)

多表查询有如下几种: 1. 合并结果集;UNION 、 UNION ALL 2. 连接查询: 内连接 [INNER] JOIN ON 外连接 OUTER JOIN ON 左外连接 LEFT [OUTER] JOIN 右外连接 RIGHT [OUTER] JOIN 全外连接(MySQL不支持)FULL JOIN 3. 自然连接 NATURAL JOIN 4. 子查询

  1. 合并结果集 作用:合并结果集就是把两个select语句的查询结果合并到一起 要求:被合并的两个结果:列数、列类型必须相同。 方式: 1.1 UNION:去除重复记录 例子:SELECT * FROM s1 UNION SELECT * FROM s2; 在这里插入图片描述 1.2 UNION ALL:不去除重复记录 例子:SELECT * FROM s1 UNION ALL SELECT * FROM s2; 在这里插入图片描述
  2. 连接查询(**) 概念:连接查询就是求出多个表的乘积 例如,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张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件。

  1. 自然连接 自然连接无需你去给出主外键等式,它会自动找到这一等式。 例如: (内连接)代码:SELECT * FROM emp2 NATURAL JOIN dept; (右连接)代码:SELECT * FROM emp2 NATURAL LEFT JOIN dept; (左连接)代码:SELECT * FROM emp2 NATURAL RIGHT JOIN dept;
  2. 子查询(*) 一个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);
  3. 自连接:自己连接自己,起别名 练习: 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;
  4. 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

好了复习告一段落,主要是通过这次复习将大二的数据库语言再复习一下,准备即将来自大四找实习时的面试,如果有更多的建议,请你们评论告诉我,谢谢