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

药材表:

sql server select查询多张表自增id sql查询多个表的数据_数据库

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

基地表:

 

sql server select查询多张表自增id sql查询多个表的数据_数据库_02

 

原料去向表:

sql server select查询多张表自增id sql查询多个表的数据_关联查询_03

 

原料去向关联表:

sql server select查询多张表自增id sql查询多个表的数据_外连接_04

 

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

sql server select查询多张表自增id sql查询多个表的数据_外连接_05

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

 

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

sql server select查询多张表自增id sql查询多个表的数据_关联查询_06

先来讲一下 内连接

就是直接一个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



 

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

sql server select查询多张表自增id sql查询多个表的数据_外连接_07

 

然后是外连接

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

外连接有左连接: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



 

sql server select查询多张表自增id sql查询多个表的数据_外连接_08

 

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

sql server select查询多张表自增id sql查询多个表的数据_ci_09

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