
一.多表关系1.含义项目开发中在进行数据库表结构设计时会根据业务需求及业务模块之间的关系分析并设计表结构由于业务之间相互关联所以各个表结构之间也存在着各种关系基本分为三种一对多多对多一对一2.一对多多对一案例部门和员工 的关系关系一个部门对应多个员工一个员工对应一个部门实现在多的一方建立外键指向一的一方的主键3.多对多案例学生与课程的关系关系一个学生可以选修多门课程一门课程也可以供多个学生选择实现建立第三张中间表中间表至少包含两个外键分别关联两方主键4.一对一案例用户与用户详情的关系关系一对一关系多用于单表拆分将一张表的基础字段放在一张表中其他详情字段放在另一张表中以提升操作效率实现在任意一方加入外键关联另外一方的主键并且设置外键为唯一的UNIQUE二.多表查询概述1.含义指从多张表中查询数据笛卡尔积笛卡尔积乘积是指在数学中两个集合A和集合B的所有组合情况在多表查询时需要取消无效的笛卡尔积如何消除无效的笛卡尔积select * from emp,dept where emp.dept_id dept.id;2.多表查询的分类连接查询内连接相当于查询A、B交集部分数据外连接左外连接查询左表所有数据以及两张表交集部分数据右外连接查询右表所有数据以及两张表交集部分数据自连接当前表与自身的连接查询自连接必须使用表别名子查询1内连接1.查询每一个员工的姓名及关联的部门的名称隐式内连接显示 select e.emp,d.name from emp e,dept d where e.dept_id d.id; 2.查询每一个员工的姓名及关联的部门的名称显示内连接实现 -- INNER JOIN --ON select e.name,d.name from emp e join dept d on e.dept_id d.id; --INNER可以省略2外连接1.查询emp表的所有数据和对应的部门信息左外连接 select e.*,d.name from emp e left join dept d on e.dept_id d.id; 2.查询dept表的所有数据和对应的员工信息右外连接 select e.*,d.name from emp e right join dept d on e.dept_id d.id;注一般实际应用中多用左外连接因为左外可以将两个表位置换一下效果和右外一样3自连接-- 自连接 1.查询员工及其所属领导的名字 select a.name,b.name from emp a, emp b where a.managerid b.id4联合查询UNION ALL直接将查询的结果进行合并UNION对数据进行合并之后进行自动去重注意事项对于联合查询的多张表的列数必须保持一致字段类型也需要保持一致。5子查询根据子查询结果不同分为标量子查询子查询结果为单个值子查询返回的结果时单个值数字、字符串、日期等最简单的形式这种子查询称为标量子查询常用操作符 1. a.查询“销售部”部门ID b.根据销售部门ID查询员工信息 select * from emp where dept_id (select id from dept where name 销售部); 2.查询在“东方白”入职之后的员工信息 select * from emp where entrydate (select entrydate from emo where name 东方白);列子查询子查询结果为一列子查询返回的结果是一列可以是多行这种子查询称为列子查询常用的操作符IN、NOT IN、ANY、SOME、ALL1.查询销售部和市场部的所有员工信息 a.查询销售部和市场部的部门ID b.根据部门ID查询员工信息 select * from emp where dept_id in(select id from dept where name 销售部 or name 市场部;行子查询子查询结果为一行子查询返回的结果是一行可以是多列这种子查询称为行子查询常用的操作符、、IN、NOT IN1.查询与“张无忌”的薪资及直属领导相同的员工信息 a.查询“张无忌”的薪资及直属领导 b.查询与“张无忌”的薪资及直属领导相同的员工信息 select * from where (salary,managerid) (select salary,managerid from emp where name 张无忌);表子查询子查询结果为多行多列子查询返回的结果是多行多利这种子查询称为表子查询常用的操作符IN1.查询入职日期是在“2006-01-01”之后的员工信息及其部门信息 a.入职日期是在“2006-01-01”之后的员工信息 b.查询这部分的员工信息对应的部门信息 select e.*,d.* from (select * form emp where entrydate 2016-01-01) e left join dept on e.dept_id d.id;注根据子查询位置分为WHERE之后FROM之后SEKECT之后