mysql 表中的自然连接,外连接,左外连接,右外连接

MySQL连接详解

MySQL的连接主要有:

1、内连接: 只连接匹配的行
2、左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
3、右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
4、全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
5、交叉连接 
生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配

举个例子吧。
表A
id 
  name 
   
   
   

表B
id 
  address    A_id
    北京          1
    上海          3
    南京          10

包容性:A表包容B表,左连接左表是全的.(left join 或 left outer join )
SQL语句如下:
SELECT A.name, B.address
FROM A
LEFT JOIN B ON A.id = B.A_id
查询结果为:
name  
    address
张  
    北京
李  
    NULL
王  
    上海

包容性:B表包容A表,右连接右表是全的.(right join 或 right outer join )
SQL语句如下:
SELECT A.name, B.address
FROM A
RIGHT JOIN B ON A.id = B.A_id
查询结果为:
name  
    address
张  
    北京
王  
    上海
NULL  
    南京

排他性:A,B表中至少有1个匹配时,才返回行。两表的交集
SQL语句如下:
select A.name,B.address from A
inner join B
on A.id = B.A_id

查询结果为:
name  
    address
张 
      北京
王 
      上海
inner join 
内连接等价于下面的sql:
SELECT A.name, B.address
FROM A, B
WHERE A.id = B.A_id

注释:全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于

对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集


。(full join 或 full outer join )
SQL语句如下:
select * from A
full join B
查询结果为:
id  
    name      id      addressA_id
1  
    张          北京      1
2  
    李          北京      1
3  
    王          北京      1
1  
    张          上海      3
2  
    李          上海      3
3  
    王          上海      3
1  
    张          南京      10
2  
    李          南京      10
3  
    王          南京      10

注释:返回3*3=9条记录,即笛卡尔积
SQL语句如下:
SELECT * FROM A
CROSS JOIN B
查询结果为:
id  
    name      id      addressA_id
1  
    张          北京      1
2  
    李          北京      1
3  
    王          北京      1
1  
    张          上海      3
2  
    李          上海      3
3  
    王          上海      3
1  
    张          南京      10
2  
    李          南京      10
3  
    王          南京      10
CROSS JOIN等价于:
select * from A,B

注意:
1. on A.id = B.id 等同于 using(id)//这里字段名要相同
2. 当 MySQL在从一个表中检索信息时,你可以提示它选择了哪一个索引。 
 
如果  EXPLAIN 显示 MySQL使用了可能的索引列表中错误的索引,这个特性将是很有用的。 
 
通过指定 USE INDEX (key_list),你可以告诉 MySQL使用可能的索引中最合适的一个索引在表中查找记录行。 
 
可选的二选一句法 IGNORE INDEX (key_list) 可被用于告诉 MySQL不使用特定的索引。 
     

效率问题:
1.inner join比left join快
注:inner join 
内连接等价于下面的sql: SELECT A.name,B.address FROM A, B WHERE A.id = B.A_id
所以一般要用一般的连接就可以了.
2.连接字段建索引

多表外连接
select  
A.*,B.f1,B.f2,B.fn,C.f1,C.f2,C.fn  from   A    
 
left   join   B   on   A.id=B.id   
 
left   join   C   on   C.id=A.id 
 
where ......


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值