Mysql的多表查询,一看就会!

Mysql的多表查询,一看就会!

一、内连接多表查询

1.隐式内连接

/*
	隐式内连接在开发过程中不建议使用,因为效率较低
	这里只是提供一种解决思路
*/
SELECT 字段列表 FROM 表A,表B WHERE 条件; 

简单说明:隐式内连接相对于单表查询,只是将表A后面新加了一个表B,但是注意一点,如果WHERE后面的条件没有判断两表之间关联的字段的话,会发生迪卡尔积。就会有很多错误的查询结果

2.显示内连接

/*
	内连接推荐使用,但实际开发过程还是选择外连接
*/
SELECT 字段列表 FROM 表A INNER JOIN 表B ON 条件;

简单说明:注意此处的INNER关键字是可以省略的,但不建议省略,影响阅读。应遵循Mysql开发的书写规范。

总结:内连接的多表查询,条件通常是将两表的主键以及外键字段用=号来进行筛选。否则会出现迪卡尔积的现象,就是例如表A中有5条数据,表B中有3条数据,则查出来的结果为15条数据,会产生多余的错误数据。所以通常都是以表A外键 = 表B主键这样的方式来进行筛选。内连接的筛选后的结果为两表的一个交集数据,例如表A数据:1,2,3;表B数据3,4,5;则筛选后的结果为3。

二、外连接多表查询

1.左外连接

/*
	左外连接使用到的关键字是LEFT OUTER JOIN 
	见名识意
*/
SELECT 字段列表 FROM 表A LEFT OUTER JOIN 表B ON 条件;

简单说明:此处的 OUTER也是可以省略的,但是以上面的简述为准,不建议省略。于前两个语句同理,条件是筛选两表之间正确的数据的。左外连接,举个小案例:表A数据:1,2,3;表B数据3,4,5;则筛选后的结果为1,2,3。从这里已经可以看出来了,左外连接的特点了吧!是将两表之间筛选后的所有表A字段的数据都查询出来,其中包含交集部分。表A中没有对应的表B信息为以NULL显示。
2.右外连接

/*
	右外连接使用到的主要关键字是RIGHT OUTER JOIN

*/
SELECT 字段列表 FROM 表A RIGHT OUTER JOIN 表B ON 条件;

简单说明:与左外连接语法上的差别就是将LEFT换成了RIGHT,右外连接的查询结果与左外连接的结果恰恰相反,是将两表之间筛选后的所有表B字段的数据都查询出来,其中包含交集部分。表B中没有对应的表A信息为以NULL显示。

三、子查询

1.子查询结果为单行单列

/*
	子查询的结果为单行单列的情况
	
*/
SELECT 字段列表 FROM 表A WHERE 表A.字段 = (SELECT 聚合函数 FROM 表B WEHRE 条件);

简单说明:子查询结果为单行单列的用法就是将一个查询语句查询出来结果集之后,作为另外一条查询语句的判断条件。

2.子查询结果为多行单列

/*
	子查询的结果为多行单列的情况

*/
SELECT 字段列表 FROM 表A WHERE 表A.字段 IN (SELECT 字段 FROM 表B WEHRE 条件);

简单说明:多行单列的情况下的话,是相当于有同一个字段的多个值 ,所以在这里其实也是相当于做一个条件判断,只不过是作为条件。它的值有多个,不能直接进行条件判断,需要使用到IN。IN的意思就是将括号内的多个字,只要有一个符合的,就会进行筛选,直到筛选表A完毕。

3.子查询的结果为多行多列

/*
	子查询的结果为多行多列的情况
*/
SELECT 字段列表 FROM 表A,(SELECT 字段列表 FROM 表B WHRER 条件) AS 表B WHERE 条件;

简单说明:子查询的结果为多行多列的话,那么它呈现的表现形式就是一张表。既然它是一张表的话,它的用途就行明显了。对的!就是将它作为一张表,和另外一张表再进行筛选。这里需要注意的一点是:把表B作为虚拟表的话,如果后续需要引用的话是非常的麻烦的,所以一定要给它起一个别名,方便我们在另外位置使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值