SQL RIGHT JOIN关键字
SQL RIGHT JOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。
RIGHT JOIN语法
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
注意:在某些数据库中,RIGHT JOIN被称为RIGHT OUTER JOIN。
SQL RIGHT JOIN
演示数据库
在本教程中,我们将使用著名的Northwind示例数据库。
以下是"Orders"表的部分选择:
|OrderID|CustomerID|EmployeeID|OrderDate|ShipperID| |-|-|-|-|-| |10308|2|7|1996-09-18|3| |10309|37|3|1996-09-19|1| |10310|77|8|1996-09-20|2|
以及"Employees"表的部分选择:
|EmployeeID|LastName|FirstName|BirthDate|Photo| |-|-|-|-|-| |1|Davolio|Nancy|12/8/1968|EmpID1.pic| |2|Fuller|Andrew|2/19/1952|EmpID2.pic| |3|Leverling|Janet|8/30/1963|EmpID3.pic|
示例
假设我们想要检索所有订单以及与之关联的员工信息(如果有的话)。我们可以使用RIGHT JOIN将两个表连接在一起,以便即使某些订单没有关联的员工信息,它们仍然会在结果中显示。
SELECT Orders.OrderID, Orders.OrderDate, Employees.EmployeeID, Employees.FirstName, Employees.LastName
FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID;
在这个例子中,RIGHT JOIN确保了所有的员工信息都会出现在结果中,而与之关联的订单信息(如果存在的话)也会被检索出来。如果某个员工没有订单,相应的OrderID和OrderDate列将显示为NULL。
SQL FULL OUTER JOIN关键字
SQL FULL OUTER JOIN关键字在左表(table1)或右表(table2)记录中有匹配时返回所有记录。
FULL OUTER JOIN语法
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;
注意:FULL OUTER JOIN和FULL JOIN是相同的。FULL OUTER JOIN可能返回非常大的结果集!
SQL FULL OUTER JOIN
演示数据库
在本教程中,我们将使用著名的Northwind示例数据库。
以下是"Customers"表的部分选择:
|CustomerID|CustomerName|ContactName|Address|City|PostalCode|Country| |-|-|-|-|-|-|-| |1|Alfreds Futterkiste|Maria Anders|Obere Str. 57|Berlin|12209|Germany| |2|Ana Trujillo Emparedados y helados|Ana Trujillo|Avda. de la Constitución 2222|México D.F.|05021|Mexico| |3|Antonio Moreno Taquería|Antonio Moreno|Mataderos 2312|México D.F.|05023|Mexico|
以及"Orders"表的部分选择:
|OrderID|CustomerID|EmployeeID|OrderDate|ShipperID| |-|-|-|-|-| |10308|2|7|1996-09-18|3| |10309|37|3|1996-09-19|1| |10310|77|8|1996-09-20|2|
SQL FULL OUTER JOIN示例
以下SQL语句选择所有客户和所有订单:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;
结果集的一部分可能如下所示:
|CustomerName|OrderID| |-|-| |Null|10309| |Null|10310| |Alfreds Futterkiste|Null| |Ana Trujillo Emparedados y helados|10308| |Antonio Moreno Taquería|Null|
注意:FULL OUTER JOIN关键字返回两个表中所有匹配的记录,无论另一表是否匹配。因此,如果"Customers"中有没有在"Orders"中有匹配的行,或者如果"Orders"中有没有在"Customers"中有匹配的行,这些行也会被列出。
SQL Self Join
SQL自连接是一个普通的连接,但是表与自身连接。
自连接语法
SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;
T1和T2是同一表的不同表别名。
演示数据库
在本教程中,我们将使用著名的Northwind示例数据库。
以下是"Customers"表的部分选择:
|CustomerID|CustomerName|ContactName|Address|City|PostalCode|Country| |-|-|-|-|-|-|-| |1|Alfreds Futterkiste|Maria Anders|Obere Str. 57|Berlin|12209|Germany| |2|Ana Trujillo Emparedados y helados|Ana Trujillo|Avda. de la Constitución 2222|México D.F.|05021|Mexico| |3|Antonio Moreno Taquería|Antonio Moreno|Mataderos 2312|México D.F.|05023|Mexico|
SQL Self Join示例
以下SQL语句选择两个不同客户之间的订单:
SELECT DISTINCT A.CustomerName AS Customer1, B.CustomerName AS Customer2, A.OrderID
FROM Orders A, Orders B
WHERE A.CustomerID < B.CustomerID AND A.OrderID = B.OrderID
ORDER BY A.OrderID;
在这个例子中,我们使用了两个别名,A和B,来表示同一张"Orders"表的不同实例。通过比较CustomerID和OrderID,我们选择了两个不同客户之间的订单,并使用DISTINCT确保结果中没有重复的行。