多表查询多表关系概述项目开发中在进行数据库表结构设计时会根据业务需求及业务模块之间的关系分析并设计表结构由于业务之间相互关联所以各个表结构之间也存在着各种联系基本上分为三种一对多多对一多对多—对—一对多多对一案例部门与员工的关系关系一个部门对应多个员工一个员工对应一个部门实现在多的一方建立外键指向一的一方的主键多对多案例学生与课程的关系关系一个学生可以选修多门课程一门课程也可以供多个学生选择实现建立第三张中间表中间表至少包含两个外键分别关联两方主键—对—案例用户与用户详情的关系关系一对一关系多用于单表拆分将一张表的基础字段放在一张表中其他详情字段放在另一张表中以提升操作效率实现在任意一方加入外键关联另外一方的主键并且设置外键为唯一的UNIQUE多表查询概述概述指从多张表中查询数据笛卡尔积笛卡尔乘积是指在数学中两个集合A集合和B集合的所有组合情况。在多表查询时需要消除无效的笛卡尔积多表查询分类连接查询内连接相当于查询A、B交集部分数据外连接左外连接查询左表所有数据以及两张表交集部分数据右外连接查询右表所有数据以及两张表交集部分数据自连接当前表与自身的连接查询自连接必须使用表别名子查询内连接内连接查询语法隐式内连接SELECT字段列表FROM表1,表2WHERE条件...;显式内连接SELECT字段列表FROM表1[INNER]JOIN表2ON连接条件...;外连接外连接查询语法左外连接SELECT字段列表FROM表1LEFT[OUTER]JOIN表2ON条件...;右外连接SELECT字段列表FROM表1RIGHT[OUTER]JOIN表2ON条件...;自连接自连接查询语法将其看作两张表SELECT字段列表FROM表A 别名AJOIN表A 别名BON条件...;补充自连接查询可以是内连接查询也可以是外连接查询。子查询概念SQL语句中嵌套SELECT语句称为嵌套查询又称子查询。子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。分类根据子查询结果不同分为标量子查询子查询结果为单个值列子查询子查询结果为一列行子查询子查询结果为一行表子查询子查询结果为多行多列根据子查询位置分为WHERE之后、FROM之后、SELECT之后。标量子查询子查询返回的结果是单个值数字、字符串、日期等最简单的形式这种子查询成为标量子查询。常用的操作符、、、、、列子查询子查询返回的结果是一列可以是多行这种子查询称为列子查询。常用的操作符IN、NOT IN、ANY、SOME、ALL行子查询子查询返回的结果是一行可以是多列这种子查询称为行子查询。常用的操作符、、IN、NOT IN示例-- 查询与“张无忌”的薪资及直属领导相同的员工信息select*fromempwhere(salary,managerid)(selectsalary,manageridfromempwherename张无忌);表子查询子查询返回的结果是多行多列这种子查询称为表子查询。常用的操作符IN示例-- 1.查询与“鹿杖客”宋远桥”的职位和薪资相同的员工信息select*fromempwhere(job,salary)in(selectjob,salaryfromempwherename鹿杖客orname宋远桥);-- 2.查询入职日期是“2006-01-01”之后的员工信息及其部门信息selecte.*,d.*from(select*fromempwhereentrydate2006-01-01)eleftjoindept done.dept_idd.id;联合查询关键字unionunion all对于union查询就是把多次查询的结果合并起来形成一个新的查询结果集。语法SELECT字段列表FROM表A...UNION[ALL]SELECT字段列表FROM表B...;注意对于联合查询的多张表的列数必须保持一致字段类型也需要保持一致。union all会将全部的数据直接合并在一起union会对合并之后的数据去重。