目录
一、表与表之间的关系
1、一对一
当出现一对一关系时,我们需要判断出主从关系,即谁是主表,谁是从表。比如独生子家庭的父亲和儿子,一个人可以没有儿子,但儿子必须有个亲爹。
2、一对多(多对一)
最为常见的就是一对多!一对多和多对一取决于判断的角度。父亲和孩子的关系,从父亲的角度来看就是一对多,从孩子的角度来看就是多对一。
3、多对多
例如学生和老师,一个学生可以有多个老师,而一个老师也可以有多个学生。
二、多表查询
多表查询分为三种:
1、合并结果集:UNION、UNION ALL
2、连接查询:
--->内连接:[INNER] JOIN ON
--->外连接:OUTER JOIN ON
* 左外连接:LEFT [OUTER] JOIN
* 右外连接:RIGHT [OUTER] JOIN
* 全外连接(MySQL不支持):FULL JOIN
--->自然连接:NATURAL JOIN
3、子查询
三、合并结果集
先创建两个表
CREATE TABLE `t1`(
`a` INT PRIMARY KEY,
`b` VARCHAR(50)
);
CREATE TABLE `t2`(
`c` INT PRIMARY KEY,
`d` VARCHAR(50)
);
插入数据
INSERT INTO t1 VALUES
(1,'A'),
(2,'B'),
(3,'C'),
(4,'D');
INSERT INTO t2 VALUES
(4,'D'),
(5,'E'),
(6,'F') ;
1、作用
把两个SELECT语句的查询结果合并到一起。
被合并的两个结果:列数和列类型必须相同
2、合并结果集的两种方式
(1) UNION:去除重复记录
(2) UNION ALL:不去除重复记录
四、连接查询
连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2。
t1表中的每一条记录分别乘以t2表中的所有记录
---> 连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。
--->那么多表查询产生这样的结果并不是我们想要的,那么怎么去除重复的,不想要的记录呢,当然是通过条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过关联关系去除笛卡尔积。
创建emp表,并插入数据
创建dept表,并插入数据
select * from emp,dept;的查询结果是56条记录,但每个人的部门只对应一条部门信息,其他的笛卡尔积是不正确的,真正正确的记录只有14条。想在查询emp表的同时,把每个员工的所在部门信息显示出来,那么就需要使用主外键来去除无用信息了。
1、内连接
如果两个表中有相同的字段,可以用来筛除信息
查询结果必须满足条件
(1)查询两个表中的所有字段
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
内连接标准语法:
SELECT * FROM e.emp [INNER] JOIN dept d ON e.deptno=d.deptno;
(2)查询两个表中的指定字段
SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.dname FROM emp,dept WHERE emp.deptno=dept.deptno;
内连接标准语法:
SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.dname FROM emp e [INNER] JOIN dept d WHERE e.deptno=d.deptno;
(3)给表起别名
SELECT e.empno,e.ename,e.sal,e.deptno,d.dname FROM emp AS e,dept AS d WHERE e.deptno=d.deptno;
AS可以省略
SELECT e.empno,e.ename,e.sal,e.deptno,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno;
2、外连接
外连接有分为:
左外连接:LEFT [OUTER] JOIN
右外连接:RIGHT [OUTER] JOIN
(1)左外连接
特点:查询出结果存在不满足条件的可能
左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL
SELECT * FROM emp e LEFT [OUTER] JOIN dept d ON e.deptno=d.deptno;
(2)右外连接
右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。
SELECT * FROM emp e RIGHT [OUTER] JOIN dept d ON e.deptno=d.deptno;
3、自然连接
连接查询会产生无用笛卡尔积,我们通常使用主外键关系等式来去除它。而自然连接无需你去给出主外键等式,它会自动找到这一等式
自然连接 :SELECT * FROM emp NATURAL JOIN dept;
自然左连接:SELECT * FROM emp NATURAL LEFT JOIN dept;
自然右连接:SELECT * FROM emp NATURAL RIGHT JOIN dept;
五、MySQL数据库的备份与恢复
1、生成SQL脚本,导出数据
在控制台使用mysqldump命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。
mysqldump -u用户名 -p密码 数据库名>生成的脚本文件路径
在D盘生成了脚本文件
2、执行SQL脚本,恢复数据
前提:必须先创建数据库名
执行SQL脚本需要登录mysql,然后进入指定数据库,才可以执行SQL脚本!!!
执行SQL脚本不只是用来恢复数据库,也可以在平时编写SQL脚本,然后使用执行SQL 脚本来操作数据库!
SOURCE 脚本文件路径;
3、无需登录MySQL,执行脚本文件
mysql –u用户名 –p密码 数据库<要执行脚本文件路径