利用MSSQL跨表联查数据

介绍

在MSSQL中跨表联查数据是常见的需求。联结是MSSQL特有的一个功能,主要指的是从两个或多个表中提取数据列的过程。使用联结查询,您可以将数据从一个表中与另一个表中的数据组合在一起。这篇文章将介绍在MSSQL中如何跨表联查数据。

准备

在开始说明如何使用跨表联接之前,我们需要先相应的准备工作。以下是我们所需的准备工作:

本文将使用两个表来说明如何进行跨表联接。我们将使用以下两个表:

```

CREATE TABLE Customers (

CustomerID int PRIMARY KEY,

CustomerName varchar(255),

ContactName varchar(255),

Country varchar(255)

);

CREATE TABLE Orders (

OrderID int PRIMARY KEY,

CustomerID int,

OrderDate varchar(255),

TotalAmount decimal(15,2)

);

```

数据

在我们开始进行跨表联接之前,我们需要先向每个表中插入一些数据:

```

INSERT INTO Customers (CustomerID, CustomerName, ContactName, Country)

VALUES (1, 'Alfreds Futterkiste', 'Maria Anders', 'Germany');

INSERT INTO Customers (CustomerID, CustomerName, ContactName, Country)

VALUES (2, 'Berglunds snabbk?p', 'Christina Berglund', 'Sweden');

INSERT INTO Customers (CustomerID, CustomerName, ContactName, Country)

VALUES (3, 'Centro comercial Moctezuma', 'Francisco Chang', 'Mexico');

INSERT INTO Orders (OrderID, CustomerID, OrderDate, TotalAmount)

VALUES (1, 1, '2019-01-01', 100.00);

INSERT INTO Orders (OrderID, CustomerID, OrderDate, TotalAmount)

VALUES (2, 1, '2019-01-05', 200.00);

INSERT INTO Orders (OrderID, CustomerID, OrderDate, TotalAmount)

VALUES (3, 2, '2019-02-01', 150.00);

INSERT INTO Orders (OrderID, CustomerID, OrderDate, TotalAmount)

VALUES (4, 3, '2019-03-01', 75.00);

```

以上代码将在Customers表中创建三个客户记录,并在Orders表中创建四个订单记录。

使用联结查询来跨表联接数据

联结查询是在MSSQL中进行跨表联接的主要方式。MSSQL的联结查询使用JOIN子句来实现,JOIN子句用于将来自不同表的行组合在一起,以便于进行查询操作。JOIN子句有多种类型,每种类型都能够实现不同的联结方式。

下面是主要的JOIN类型:

- INNER JOIN

- OUTER JOIN

- LEFT JOIN

- RIGHT JOIN

- FULL JOIN

以下是JOIN子句的语法:

```

SELECT column_name(s)

FROM table1

JOIN table2

ON table1.column = table2.column;

```

在上述语法中,JOIN子句将从两个表中选择指定列的数据。这是根据相同数据类型的列执行的。ON子句用于指定要连接的列(通常是相同的列名或数据类型相同的列)。

INNER JOIN

这是最常见的联结类型之一。INNER JOIN 结合了来自两个表中匹配的行。在INNER JOIN中,只有当行在两个表中满足JOIN条件时,才会返回这些行。

以下是在MSSQL中使用INNER JOIN进行联结查询的语法:

```

SELECT Customers.CustomerName, Orders.OrderDate

FROM Customers

INNER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;

```

在上述的语法中,我们选择Customers表中的CustomerName列和Orders表中的OrderDate列。我们使用INNER JOIN关键字来联结这两个表。

在INNER JOIN子句中,我们指定要连接的列。在本例中,我们使用CustomerID列来连接两个表。最后,我们返回匹配条件的所有行。

以下是INNER JOIN查询结果:

```

|CustomerName |OrderDate |

|-----------------------|-----------|

|Alfreds Futterkiste |2019-01-01 |

|Alfreds Futterkiste |2019-01-05 |

|Berglunds snabbk?p |2019-02-01 |

|Centro comercial Moctezuma|2019-03-01|

```

在上面的结果中,我们可以看到INNER JOIN联结了两个表中所有匹配的记录。

LEFT JOIN

LEFT JOIN可用于联结两个表,并从左边的表(即第一个表)中返回所有行,即使右边的表中没有与之匹配的数据也是如此。

以下是在MSSQL中使用LEFT JOIN联结查询的语法:

```

SELECT Customers.CustomerName, Orders.OrderDate

FROM Customers

LEFT JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;

```

在上述语法中,我们使用LEFT JOIN关键字来联结两个表。然后指定要左侧表和右侧表上要联结的列。在执行联结操作时,LEFT JOIN会返回左侧表中所有的行,即使在右侧表中没有匹配到的数据。

以下是LEFT JOIN查询结果:

```

|CustomerName |OrderDate |

|-----------------------|-----------|

|Alfreds Futterkiste |2019-01-01 |

|Alfreds Futterkiste |2019-01-05 |

|Berglunds snabbk?p |2019-02-01 |

|Centro comercial Moctezuma|2019-03-01|

```

在上面的结果中,我们可以看到LEFT JOIN联结了两个表中的所有记录,即使没有在右边表中找到匹配的值。

RIGHT JOIN

与LEFT JOIN相反,RIGHT JOIN可用于联结两个表,并从右边的表(即第二个表)中返回所有行,即使左边的表中没有与之匹配的数据也是如此。

以下是在MSSQL中使用RIGHT JOIN联结查询的语法:

```

SELECT Customers.CustomerName, Orders.OrderDate

FROM Customers

RIGHT JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;

```

在上述语法中,我们使用RIGHT JOIN关键字来联结两个表。然后指定要右侧表和左侧表上要联结的列。在执行联结操作时,RIGHT JOIN会返回右侧表中所有的行,即使在左侧表中没有匹配到的数据。

以下是RIGHT JOIN查询结果:

```

|CustomerName |OrderDate |

|-----------------------|-----------|

|Alfreds Futterkiste |2019-01-01 |

|Alfreds Futterkiste |2019-01-05 |

|Berglunds snabbk?p |2019-02-01 |

|NULL |2019-03-01|

```

在上面的结果中,我们可以看到RIGHT JOIN联结了两个表中的所有记录,即使没有在左边表中找到匹配的值也是如此。此时,如果没有找到匹配项,将会在CustomerName列中填充NULL值。

OUTER JOIN

OUTER JOIN包括LEFT JOIN和RIGHT JOIN两个联结方式。它用于联结两个表,并从两个表中返回所有的行,即使没有匹配的行也是如此。

以下是在MSSQL中使用OUTER JOIN联结查询的语法:

```

SELECT Customers.CustomerName, Orders.OrderDate

FROM Customers

FULL OUTER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;

```

在上述语法中,我们使用FULL OUTER JOIN关键字来联结两个表。在执行联结操作时,FULL OUTER JOIN会返回左右两个表中所有的行,即使没有匹配的行也是如此。

以下是OUTER JOIN查询结果:

```

|CustomerName |OrderDate |

|-----------------------|-----------|

|Alfreds Futterkiste |2019-01-01 |

|Alfreds Futterkiste |2019-01-05 |

|Berglunds snabbk?p |2019-02-01 |

|NULL |2019-03-01|

```

在上面的结果中,我们可以看到OUTER JOIN联结了两个表中的所有记录,即使没有在两个表中都找到匹配的值也是如此。在此情况下,CustomerName中的NULL值表示没有从顾客表中找到需要匹配的行。

总结

在MSSQL中,可以使用不同的联结类型来跨表联接数据。内联接是最常用的连接类型,而外连接通常用于返回左表/右表/两个表中的所有数据,即使它们没有相应的匹配项。

使用联结查询来跨表联接数据是非常常见的需求,尤其是在分析大量数据的时候。我相信,通过阅读本文,您现在对如何在MSSQL中进行跨表联结查询有了更深入的了解。

数据库标签