mysql inner join using_mysql left join,right join,inner join用法分析

1、内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。

内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。

2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。

在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:

1)LEFT  JOIN或LEFT OUTER JOIN

左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

3)FULL  JOIN 或 FULL OUTER JOIN完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

3、交叉联接交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。

下面是例子分析

表A记录如下:

aID aNum1a200501112a200501123a200501134a200501145 a20050115

表B记录如下:

bID bName1 2006032401

2 2006032402

3 2006032403

4 2006032404

8 2006032408

实验如下:

1.left join(左联接)---外连接

sql语句如下:

SELECT * FROM a LEFT JOIN b ON a.aID =b.bID

结果如下:

aID aNum bID bName1 a20050111 1 2006032401

2 a20050112 2 2006032402

3 a20050113 3 2006032403

4 a20050114 4 2006032404

5a20050115 NULL NULL

(所影响的行数为5 行)

结果说明:

left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.

换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).

B表记录不足的地方均为NULL.

2.right join(右联接) ----外连接

sql语句如下:

SELECT * FROM a RIGHT JOING b ON a.aID = b.bID

结果如下:

aID aNum bID bName1 a20050111 1 2006032401

2 a20050112 2 2006032402

3 a20050113 3 2006032403

4 a20050114 4 2006032404NULL NULL8 2006032408(所影响的行数为5 行)

结果说明:

仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

3.inner join(相等联接或内联接)

sql语句如下:

SELECT * FROM a INNER JOIN b ON a.aID =b.bID

等同于以下SQL句:

SELECT * FROM a,b WHERE a.aID = b.bID

结果如下:

aID aNum bID bName1 a20050111 1 2006032401

2 a20050112 2 2006032402

3 a20050113 3 2006032403

4 a20050114 4 2006032404

结果说明:

很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.

4.全连接

sql语句如下:

SELECT * FROM a full join JOIN b ON a.aID =b.bID

结果如下:

aID aNum bID bName1 a20050111 1 2006032401

2 a20050112 2 2006032402

3 a20050113 3 2006032403

4 a20050114 4 2006032404NULL NULL8 2006032408

5 a20050115 NULL NULL

结果说明:

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

5.交叉连接(取笛卡儿积)

概念:没有where条件的交叉连接将产生连接表所涉及的笛卡尔积。即TableA的行数*TableB的行数的结果集。(TableA 5行*TableB 5行=25行)

sql语句:

SELECT * FROM a cross join JOIN b;

结果如下:

aID aNum bID bName1 a20050111 1 2006032401

2 a20050112 1 2006032401

3 a20050113 1 2006032401

4 a20050114 1 2006032401

5 a20050115 1 2006032401

1 a20050111 2 2006032402

2 a20050112 2 2006032402

3 a20050113 2 2006032402

4 a20050114 2 2006032402

5 a20050115 2 2006032402

1 a20050111 3 2006032403

2 a20050112 3 2006032403

3 a20050113 3 2006032403

4 a20050114 3 2006032403

5 a20050115 3 2006032403

1 a20050111 4 2006032404

2 a20050112 4 2006032404

3 a20050113 4 2006032404

4 a20050114 4 2006032404

5 a20050115 4 2006032404

1 a20050111 8 2006032408

2 a20050112 8 2006032408

3 a20050113 8 2006032408

4 a20050114 8 2006032408

5 a20050115 8 2006032408

以上写法等效于:

select * from a,b

两张表:

0e3ecaea303d0a60e8f0689dd4314458.png

自然连接

通过MySql自己的判断完成连接过程,不需要指定连接条件。MySql会使用表内的,相同的字段,作为连接条件。

自然连接分为内外之分。

内:natural join

4af9c9face78144c7540e68f9e406647.png

外:左外natural left join、右外natural right join

0cd38367ccf6dcf1aea86ca0ba2a3ceb.png

注:select * from one natural join two;

select * from one inner join two using(public_field);

两者是等效的。

17963c61c6f4db0c46403cd598219fe0.png

同理,下面也是等效的:

natural left join & left join

1ad83e9c891fe8bf9baf391916f371c1.png

natural right join & right join

34eea0442f72881c1dede0cc4aa59e83.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值