oracle表连接——处理连接过程中另外⼀张表没有相关数据不显
⽰问题
⼀个数据表基本上很难满⾜我们的查询要求,同时,将所有的数据都保存在⼀个表格中显然也不是⼀种好的数据库设计,为了避免数据的冗余,删除、更新异常,我们通常需要建⽴⼀张外键表,通过表连接,来获取我们⾃⼰想要得到的数据,所以在数据查中,表连接是⼀个经常使⽤到的操作,下⾯我们来看看两个或者⼏个表有哪些⽅式是可以连接的。
经常遇到的问题:我们或许在表连接的过程中⽤于连接的另外⼀张表数据为空,导致某些数据得不到。我们要怎么解决呢
我们就先从介绍表连接的⽅式开始,在介绍的过程中,就会得到解决。
假如我们有下⾯两张数据表:
请看 "Persons" 表:
Id_P LastName FirstName Address City
1Adams John Oxford Street London
2Bush George Fifth Avenue New York
3Carter Thomas Changan Street Beijing
请注意,"Id_P" 列是 Persons 表中的的主键。这意味着没有两⾏能够拥有相同的 Id_P。即使两个⼈的姓名完全相同,Id_P 也可以区分他们。
接下来请看 "Orders" 表:
Id_O OrderNo Id_P
1778953
2446783
3224561
4245621
53476465
请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列⽤于引⽤ "Persons" 表中的⼈,⽽⽆需使⽤他们的确切姓名。
请留意,"Id_P" 列把上⾯的两个表联系了起来。
⽅式1:根据两个或多个表中的列之间的关系
我们可以通过引⽤两个表的⽅式,从两个表中获取数据:
谁订购了产品,并且他们订购了什么产品?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
结果集:
LastName FirstName OrderNo
Adams John22456
Adams John24562
Carter Thomas77895
Carter Thomas44678
这个⽅式看起来很直观,也是我们经常⽐较常⽤的,但没办法解决上⾯的问题,但是我们可以使⽤下⾯的join⽅式解决。
⽅式2:join
不同的 SQL JOIN
除了我们在上⾯的例⼦中使⽤的 INNER JOIN(内连接),我们还可以使⽤其他⼏种连接。
下⾯列出了您可以使⽤的 JOIN 类型,以及它们之间的差异。
JOIN: 如果表中有⾄少⼀个匹配,则返回⾏
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的⾏
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的⾏
FULL JOIN: 只要其中⼀个表中存在匹配,就返回⾏
1)、SQL INNER JOIN 关键字
在表中存在⾄少⼀个匹配时,INNER JOIN 关键字返回⾏。
INNER JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON lumn_name=lumn_name
注释:INNER JOIN 与 JOIN 是相同的。
内连接(INNER JOIN)实例
现在,我们希望列出所有⼈的定购。
您可以使⽤下⾯的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastName FirstName OrderNo
Adams John22456
Adams John24562
Carter Thomas77895
Carter Thomas44678
INNER JOIN 关键字在表中存在⾄少⼀个匹配时返回⾏。如果 "Persons" 中的⾏在 "Orders" 中没有匹配,就不会列出这些⾏。
2)、SQL LEFT JOIN 关键字
oracle数据库怎么查询表 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。
左连接(LEFT JOIN)实例
现在,我们希望列出所有的⼈,以及他们的定购 - 如果有的话。
您可以使⽤下⾯的 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) 中没有匹配的⾏。
3)、SQL RIGHT JOIN 关键字
RIGHT JOIN 关键字会右表 (table_name2) 那⾥返回所有的⾏,即使在左表 (table_name1) 中没有匹配的⾏。RIGHT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON lumn_name=lumn_name
注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。
右连接(RIGHT JOIN)实例
现在,我们希望列出所有的定单,以及定购它们的⼈ - 如果有的话。
您可以使⽤下⾯的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastName FirstName OrderNo
Adams John22456
Adams John24562
Carter Thomas77895
Carter Thomas44678
34764
RIGHT JOIN 关键字会从右表 (Orders) 那⾥返回所有的⾏,即使在左表 (Persons) 中没有匹配的⾏。
4)、SQL FULL JOIN 关键字
只要其中某个表存在匹配,FULL JOIN 关键字就会返回⾏。
FULL JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON lumn_name=lumn_name
注释:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。
全连接(FULL JOIN)实例
现在,我们希望列出所有的⼈,以及他们的定单,以及所有的定单,以及定购它们的⼈。
您可以使⽤下⾯的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL 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
34764
FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那⾥返回所有的⾏。如果 "Persons" 中的⾏在表 "Orders" 中没有匹配,或者如果"Orders" 中的⾏在表 "Persons" 中没有匹配,这些⾏同样会列出。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论