mysql可以恢复多表吗_mysql 多表联查 & 数据恢复

本文详细介绍了数据库的完整性概念,包括实体完整性、域完整性和外键约束。实体完整性通过主键和唯一约束确保每条记录的唯一性,而域完整性则通过数据类型和非空约束限制单元格数据的正确性。外键约束用于建立不同表之间的关联。此外,还探讨了多表查询的不同方法,如联合查询、连接查询和子查询。最后,提到了数据库的备份与恢复操作,包括生成SQL脚本和执行恢复数据的步骤。
摘要由CSDN通过智能技术生成

一,数据的完整性

作用: 保证用户输入的数据保存到数据库中是正确的

实质: 创建表的时候给表中的字段添加约束

1. 实体完整性

实体: 表中一行或者一条记录代表一个实体

实体完整性的作用:标识每一行数据不重复

约束类型:

主键约束[primary key]

paiamry key

唯一约束[unique]

unique

自动增长列[auto_increment]

1.1 主键约束[priamry key]  数据唯一且不能为null

特点/;数据唯一,且不能为null

主关键字可以是表中的一个字段或者多个字段,它的值用来唯一标识表中的第一条记录

场景: 在多个表的关联关系中

a69295358cb4

create table stu1(

id int priamry key,

name varchar(50

);

create table stu2(

id int,

name varchar(50),

priamry key(id,name

);

create table stu3(

id int,

name varchar(50),

);

alter table stu3 add constraint stu3_id priamry key(id);  #添加主键功能

1.2 唯一约束

作用: 在非主键列中不能输入重复的值

a69295358cb4

create table stu4(

id int  priamry key,

name varchar(50) unique

);

# priamry key  和 unique 之间的区别

a. 二者都强调是唯一性

b. 在同一个表中,一般只出现一个priamry key ,可以出现多个unique

c. priamry key 不允许为null ,但是unique 是允许的

1.3自动增长列

给主键添加自动增长性,列只能是整数类型

场景: 一般添加给主键

a69295358cb4

create table stu5(

id int priamry key auto_increment,

name varchar(50) unique

);

2. 域完整性

作用: 限制单元格数据的正确性,域代表当前单元格

约束类型:

数据类型:   非空约束[not null] ,  默认值约束[ default ]

2.1 数据类型

数字类型: int float double

日期类型:  date datetime

字符串类型 :varchar(20)

2.2 非空约束[not null]

create table stu6(

id int priamry key  auto_increment,

name varchar(50)  unique not null,

);

#  注意:  name 被约束为 not null ,插入数据的时候,name 坚决不能 null ,如果为null ,数据库立马报错

2.3默认约束

a69295358cb4

create table stu7(

id int priamry key auto_increment,

name varchar(50) unique  not null,

address varchar(50) default 'beijing'

);

insert into stu7 (id, name,address) values(1,'aaa','fff');

insert into stu7(id,name,address) values(2,'bbb',default);

select *  from stu7;

3.外键约束

添加外键约束:  foreign key

注意 : 添加外加必须先有主键,主键和外键的类型必须保持一致

举例: 学生表,成绩表

作用 :将两个甚至多个表产生联系

演示:

a69295358cb4

创建表

# 学生表

create table student(

stuid varchar(10) priamry key,

stuname varchar(50)

);

# 成绩表

create table score(

stuid varchar(10),

score int ,

courseid int

);

#插入数据

insert into student values('1001','zhangsan');

insert into student values('1002','xiaoming');

insert into student values('1003','jack');

insert into student values('1004','tom');

insert into score values('1001',98,1);

insert into score values('1002',95,1);

insert into score values('1003',67,2);

insert into score values('1004',83,2);

insert into score values('1004',70,1);

# 查询 :

select *  from student;

select *  from score;

a69295358cb4

create table score(

score int ,

courseid int ,stuid varchar(10),

constraint stu_sco_id foreign key(stuid) references student (stuid) );

注意:stu_score_id 是给约束起的名字,可以自定义

方式二

create table score2(

score int ,

courseid int,

stuid varchar(10)

);

alter table score2 add constraint stu_sco_id2 foreign key(stuid)

references student(stuid);

注意:主键和外键的类型必须保持一致

二.多表查询

1,表和表之间的关系

一对一

通过嵌套的方式

一对多[多对一]

添加外键

多对多

单独创建一张新的表

2.合并结果集

作用:将两个select语句的查询结果合并到一起

两种方式:

union :去除重复记录[并集]

union all : 获取所有的结果

演示:

创建表

create table A(

name varchar(10),

score int

);

create table B(

name varchar(10),

score int

);

#p批量插入数据

insert into A values(('a',10),('b',20),('c',30));

insert into B values(('a','10'),('d',40),('c',30));

# 查询结果

select * from A;

select * from B;

# 合并结果集

select * from A  union     select * from B;

select * from A   union all   select * from B;

a69295358cb4

a69295358cb4

注意:  被合并的两个结果,列数,列类型必须相同

如果遇到列数不相同的情况,如下的解决方法:

a69295358cb4

insert into C values('a',10,,29),('e',20,45),('c',30,10);

select * from A

union

select name,score from C;

3.连接查询

作用:求出多个表的乘积,列如t1和t2 , 如果采用了连接查询,得到的结果是t1*t2

演示:

select * from students,score;

a69295358cb4

# 问题:进行连接查询,会产生笛卡尔积

#笛卡尔积:两个集合相乘的结果

解释: 假设 集合A={a,b},集合B={0,1,2},则 笛卡尔积 的结果{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}

解决方法:在实际应用中,需要去除重复记录,则需要通过条件进行过滤

select s.stuid , s.stuname, c.score,courseid from student  s,score.c

where s.stuid= c.stuid;

a69295358cb4

3.1 内连接 inner join on

内连接 的特点: 查询结果必须满足条件

演示:

a69295358cb4

内连接

select s.stuid ,s.sstuname , score,c.courseid  from student s join  score c on s.stuid= c.stuid;

等价写法

a69295358cb4

select s.stuid,s.stuname , c.score,c.courseid from  student s, score c

where s.stuid=c.stuid;

查询成绩大于80 的学生记录

方式一

select s.stuid , s. stuname, c.score, c.courseid from  student  where  s.stuid = c.stuid  and c.score >80;

a69295358cb4

方式二

也是内连接,只不过相当于是方言,join on 相当于是普通话

select s.stuid,s.stuname,c.score,c.courseid  from  student  s join  score c on s.stuid = c.stuid and score>70;

a69295358cb4

方式三

select s.stuid,s.stuname,c.score,c.courseid  from student s.join score c on s.stuid where score >70;

a69295358cb4

3.2 外连接 outer join on

特点: 以其中一个表作为参照连接另外一个表

分类:

左连接:  left join on

右连接 : right join on

# 左外连接

select s.stuid,s.stuname,c.score, c.courseid from student s left  join score c on

s.stuid= c.stuid;

a69295358cb4

内连接

select s.stuid ,s.stuid,s.stuname ,c.score , c.courseid from student s join score c on s,s.stuid=c.stuid ;

a69295358cb4

右外连接

select s.stuid,s.stuname,c.score ,c.courseid  from student s right score c on s.stuid=c.stuid;

a69295358cb4

4,子查询

在一个select 语句中包含另外一个完整的select 语句[select语句的嵌套]

注意:

A,子查询出现的位置:

from 后

where 子句的后面,作为条件的一部分查询

B, 当子查询出现在where后面作为条件时,可以使用关键字: any, all

C, 子查询结果集形式

单行单列

单行多列

多行多列

演示:

1,查询是Scott 在同一个部门的员工

思路: 先查询Scott所在的部门,然后根据部门查找所有的信息

select deptno from emp where enname ='Scott';

select * from emp where deptno=(select deptno  from emp where enname='scott');

a69295358cb4

2. 查询工资高于joens 的员工信息

思路: 先查询Jones 的工资,然后根据jones 查询其他的员工信息

select * from emp where sal>(select sal from emp where enname='Jones'');

a69295358cb4

3.查询工资高于30 号部门的所有人的员工信息

思路:先查询30号部门中的最高工资,根据最高工资查询其他员工信息

select *  from emp where deptno = 30;

a69295358cb4

select max(sal) from emp where deptno = 30;

select * from emp where sal> (select max(sal) from emp where deptno =30  );

a69295358cb4

4.查询工作类型和工资与Martin完全相同的员工

思路: 先查询Martin 的工作类型 和工资,然后再查询其他的员工信息

select * from emp where (job,sal) in (select job,sal from emp where  enname='Martin');

a69295358cb4

三.数据库的备份和恢复

1,备份

生成SQL 脚本,导出数据

命令: mysqldump -u root -p  数据库名> 生成sql脚本的路径

注意:可以不需要登录数据库

演示:

rock@ rockrong : ~S mysqldump -u roor  -p mydb1 > /home /rock /Desktop/mydb1.sql

Enter password:

windows: 使用管理员权限打开cmd

恢复

执行sql 脚本,恢复数据

前提:必须先创建数据库[空的]

注意:  需要先登录数据库,然后进入指定的数据库,执行sql脚本

演示:

rock@rockrong: ~ s my sql -u root -p

enter  password :

>>create database test;

>>use tset ;

>> show tables;

>> source /home/rock//Desktop/mydb1.sql;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值