关于多表查询
只要会两个表联查,任意多表都是同样的道理。
比如说三张表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该表的与其他表的关联条件