mysql的多表查询

在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后时,作为被查询的一条表。


小结:多表查询包括连接查询,交叉查询(笛卡尔积)和子查询,连接查询中要用到主外键的约束关系除去笛卡尔积,子查询要注意子查询的位置,代表了子查询的作用。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值