MySQL数据库-sql连接

连接

  • 内连接:关键字(INNER JOIN)获取两张表中字段匹配的数据,也就是返回共有的数据。
  • 左连接:关键字(LEFT JOIN)获取做左表中的所有记录,即使右表中没有相对于的数据。
  • 右连接:关键字(RIGHT JOIN)获取右表中的所有记录,即使左表中没有相对于的数据。
    假设A表为books,b表为articls.
    内连接():
    select * from book a inner join articls b on a.title=b.title
    
    其中a.title 表示books表中的title字段,b.title表示的articles表中的字段,这行命令的意思是使用mysql中的 inner join关键字来连接两张表(books表与articles表)组合两张表的字段并且返回关联字段相对应的字段(a.title=b.title)注意:这里也可以省略inner直接写为join,也能实现上述功能。
  • 左连接:
    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='武汉吉奥')

总结:

  1. 内联结是很有必要的
  2. 内联结因为有两个表,注意“ 完全限定名 ”的使用。
  3. 不要过多对三个及三个以上表使用内联结,会降低性能,而且连接表有最大数目限制,不同数据库不一样,可参考文档。
  4. 内联结一定不能忘了 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
发布了12 篇原创文章 · 获赞 3 · 访问量 302

猜你喜欢

转载自blog.csdn.net/speriuder/article/details/103061533