在mysql的增删改查中,使用最多的就是查询,而查询中使用较多的就是多表之间的查询,
多表查询是指在某一条件下,对多个有逻辑关系的表进行查询,并将结果合并输出的查询方式。
而多表查询的方法就是基于这种逻辑关系而运行的,这种逻辑关系就是主外键的关系。
1.主外键约束关系
主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性。
外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的。所以说,如果谈到了外键,一定是至少涉及到两张表。
每一个表都有自己的主键,而外键是用来连接多个表之间的逻辑关系,比如下面两张表:
Dept_id就是员工表的外键,是用来和部门表建立关系的。
所以在进行多表查询时要建立表之间的主外键约束关系。
首先建立两个表来演示多表查询的结果。
创建一个部门表。
建立一个员工表,并且提前建立主外键的关系。
同时将两张表添上数据:
多表查询的方式有很多,主要是用连接查询的方法,现在介绍连接查询的方法。
1.连接查询:就是先将表进行笛卡尔积的查询:
所谓的笛卡尔积就是指表之间的积,比如员工表有三行数据,部门表也有三行数据,得出的笛卡尔积就有九行数据。而这并不是我们需要的查询结果,
要么对其的重复数据进行删除,就是通过条件筛选,要么通过关联关系去除笛卡尔积。
(1).内连接:通过条件进行查询
有两种形式:select 列1,列2,......from 表1,表2......where 表1.外键=表2.主键;
selete 列1,列2,.......from 表1 inner join 表2 on 表1.外键=表2.主键;
可以发现上面两种形式得出的查询结果是相同的,当需要查询所有数据时可以使用通配符*。
(2)外连接:分为左外连接和右外连接,查询出的结果可能有不满足条件的可能,如null。
左外连接:左表的数据不论是否满足条件都显示,然后再去查询右表,右表满足条件的显示出来,不满足的显示null:
select 列 from 表1 left outer join 表2 on 表1.外键=表2.主键[left outer join 表3 on .....];
因为员工表中没有宣传部的人员,所以都补上null。
右外连接:与左外连接相反,先把右表的数据全部显示,左表不满足的补上null:
select 列 from 表1 right outer join 表2 on 表1.外键=表2.主键[right outer join 表3 on .....];
因为部门表中没有4这个部门,所以补上null。
特殊:全外连接:将表的所有数据全部显示,没有匹配的全部补上null,mysql没有全外连接,但是可以用以下语句实现全外连接查询:
select 列 from 表1 left outer join 表2 on 表1.外键=表2.主键[left outer join 表3 on .....]
union
select 列 from 表1 right outer join 表2 on 表1.外键=表2.主键[right outer join 表3 on .....];
(3)嵌套查询(子查询):select语句中还嵌套有select语句,即拥有两个以上的select语句的查询,外查询是主查询,内查询是子查询。
子查询先运行,子查询的结果作为主查询的值使用。
当子查询出现在where后时,作为条件的一部分,可以使用all,any等关键词;
比如查询工资大于2部门的所有员工信息:
比如查询工资小于2部门的任意一人的员工信息:
当子查询出现在from后时,作为被查询的一条表。
小结:多表查询包括连接查询,交叉查询(笛卡尔积)和子查询,连接查询中要用到主外键的约束关系除去笛卡尔积,子查询要注意子查询的位置,代表了子查询的作用。