-
连接查询概述
- 连接查询是SQL Server中用于组合来自两个或多个表的数据的操作。它基于表之间的关联条件,将相关的行组合在一起,使得我们可以从多个相关的表中获取信息,就好像这些表是一个大表一样。这种操作在关系型数据库中非常重要,因为数据库通常是按照规范化的原则设计的,数据被分散存储在多个表中。
-
内连接(INNER JOIN)
- 概念:内连接返回两个表中满足连接条件的行的组合。它只返回在连接条件上匹配的行,就好像在两个集合中取交集一样。例如,有一个“学生表”(包含学生ID、姓名等信息)和一个“成绩表”(包含学生ID、课程成绩等信息),内连接可以返回有成绩记录的学生的信息。
- 语法:
SELECT columns FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
- 例如,假设有“Customers”表(包含“CustomerID”、“CustomerName”等列)和“Orders”表(包含“OrderID”、“CustomerID”等列),要获取有订单的客户信息,可以使用以下查询:
SELECT Customers.CustomerName, Orders.OrderID FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
- 使用场景:当你只想获取两个表中相互关联的数据,即那些在连接条件上匹配的行时,使用内连接。比如,查询员工和他们所属部门的信息,只返回有部门分配的员工信息。
-
左连接(LEFT JOIN)
- 概念:左连接返回左表(在
LEFT JOIN
关键字左边的表)中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则对应的列将填充为NULL。例如,有一个“产品表”和一个“销售记录表”,左连接可以返回所有产品的信息以及对应的销售记录(如果有),没有销售记录的产品在销售记录相关列显示为NULL。 - 语法:
SELECT columns FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
- 例如,假设有“Products”表(包含“ProductID”、“ProductName”等列)和“Sales”表(包含“SaleID”、“ProductID”等列),要获取所有产品及其销售情况(如果有),可以使用以下查询:
SELECT Products.ProductName, Sales.SaleID FROM Products LEFT JOIN Sales ON Products.ProductID = Sales.ProductID;
- 使用场景:当你想要获取左表的所有记录,并且查看这些记录在右表中的关联情况(如果有)时,使用左连接。比如,查询所有部门及其员工信息,即使某个部门没有员工,也要显示该部门的信息。
- 概念:左连接返回左表(在
-
右连接(RIGHT JOIN)
- 概念:右连接与左连接相反,它返回右表中的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则对应的列将填充为NULL。例如,有一个“供应商表”和一个“采购订单表”,右连接可以返回所有采购订单及其对应的供应商信息(如果有),没有供应商的采购订单在供应商相关列显示为NULL。
- 语法:
SELECT columns FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
- 例如,假设有“Suppliers”表(包含“SupplierID”、“SupplierName”等列)和“PurchaseOrders”表(包含“OrderID”、“SupplierID”等列),要获取所有采购订单及其供应商信息(如果有),可以使用以下查询:
SELECT PurchaseOrders.OrderID, Suppliers.SupplierName FROM table1 RIGHT JOIN Suppliers ON PurchaseOrders.SupplierID = Suppliers.SupplierID;
- 使用场景:当重点关注右表的所有记录,并且查看这些记录在左表中的关联情况(如果有)时,使用右连接。不过在实际应用中,左连接的使用更为常见,因为右连接的功能可以通过交换表的位置并使用左连接来实现。
-
全外连接(FULL OUTER JOIN)
- 概念:全外连接返回左表和右表中的所有行。如果左表中的行在右表中没有匹配的行,则右表对应的列填充为NULL;反之,如果右表中的行在左表中没有匹配的行,则左表对应的列填充为NULL。例如,有一个“员工表”和一个“培训课程表”,全外连接可以返回所有员工和所有培训课程的信息,以及员工与培训课程的关联情况,没有关联的部分对应的列显示为NULL。
- 语法:
SELECT columns FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
- 例如,假设有“Employees”表(包含“EmployeeID”、“EmployeeName”等列)和“TrainingCourses”表(包含“CourseID”、“CourseName”等列),要获取所有员工和所有培训课程的关联信息,可以使用以下查询:
SELECT Employees.EmployeeName, TrainingCourses.CourseName FROM Employees FULL OUTER JOIN TrainingCourses ON Employees.EmployeeID = TrainingCourses.EmployeeID;
- 使用场景:当需要获取两个表中的所有数据,不管它们是否相互匹配时,使用全外连接。这种情况比较少见,因为它可能会返回大量包含NULL值的数据,但在某些特定的数据分析场景下,如对比两个表的全部内容差异时会很有用。
03-07
997

05-26
3429
