数据库内联、左联和外联的区别
在关系型数据库中,数据分布在许多相关的表中,所以有时候的查询会涉及到多表查询。
INNER JOIN(内联):两个表a,b 相连接,取出符合连接条件的字段
LEFT JOIN(左联):先返回左表的所有⾏,再加上符合连接条件的匹配⾏
RIGHT JOIN(右联):先返回右表的所有⾏,再加上符合连接条件的匹配⾏
⼀、内连接——最常⽤
定义:仅将两个表中满⾜连接条件的⾏组合起来作为结果集。
在内连接中,只有在两个表中匹配的⾏才能在结果集中出现
关键词:INNER JOIN
格式:SELECT 列名表 FROM 表名1 [INNER] JOIN 表名2 ON或WHERE 条件表达式
说明:
(1)列名表中的列名可以出⾃后⾯的两个表,但如果两个表中有同名列,应在列名前标明出处,格式为:表名.列名
(2)若连接的两个表名字太长,可以为它们起个别名。格式为:表名 AS 别名
(3)INNER是默认⽅式,可以省略
⼆、外连接
1、左(外)连接
定义:在内连接的基础上,还包含左表中所有不符合条件的数据⾏,并在其中的右表列填写NULL
关键字:LEFT JOIN
eg:select * from  user left outer join product on user.uid =product.pid
注意:
当在内连接查询中加⼊条件是,⽆论是将它加⼊到join⼦句,还是加⼊到where⼦句,其效果是完全⼀样的,但对于外连接情况就不同了。
当把条件加⼊到 join⼦句时,SQL Server、Informix会返回外连接表的全部⾏,然后使⽤指定的条件返回第⼆个表的⾏。
如果将条件放到where⼦句 中,SQL Server将会⾸先进⾏连接操作,然后使⽤where⼦句对连接后的⾏进⾏筛选。下⾯的两个查询展⽰了条件放置位⼦对执⾏结果的影响:
eg:
条件在join⼦句
select *from  t_institution i left outer join t_teller t on i.inst_no = t.inst_no and i.inst_no = “5801”
结果是:
inst_no    inst_name            inst_no    teller_no  teller_name
5801        天河区                5801        0001        tom
5801        天河区                5801        0002        david
5802        越秀区
5803        ⽩云区
条件在where⼦句
select * from  t_institution i left outer join t_teller t on i.inst_no = t.inst_no where i.inst_no = “5801”
结果是:
inst_no    inst_name            inst_no    teller_no  teller_name
5801          天河区                    5801          0001              tom
5801          天河区                    5801          0002              david
2、右(外)连接
定义:在内连接的基础上,还包含右表中所有不符合条件的数据⾏,并在其中的左表列填写NULL
定义:
关键字:RIGHT JOIN
关键字:
3、完全连接
定义:在内连接的基础上,还包含两个表中所有不符合条件的数据⾏,并在其中的左表、和右表列填写NULL
定义:
关键字:FULL JOIN
关键字:
三、交叉连接
定义:将两个表的所有⾏进⾏组合,连接后的⾏数为两个表的乘积数。(笛卡尔积)
定义:
关键词:CROSS JOIN
格式:
格式:FROM 表名1 CROSS JOIN 表名2
connect和join的区别⽤图说话:
1.内连接:利⽤内连接可获取两表的公共部分的记录,即图3的记录集C
语句如下:Select * from A JOIN B ON A.Aid=B.Bnameid
其实select * from A,B where A.Aid=B.Bnameid与Select * from A JOIN B ON A.Aid=B.Bnameid的运⾏结果是⼀样的。
2.外连接:外连接分为两种,⼀种是左连接(Left JOIN)和右连接(Right JOIN)
(1)左连接(Left JOIN):即图3公共部分记录集C+表A记录集A1。
语句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid
左连接数据
说明:
在语句中,A在B的左边,并且是Left Join,所以其运算⽅式为:A左连接B的记录=图3公共部分记录集C+表A记录集A1
由此得出图5中A左连接B的记录=图3公共部分记录集C+表A记录集A1,
(2)右连接(Right JOIN):即图3公共部分记录集C+表B记录集B1。
语句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid
在语句中,A在B的左边,并且是Right Join,所以其运算⽅式为:A右连接B的记录=图3公共部分记录集C+表B记录集B1
总结:
通过上⾯的运算解说,相信很多⼈已经想到,上⾯的情况(包括图3的关系图)说明的都只是A在B的左边的情况,
以下语句B在A的右边的⼜会出现什么情况呢??
select * from B Left JOIN A ON A.Aid=B.Bnameid
select * from B Right JOIN A ON A.Aid=B.Bnameid
其实对图3左右翻转⼀下就可以得出以下结论:
select * from B Left JOIN A ON A.Aid=B.Bnameid和select * from A Right JOIN B ON A.Aid=B.Bnameid所得出的记录集是⼀样的
select * from B Right JOIN A ON A.Aid=B.Bnameid和select * from A Left JOIN B ON A.Aid=B.Bnameid所得出的记录集也是⼀样的。
eg:
-------------------------------------------------
a表    id  name    b表    id  job  parent_id
1  张3                  1    23    1
2  李四                2    34    2
3  王武                3    3
4    4
a.id同parent_id  存在关系
1)内连接
select  a.*,b.*  from  a  inner  join  b    on  a.id=b.parent_id      结果是
1  张3                  1    23    1
2  李四                  2    34    2
2)左连接
select  a.*,b.*  from  a  left  join  b    on  a.id=b.parent_id      结果是
1  张3                  1    23    1
2  李四                  2    34    2
3  王武                  null
3)右连接
select  a.*,b.*  from  a  right  join  b    on  a.id=b.parent_id      结果是
1  张3                  1    23    1
2  李四                  2    34    2
null                      3    34    4
4)完全连接
select  a.*,b.*  from  a  full  join  b    on  a.id=b.parent_id
结果是
1  张3                  1    23    1
2  李四                2    34    2
null                  3    34    4
3  王武                null

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。