行业知识
深入理解 SQL UNION 运算符及其应用场景
SQL UNION运算符
SQL UNION运算符用于组合两个或多个SELECT语句的结果集。
- 每个UNION中的SELECT语句必须具有相同数量的列。
- 列的数据类型也必须相似。
- 每个SELECT语句中的列也必须按照相同的顺序排列。
UNION语法
SELECT column_name(s) FROM table1UNIONSELECT column_name(s) FROM table2;
UNION ALL语法UNION运算符默认仅选择不同的值。为了允许重复的值,请使用UNION ALL:
SELECT column_name(s) FROM table1UNION ALLSELECT column_name(s) FROM table2;
注意:结果集中的列名通常等于第一个*SELECT*语句中的列名。
演示数据库
在本教程中,我们将使用著名的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 Suppliers表部分选择:
SupplierID SupplierName ContactName Address City PostalCode Country 1 Exotic Liquid Charlotte Cooper 49 Gilbert St. London EC1 4SD UK 2 New Orleans Cajun Delights Shelley Burke P.O. Box 78934 New Orleans 70117 USA 3 Grandma Kelly’s Homestead Regina Murphy 707 Oxford Rd. Ann Arbor 48104 USA SQL UNION示例
以下SQL语句从“Customers”和“Suppliers”表中返回城市(仅不同的值):
SELECT City FROM CustomersUNIONSELECT City FROM SuppliersORDER BY City;
注意:如果一些客户或供应商具有相同的城市,每个城市将只列出一次,因为*UNION仅选择不同的值。使用UNION ALL*也选择重复的值!
SQL UNION ALL示例
以下SQL语句从“Customers”和“Suppliers”表中返回城市(还包括重复的值):
SELECT City FROM CustomersUNION ALLSELECT City FROM SuppliersORDER BY City;
带有WHERE的SQL UNION
以下SQL语句从“Customers”和“Suppliers”表中返回德国的城市(仅不同的值):
SELECT City, Country FROM CustomersWHERE Country='Germany'UNIONSELECT City, Country FROM SuppliersWHERE Country='Germany'ORDER BY City;
带有WHERE的SQL UNION ALL
以下SQL语句从“Customers”和“Suppliers”表中返回德国的城市(还包括重复的值):
SELECT City, Country FROM CustomersWHERE Country='Germany'UNION ALLSELECT City, Country FROM SuppliersWHERE Country='Germany'ORDER BY City;
另一个UNION示例
以下SQL语句列出了所有客户和供应商:
SELECT 'Customer' AS Type, ContactName, City, CountryFROM CustomersUNIONSELECT 'Supplier', ContactName, City, CountryFROM Suppliers;
请注意上面的AS Type - 它是一个别名。SQL别名用于给表或列一个临时的名称。别名仅在查询的持续时间内存在。因此,这里我们创建了一个名为“Type”的临时列,其中列出了联系人是“Customer”还是“Supplier”。
SQL GROUP BY语句
GROUP BY语句将具有相同值的行分组为摘要行,通常与聚合函数一起使用,以根据一个或多个列对结果集进行分组。
GROUP BY语法
SELECT column_name(s)FROM table_nameWHERE conditionGROUP BY column_name(s)ORDER BY column_name(s);
演示数据库
以下是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 4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK 5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden SQL GROUP BY示例
以下SQL语句列出了每个国家的客户数量:
SELECT COUNT(CustomerID), CountryFROM CustomersGROUP BY Country;
以下SQL语句列出了每个国家的客户数量,按高到低排序:
SELECT COUNT(CustomerID), CountryFROM CustomersGROUP BY CountryORDER BY COUNT(CustomerID) DESC;
演示数据库
以下是Northwind示例数据库中“Orders”表的一部分选择:
OrderID CustomerID EmployeeID OrderDate ShipperID 10248 90 5 1996-07-04 3 10249 81 6 1996-07-05 1 10250 34 4 1996-07-08 2 以及“Shippers”表的一部分选择:
ShipperID ShipperName 1 Speedy Express 2 United Package 3 Federal Shipping 带有JOIN的GROUP BY示例
以下SQL语句列出了每个承运人发送的订单数量:
SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM OrdersLEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperIDGROUP BY ShipperName;
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎 点赞、收藏、关注