数据库中的多表查询、备份与恢复

本文详细介绍了数据库的多表查询,包括合并查询、连接查询(内连接、外连接)、自然连接和子查询,以及自连接查询。同时,讲解了数据库的备份和恢复操作,包括使用mysqldump进行数据备份,以及通过登录数据库或不登录恢复数据的两种方法,并强调了在恢复过程中需要注意的冲突问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库:数据库(数据的集合)和数据库管理系统(操作管理数据库)构成,是存储、维护和管理数据的集合

数据的完整性:(=创建表时添加约束)
1.实体完整性:表示每一行数据不重复
约束类型: 主键约束(primary key) 唯一约束(unique) 自动增长列(auto_increment)
2.域完整性:限制此单元格的数据正确,不对照此列的其它单元格比较
约束类型:数据类型(int varchar double…) 非空约束(not null) 默认值约束(default) Check约束(mysql不支持) check();
3.引用完整性(参照完整性):外键
外键和主键类型必须一致

多表查询

1.合并查询 union,union all

select * from user1  union  select * from user2;

结果:user1和user2的交集,去除重复记录

select * from user1  union all  select * from user2;

user1和user2的并集,而且不去除重复记录
注意:使用union合并查询的两个表必须保证列的类型及列数一致,列名可以不同
2.连接查询:就是求出多个表的乘积,然后再根据使用主外键关系做为条件来去除无用信息
假设现有student表

sidname
1001Dream
1002Mary
1003Tom
1004Tony

course表

cidsidscore
01100196
02100293
03100389
041001100
05100180

2.1内连接查询:[inner] join on

select * from student s,course c where s.sid = c.sid;

结果:查询的是学生及其所在班级的信息
如果用[inner] join on,则写法如下:

select * from student s [inner] join course c on s.sid=c.sid;

以上都是内查询,查询的结果是一致的,对于上述两表,查询的结果是不包含1004 Tony的,因为在course表中sid均不是1004,是不符合条件s.sid = c.sid,所以不存在查询结果中
2.2外连接查询:(查询出的结果存在不满足条件的可能)

  • 左外连接查询:left [outer] join on 以左边的表作为参照,先查询出左表,然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL
select * from student s left join course c on s.sid = c.sid;
  • 右外连接查询:right [outer] join on 以右边的表作为参照,先查询出右表,然后查询左表,左表中满足条件的显示出来,不满足条件的显示NULL
select * from student s right join course c on s.sid=c.sid;

多表查询:N个表连接查询,至少需要N-1个条件
3.自然连接查询:
natural join
natural left join
natural right join

select * from student natural join course;
select * from student natural left join course;
select * from student natural rigth join course;

使用自然连接查询,无需你去给出主外键等式,它会自动找到这一等式;两张连接的表中名称和类型完全一致的列作为条件!

子查询:一个select语句中包含另一个完整的select语句。
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。

1.第一次的查询结果是单行单列

//查询工资高于JONES的员工
select * from emp where sal>(
select sal from emp where ename = 'JONES');

2.第一次查询结果多行单列

//工资高于30号部门的所有人的员工的信息
select * from emp where sal > ALL
(select sal from emp where deptno=30);
//有两个以上直接下属的员工,mgr表示员工的领导编号
select * from emp where empno IN
(select mgr from emp group by mgr having count(mgr)>=2);

3.第一次查询结果单行多列

//查询工作和工资与MARTIN完全相同的员工的信息
select * from emp where (job,sal) IN
(select job,sal from emp where ename='MARTIN');

4.第一次查询结果多行多列

select * from emp e,(SELECT * from dept) d where e.deptno=d.deptno;
//上述语句是很鸡肋的写法,和下述语句实现的功能一样,一般直接写下列方式
select * FROM emp e, dept d where e.deptno = d.deptno

自连接查询:自己连接自己,起别名

//求7369员工编号、姓名、经理编号和经理姓名
SELECT e1.empno , e1.ename,e2.mgr,e2.ename FROM emp e1, emp e2 WHERE e1.mgr = e2.empno AND e1.empno = 7369;
//求各个部门薪水最高的员工的所有信息
select * frm emp e,(select MAX(sal) maxsal,deptno from emp group by deptno)d where e.deptno=d.deptno and e.sal=d.maxsal;

数据备份和恢复

学了好久的数据库,竟然才知道数据库备份的是脚本,而不是数据库里的数据……

  • 备份

在控制台使用如下命令实现数据的备份:
注意:如果在安装数据库的时候如果已经将windows的环境变量path中添加该目录,那么打开控制台后直接输入命令即可;但是如果没有添加该目录,则需要进入到MySQL目录下的bin文件夹
在我的机子上没有配置,所以首先进入该文件夹:
cd C:\Program Files\MySQL\MySQL Server 5.7\bin 回车
备份是不需要登录数据库的,只需要执行下列命令(如图):
mysqldump –u用户名 –p 数据库名>生成的脚本文件路径 回车后再输入密码即可!

此时查看D盘下会有mydb.sql文件,打开该文件后会发现其中存储的都是脚本,也就是SQL语句!

  • 恢复

    有两种方式
    1.登录数据库,需要指明使用的是哪个数据库,使用的数据库必须和备份时所在的数据库名保持一致!

    首先选择数据库,输入命令:use daily_dream 回车
    然后输入以下命令实现备份:
    SOURCE C:\mydb.sql
    其中,C:\mydb.sql是当时备份的存储位置
    2.无需登录数据库,可输入以下命令进行备份操作:
    mysql –u用户名 –p密码 数据库<要执行脚本文件路径

    注意,在执行脚本时需要先行核查当前数据库中的表是否与脚本文件中的语句有冲突!例如在脚本文件中存在create table a的语句,而当前数据库中已经存在了a表,那么就会出错!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值