您的位置:首页 > 数据库

数据库的复习(二)

2020-03-31 19:34 851 查看

2020年2月29日
今天跟着明天接着复习。

数据的完整性

作用:保证用户输入的数据保存到数据库中是正确的。确保数据的完整性 = 在创键表时给表中添加约束(对数据进行规范)
完整性的分类:
实体完整性:(行级约束)
域完整性:(列级约束)
引用完整性:

  1. 实体完整性
    实体:即表中的一行(一条记录)代表一个实体(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’);
  1. 域完整性
    域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较
    域代表当前单元格
    域完整性约束:数据类型 非空约束(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);
  1. 引用完整性(参照完整性)
    外键约束: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. 表与表之间的关系
    一对一:

    一对多:

    多对多:

多表查询(*)

多表查询有如下几种:
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

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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
程序胖 发布了26 篇原创文章 · 获赞 16 · 访问量 2359 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: