mysql 多表联查 & 数据恢复

一,数据的完整性

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

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

1. 实体完整性

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

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

约束类型:

    主键约束[primary key]

paiamry key

    唯一约束[unique]

unique

    自动增长列[auto_increment]

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

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

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

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


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 唯一约束

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

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自动增长列

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

场景: 一般添加给主键

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默认约束

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

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

举例: 学生表,成绩表

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

演示:

创建表 

# 学生表

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;


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;


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

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


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;

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

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

解释: 假设 集合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;


3.1 内连接 inner join on 

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

演示: 


内连接

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

等价写法


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;


方式二 

也是内连接,只不过相当于是方言,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;


方式三

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


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;


内连接 

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


右外连接

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


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');


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

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

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


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

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

select *  from emp where deptno = 30;


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

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


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

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

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


三.数据库的备份和恢复

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;

你可能感兴趣的:(mysql 多表联查 & 数据恢复)