Teradata - 连接
连接用于合并来自多个表的记录。表根据这些表中的公共列/值进行连接。
有不同类型的连接可用。
- 内连接
- 左外连接
- 右外连接
- 全外连接
- 自连接
- 交叉连接
- 笛卡尔生产连接
内连接
内连接合并来自多个表的记录并返回两个表中都存在的值。
语法
以下是 INNER JOIN 语句的语法。
SELECT col1, col2, col3…. FROM Table-1 INNER JOIN Table-2 ON (col1 = col2) <WHERE condition>;
示例
考虑以下员工表和工资表。
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 |
以下查询将 Employee 表和 Salary 表连接到公共列 EmployeeNo。每个表都分配有别名 A 和 B,并且列使用正确的别名引用。
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay FROM Employee A INNER JOIN Salary B ON (A.EmployeeNo = B. EmployeeNo);
执行上述查询时,将返回以下记录。由于 Employee 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
OUTER JOIN
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) <WHERE 条件>;
示例
请考虑以下 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
Cross Join 将左表中的每一行与右表中的每一行连接起来。
语法
以下是 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;
执行上述查询时,会产生以下输出。员工表中的 EmployeeNo 101 与薪资表中的每一条记录相连。
*** 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