连接
- 内连接:关键字(INNER JOIN)获取两张表中字段匹配的数据,也就是返回共有的数据。
- 左连接:关键字(LEFT JOIN)获取做左表中的所有记录,即使右表中没有相对于的数据。
- 右连接:关键字(RIGHT JOIN)获取右表中的所有记录,即使左表中没有相对于的数据。
假设A表为books,b表为articls.
内连接():
其中a.title 表示books表中的title字段,b.title表示的articles表中的字段,这行命令的意思是使用mysql中的 inner join关键字来连接两张表(books表与articles表)组合两张表的字段并且返回关联字段相对应的字段(a.title=b.title)注意:这里也可以省略inner直接写为join,也能实现上述功能。select * from book a inner join articls b on a.title=b.title
- 左连接:
左连接会读取左边数据表的全部数据,即使右边数据表没有对应数据。(如果两个表中数据有相同部分,只显示一个)select a.id,a.title,a.acreade_at from books a left join articles b on a.title=b.title
- 右连接:
右连接会读取右边数据表的全部数据,即使左边数据表没有对应数据。(如果两个表中数据有相同部分,只显示一个)select a.id,a.title,a.acreade,b.content from books a right join articles b on a.title=b.title
- 左独有:参照left join,A独有 只是将AB交集部分去掉
select * from emp e left join dept d on e.deptid = d.id where d.id is null
- 右独有:参照right join,B独有只是将AB交集部分去掉。
select * from emp e right join dept d on e.deptid = d.id where e.deptid is null
- 并集(A,B合集):由于mysql不支持full outer join,所以这里通过union进行转换。AB并集 = AB交集 + A独有 + B独有。
sql select * from emp e left join dept d on e.deptid = d.id union select * from emp e right join dept d on e.deptid = d.id ``
内联结、自然联结、自联结、交叉联结
概念:所谓“ 联结 ”指的是数据表和本身,以及不同数据表之间的“ 联结关系 ”。常见的联结有自连接、自然连接、内连接、外联结、完全连接等等。
- 自联结(self-join):指的是一个表自己和自己连接
SELECT C1.vendname,C1.productname,C1.productprice,C1.weight,C1.guide
FROM productinfo AS C1,productinfo AS C2 /*注意给同一个表区别名,为了区分*/
WHERE C1.vendname=C2.vendname AND C2.productname='hc_002'
- 内联结(inner join)——也称之为“ 等值联结 ” (equijoin):适用于两个表或者是多个表有关系的情况
select vendname,productname,productprice,weight
from productinfo INNER JOIN vendors
ON productinfo.vendname=vendors.vendname and (vendors.vendname='南方数码' or vendors.vendname='武汉吉奥')
总结:
- 内联结是很有必要的
- 内联结因为有两个表,注意“ 完全限定名 ”的使用。
- 不要过多对三个及三个以上表使用内联结,会降低性能,而且连接表有最大数目限制,不同数据库不一样,可参考文档。
- 内联结一定不能忘了 where 子句或者是 on 子句,否则会产生出乎意料的结果(笛卡尔积)
- 自然联结(Natural join):自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉
select p.*,v.*
from productinfo as p natural join vendors as v
1、自然连接是特殊的内联结(等值联结),自然联结不能有where和on去限制筛选
2、等值连接要求相等的分量,不一定是公共属性(即相同的列名);而自然连接要求相等的公共属性(列名)。
外联结、左外联结、右外联结、全外联结
- 外联结(outer join):
select p.*,v.*
from productinfo as p LEFT OUTER JOIN vendors as v
on p.vendname=v.vendname
右外联结(right outer join) :
select p.*,v.*
from productinfo as p RIGHT OUTER JOIN vendors as v
on p.vendname=v.vendname