一,数据的完整性
作用: 保证用户输入的数据保存到数据库中是正确的
实质: 创建表的时候给表中的字段添加约束
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;