sql left join 多表连接SQL中的leftouterjoin,innerjoin,rightouterjoin⽤法详解1
LEFT JOIN 关键字会从左表 (table_name1) 那⾥返回所有的⾏,即使在右表 (table_name2) 中没有匹配的⾏。
LEFT JOIN 关键字语法
SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON lumn_name=lumn_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。
原始的表
"Persons" 表:
Id_P LastName FirstName Address City
1Adams John Oxford Street London
2Bush George Fifth Avenue New York
3Carter Thomas Changan Street Beijing
"Orders" 表:
Id_O OrderNo Id_P
1778953
2446783
3224561
4245621
53476465
现在,我们希望列出所有的⼈,以及他们的定购 - 如果有的话。
您可以使⽤下⾯的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.id_P=Orders.id_P ORDER BY Persons.LastName :
LastName FirstName OrderNo
Adams John22456
Adams John24562
Carter Thomas77895
Carter Thomas44678
Bush George
LEFT JOIN 关键字会从左表 (Persons) 那⾥返回所有的⾏,即使在右表 (Orders) 中没有匹配的⾏。
这两天,在研究SQL语法中的inner join多表查询语法的⽤法,通过学习,发现⼀个SQL命令,竟然涉及到很多线性代数⽅⾯的知识,现将这些知识系统地记录如下:
使⽤关系代数合并数据
1 关系代数
合并数据集合的理论基础是关系代数,它是由E.F.Codd于1970年提出的。
在关系代数的形式化语⾔中:
?          ⽤表、或者数据集合表⽰关系或者实体。
?          ⽤⾏表⽰元组。
?          ⽤列表⽰属性。
关系代数包含以下8个关系运算符
?          选取――返回满⾜指定条件的⾏。
?          投影――从数据集合中返回指定的列。
?          笛卡尔积――是关系的乘法,它将分别来⾃两个数据集合中的⾏以所有可能的⽅式进⾏组合。
?          并――关系的加法和减法,它可以在⾏的⽅向上合并两个表中的数据,就像把⼀个表垒在另⼀个表之上⼀样。
?          交――返回两个数据集合所共有的⾏。
?          差――返回只属于⼀个数据集合的⾏。
?          连接――在⽔平⽅向上合并两个表,其⽅法是:将两个表中在共同数据项上相互匹配的那些⾏合并起来。
?          除――返回两个数据集之间的精确匹配。
此外,作为⼀种实现现代关系代数运算的⽅法,SQL还提供了:
?          ⼦查询――类似于连接,但更灵活;在外部查询中,⽅式可以使⽤表达式、列表或者数据集合的地⽅都可以使⽤⼦查询的结果。
本章将主要讲述多种类型的连接、简单的和相关的⼦查询、⼏种类型的并、关系除以及其他的内容。
2 使⽤连接
2.1 连接类型
在关系代数中,连接运算是由⼀个笛卡尔积运算和⼀个选取运算构成的。⾸先⽤笛卡尔积完成对两个数据集合的乘运算,然后对⽣成的结果集合进⾏选取运算,确保只把分别来⾃两个数据集合并且具有重叠部分的⾏合并在⼀起。连接的全部意义在于在⽔平⽅向上合并两个数据集合(通常是表),并产⽣⼀个新的结果集合,其⽅法是将⼀个数据源中的⾏于另⼀个数据源中和它匹配的⾏组合成⼀个新元组。
SQL提供了多种类型的连接⽅式,它们之间的区别在于:从相互交叠的不同数据集合中选择⽤于连接的⾏时所采⽤的⽅法不同。
连接类型定义
内连接只连接匹配的⾏
左外连接包含左边表的全部⾏(不管右边的表中是否存在与它们匹配的⾏),以及右边表中全部匹配的⾏
右外连接包含右边表的全部⾏(不管左边的表中是否存在与它们匹配的⾏),以及左边表中全部匹配的⾏
全外连接包含左、右两个表的全部⾏,不管另外⼀边的表中是否存在与它们匹配的⾏。
(H)(theta)连接使⽤等值以外的条件来匹配左、右两个表中的⾏
交叉连接⽣成笛卡尔积-它不使⽤任何匹配或者选取条件,⽽是直接将⼀个数据源中的每个⾏与另⼀个数据源的每个⾏都⼀⼀匹配
在INFORMIX中连接表的查询
如果FROM⼦句指定了多于⼀个表引⽤,则查询会连接来⾃多个表的⾏。连接条件指定各列之间(每个表⾄少⼀列)进⾏连接的关系。因为正在⽐较连接条件中的列,所以它们必须具有⼀致的数据类型。
SELECT语句的FROM⼦句可以指定以下⼏种类型的连接
FROM⼦句关键字相应的结果集
CROSS JOIN          笛卡尔乘积(所有可能的⾏对)
INNER JOIN          仅对满⾜连接条件的CROSS中的列
LEFT OUTER JOIN          ⼀个表满⾜条件的⾏,和另⼀个表的所有⾏
RIGHT OUTER JOIN          与LEFT相同,但两个表的⾓⾊互换
FULL OUTER JOIN        LEFT OUTER 和 RIGHT OUTER中所有⾏的超集
2.2 内连接(Inner Join)
内连接是最常见的⼀种连接,它页被称为普通连接,⽽E.FCodd最早称之为⾃然连接。
下⾯是ANSI SQL-92标准
select *
from    t_institution i
inner join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = "5801"
其中inner可以省略。
等价于早期的连接语法
select *
from t_institution i, t_teller t
where i.inst_no = t.inst_no
and i.inst_no = "5801"
2.3 外连接
2.3.1          左外连接(Left Outer Jion)
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
其中outer可以省略。
2.3.2          右外连接(Rigt Outer Jion)
select *
from    t_institution i
right outer join t_teller t
on i.inst_no = t.inst_no
2.3.3          全外连接(Full Outer)
全外连接返回参与连接的两个数据集合中的全部数据,⽆论它们是否具有与之相匹配的⾏。在功能上,它等价于对这两个数据集合分别进⾏左外连接和右外连接,然后再使⽤消去重复⾏的并操作将上述两个结果集合并为⼀个结果集。
在现实⽣活中,参照完整性约束可以减少对于全外连接的使⽤,⼀般情况下左外连接就⾜够了。在数据库中没有利⽤清晰、规范的约束来防范错误数据情况下,全外连接就变得⾮常有⽤了,你可以使⽤它来清理数据库中的数据。
select *
from    t_institution i
full outer join t_teller t
on i.inst_no = t.inst_no
2.3.4          外连接与条件配合使⽤
当在内连接查询中加⼊条件是,⽆论是将它加⼊到join⼦句,还是加⼊到where⼦句,其效果是完全⼀样的,但对于外连接情况就不同了。当把条件加⼊到join⼦句时,SQL Server、Informix会返回外连接表的全部⾏,然后使⽤指定的条件返回第⼆个表的⾏。如果将条件放到where⼦句中,SQL Server将会⾸先进⾏连接操作,然后使⽤where⼦句对连接后的⾏进⾏筛选。下⾯的两个查询展⽰了条件放置位⼦对执⾏结果的影响:
条件在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.4 ⾃⾝连接
⾃⾝连接是指同⼀个表⾃⼰与⾃⼰进⾏连接。这种⼀元连接通常⽤于从⾃反关系(也称作递归关系)中抽取数据。例如⼈⼒资源数据库中雇员与⽼板的关系。
下⾯例⼦是在机构表中查本机构和上级机构的信息。
select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
from t_institution i
join t_institution s
on i.superior_inst = s.inst_no
结果是:
superior_inst sup_inst_name          inst_no      inst_name
800            ⼴州市                5801        天河区
800            ⼴州市                5802        越秀区
800            ⼴州市                5803        ⽩云区
2.5 交叉(⽆限制) 连接
交叉连接⽤于对两个源表进⾏纯关系代数的乘运算。它不使⽤连接条件来限制结果集合,⽽是将分别来⾃两个数据源中的⾏以所有可能的⽅式进⾏组合。数据集合中⼀的每个⾏都要与数据集合⼆中的每⼀个⾏分别组成⼀个新的⾏。例如,如果第⼀个数据源中有5个⾏,⽽第⼆个数据源中有4个⾏,那么在它们之间进⾏交叉连接就会产⽣20个⾏。⼈们将这种类型的结果集称为笛卡尔乘积。
⼤多数交叉连接都是由于错误操作⽽造成的;但是它们却⾮常适合向数据库中填充例⼦数据,或者预先创建⼀些空⾏以便为程序执⾏期间所要填充的数据保留空间。
select *
from    t_institution i
cross join t_teller t
在交叉连接中没有on条件⼦句
通过以上知识,还真是系统地学习了⼀番,发现inner join其实可以通过最初的多表查询⽅式来实现,例如:
select * from    t_institution i ,t_teller t where i.inst_no = t.inst_no and i.inst_no = "5801"
其实,inner join就是对多表查询的⼀种解决⽅案⽽已。⽽外连接,还是有其特定的⽤处的,实际上就相当于⼀个开区间,⽽内连接就是⼀个闭区间。

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