记一下数据库的多表查询

Posted 汪神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一下数据库的多表查询相关的知识,希望对你有一定的参考价值。

(安利两个讲得不错的资源:https://www.cnblogs.com/tilv37/p/5199139.html 和 https://jingyan.baidu.com/article/63acb44acfa95161fcc17e8a.html

 

稍微讲一下背景,现在有个药材表、基地表、原料去向表,还有个原料去向的关联表。这个原料去向是这样的,某个基地中某种药材的原料去向。也就是说,这个原料去向关联表和基地还有药材关联在一起了。

药材表:

(后面没有展现的属性不用理它)

基地表:

 

 

原料去向表:

 

原料去向关联表:

 

想要做的是,首页是药材,点击某个药材进药材详情表(基地表),然后再基地表中有个查看原料去向的控件,点击可以看见:

这样一个表,然后就要用到表的关联查询:

 

怎样叫做关联查询呢?其实就是 本来是两张表的东西,通过join(先不管是left还是right还是内连接)和一些join的关系,条件变成一张表(可以理解称临时表):

先来讲一下 内连接

就是直接一个join:

SELECT tg.g_name, tm.g_medicinalGone_sale, tm.g_medicinalGone_proportion, tm.g_medicinalGone_price 

FROM t_medicinal_productbase_medicinalgone as tm JOIN t_medicinal_gone as tg on tm.g_medicinalGone_id = tg.id

 

 它的结果是只输出包含连接条件的数据行:

 

然后是外连接

外连接是不会对数据进行过滤的,就是说满足连接条件的输出,不满足连接条件的它也输出(没数据的列或行就输出默认的空值),可以说外连接只是将两个表临时拼接成一个表

外连接有左连接:LEFT JOIN   和右连接: RIGHT JOIN

左右的区别就是以哪个表为基准来拼接两个表   FROM t1 LEFT JOIN t2——这种就按左边那个t1为标准,如果这里是RIGHT JOIN的话,就以右边那个t2为标准,

下面两个例子可以很好得看到差别

左连接:(左边为原料去向关联表右边为原料去向表)

SELECT tg.g_name, tm.g_medicinalGone_sale, tm.g_medicinalGone_proportion, tm.g_medicinalGone_price 

FROM t_medicinal_productbase_medicinalgone as tm LEFT JOIN t_medicinal_gone as tg on tm.g_medicinalGone_id = tg.id

 

 

 右连接:(左边为原料去向关联表右边为原料去向表)

我们可以看到,因为以右边的表为基准,所以右边的行一定要全部显示,如果有多个符合条件的,就重复显示。但有些原料去向没有数据的(没有属于哪个基地中的哪个药材),所以有不符合条件的原料去向,但还是要全部显示出来。于是就显示默认的空值Null。

以上是关于记一下数据库的多表查询的主要内容,如果未能解决你的问题,请参考以下文章

ABP 数据库 -- ABP&EF中的多表关联查询

现身说法:实际业务出发分析百亿数据量下的多表查询优化

「mysql优化专题」你们要的多表查询优化来啦!请查收

mysql数据库的多表查询,子查询,联合查询

数据库SQL的多表查询

Oracle中的多表查询(笛卡尔积原理)