青剑夜羽轩...

青剑衣清寒,夜羽眉流觞..

导航

关于多表查询

关于多表查询

只要会两个表联查,任意多表都是同样的道理。

比如说三张表A表、B表和C,你可以先把A和B连成一张表AB,然后表AB再和C连。

四张表,五张表,都是同样的道理。

下面探索下两张表联查,两张表有关系才会联查,表之间有关系说白了就是有关联的列(就是主外键)。

 

EmployeeTB(员工信息表):

employeeid employeename deptid
0001             张三             01
0002             李四             01
0003             王五             02
0004             赵六             02
0005             郑七             NULL

DeptTB(部门信息表)
deptid deptname
01     技术部
02    市场部
03    工程部

 

两张表联查分为内联和外联,一般都用内联。

 

内联有两种写法,结果是一样的。

一种是:SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e,DeptTB AS d WHERE e.deptid=d.deptid
另外一个是:SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e INNER JOIN DeptTB AS d ON e.deptid=d.deptid
检索的结果都是:

employeeid employeename deptname
0001 张三 技术部
0002 李四 技术部
0003 王五 市场部
0004 赵六 市场部

 

为方便描述,以下内容两张表用表A和表B来表示。

内联的原理是逐条的取任意一张表的数据,表A表B结果都一样,

以表A来举例

取出表A的第一行数据,去和表B里所有的行去匹配,符合where后面的条件(不论多少行),才会留下。

同样的步骤逐行取A的数据,直到取完。

留下的数据就是结果。

 

 

外联分外左外连右外连和完全外连,下面的sql语句中outer关键字可以省略 。

左外连检索语句为:
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e LEFT OUTER JOIN DeptTB AS d ON e.deptid=d.deptid
检索的结果都是:

employeeid employeename deptname
0001 张三 技术部
0002 李四 技术部
0003 王五 市场部
0004 赵六 市场部
0005 郑七 NULL

 

右外连检索语句为:
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON e.deptid=d.deptid
检索的结果都是:

employeeid employeename deptname
0001 张三 技术部
0002 李四 技术部
0003 王五 市场部
0004 赵六 市场部
NULL NULL 工程部

 

左外连和右外连的原理是:

以左外连举例

取出左表的第一行数据,去和右表里所有的行去匹配,符合where后面的条件(不论多少行),连到一起留下,没有符合where条件的,该行也留下,不过该行右表中所有列的值都为Null

同样的步骤逐行取左表的数据,直到取完。

留下的数据就是结果。

右外连同样的道理。

 

 

完全外连检索语句为:
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e FULL OUTER JOIN DeptTB AS d ON e.deptid=d.deptid
检索的结果都是:

employeeid employeename deptname
0001 张三 技术部
0002 李四 技术部
0003 王五 市场部
0004 赵六 市场部
0005 郑七 NULL
NULL NULL 工程部

 

 

完全外连的原理是:

Ps:左右表都一样,可以随便换位置。

取出左表的第一行数据,去和右表里所有的行去匹配,符合where后面的条件(不论多少行),连到一起留下,没有符合where条件的,该行也留下,不过该行右表中所有列的值都为Null

同样的步骤逐行取左表的数据,直到取完。

然后取出右表中没有被匹配到的列,连上左表的列(值全为null),也留下。

留下的数据就是结果。

 

 

 

 

小结:

实际中我一般都用内联,并且是第一种写法

SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e,DeptTB AS d WHERE e.deptid=d.deptid
比如说三表联查,可以先把两张表连起来(有时候两张表之间的关联不是一个where就可以解决的,可能关联的列比较多,所以会有多个条件)。

之后连第三张表的时候,在from 后加上第三张表名,在where条件后加上and该表的与其他表的关联条件

posted on 2012-02-02 16:27  yudragon  阅读(195)  评论(0编辑  收藏  举报