📅  最后修改于: 2020-11-29 09:01:08             🧑  作者: Mango
连接用于合并多个表中的记录。根据这些表中的公共列/值联接表。
有不同类型的联接可用。
内部联接合并来自多个表的记录,并返回两个表中都存在的值。
以下是INNER JOIN语句的语法。
SELECT col1, col2, col3….
FROM
Table-1
INNER JOIN
Table-2
ON (col1 = col2)
;
考虑以下雇员表和薪水表。
EmployeeNo | FirstName | LastName | JoinedDate | DepartmentNo | BirthDate |
---|---|---|---|---|---|
101 | Mike | James | 3/27/2005 | 1 | 1/5/1980 |
102 | Robert | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Peter | Paul | 3/21/2007 | 2 | 4/1/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 11/6/1984 |
105 | Robert | James | 1/4/2008 | 3 | 12/1/1984 |
EmployeeNo | Gross | Deduction | NetPay |
---|---|---|---|
101 | 40,000 | 4,000 | 36,000 |
102 | 80,000 | 6,000 | 74,000 |
103 | 90,000 | 7,000 | 83,000 |
104 | 75,000 | 5,000 | 70,000 |
以下查询在公用列EmployeeNo上联接Employee表和Salary表。每个表都分配有一个别名A和B,并使用正确的别名引用这些列。
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay
FROM
Employee A
INNER JOIN
Salary B
ON (A.EmployeeNo = B. EmployeeNo);
当执行以上查询时,它返回以下记录。员工105不包括在结果中,因为它在Salary表中没有匹配的记录。
*** Query completed. 4 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo NetPay
----------- ------------ -----------
101 1 36000
102 2 74000
103 2 83000
104 2 70000
LEFT OUTER JOIN和RIGHT OUTER JOIN还会合并来自多个表的结果。
LEFT OUTER JOIN返回左表中的所有记录,仅返回右表中的匹配记录。
RIGHT OUTER JOIN返回右表中的所有记录,仅返回左表中的匹配行。
FULL OUTER JOIN合并了LEFT OUTER和RIGHT OUTER JOIN的结果。它从联接的表中返回匹配的行和不匹配的行。
以下是OUTER JOIN语句的语法。您需要使用LEFT OUTER JOIN,RIGHT OUTER JOIN或FULL OUTER JOIN中的选项之一。
SELECT col1, col2, col3….
FROM
Table-1
LEFT OUTER JOIN/RIGHT OUTER JOIN/FULL OUTER JOIN
Table-2
ON (col1 = col2)
;
考虑下面的LEFT OUTER JOIN查询示例。它从Employee表返回所有记录,并从Salary表返回匹配记录。
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay
FROM
Employee A
LEFT OUTER JOIN
Salary B
ON (A.EmployeeNo = B. EmployeeNo)
ORDER BY A.EmployeeNo;
执行上述查询后,将产生以下输出。对于员工105,NetPay值为NULL,因为在Salary表中没有匹配的记录。
*** Query completed. 5 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo NetPay
----------- ------------ -----------
101 1 36000
102 2 74000
103 2 83000
104 2 70000
105 3 ?
交叉联接将左表中的每一行连接到右表中的每一行。
以下是CROSS JOIN语句的语法。
SELECT A.EmployeeNo, A.DepartmentNo, B.EmployeeNo,B.NetPay
FROM
Employee A
CROSS JOIN
Salary B
WHERE A.EmployeeNo = 101
ORDER BY B.EmployeeNo;
执行上述查询后,将产生以下输出。 Employee表中的EmployeeNo 101与Salary表中的每条记录连接在一起。
*** Query completed. 4 rows found. 4 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo EmployeeNo NetPay
----------- ------------ ----------- -----------
101 1 101 36000
101 1 104 70000
101 1 102 74000
101 1 103 83000