深入理解 SQL UNION 运算符及其应用场景
SQL UNION运算符
SQL UNION运算符用于组合两个或多个SELECT语句的结果集。
- 每个
UNION中的SELECT语句必须具有相同数量的列。 - 列的数据类型也必须相似。
- 每个
SELECT语句中的列也必须按照相同的顺序排列。
UNION语法
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
UNION ALL语法
UNION运算符默认仅选择不同的值。为了允许重复的值,请使用UNION ALL:
SELECT column_name(s) FROM table1
UNION ALL
SELECT 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 Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;
注意:如果一些客户或供应商具有相同的城市,每个城市将只列出一次,因为UNION仅选择不同的值。使用UNION ALL也选择重复的值!
SQL UNION ALL示例
以下SQL语句从“Customers”和“Suppliers”表中返回城市(还包括重复的值):
SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;
带有WHERE的SQL UNION
以下SQL语句从“Customers”和“Suppliers”表中返回德国的城市(仅不同的值):
SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;
带有WHERE的SQL UNION ALL
以下SQL语句从“Customers”和“Suppliers”表中返回德国的城市(还包括重复的值):
SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;
另一个UNION示例
以下SQL语句列出了所有客户和供应商:
SELECT 'Customer' AS Type, ContactName, City, Country
FROM Customers
UNION
SELECT 'Supplier', ContactName, City, Country
FROM Suppliers;
请注意上面的AS Type - 它是一个别名。SQL别名用于给表或列一个临时的名称。别名仅在查询的持续时间内存在。因此,这里我们创建了一个名为“Type”的临时列,其中列出了联系人是“Customer”还是“Supplier”。
SQL GROUP BY语句
GROUP BY语句将具有相同值的行分组为摘要行,通常与聚合函数一起使用,以根据一个或多个列对结果集进行分组。
GROUP BY语法
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP 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), Country
FROM Customers
GROUP BY Country;
以下SQL语句列出了每个国家的客户数量,按高到低排序:
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER 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 Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;
最后
为了方便其他设备和平台的小伙伴观看往期文章:公众号搜索Let us Coding,或者扫描下方二维码,关注公众号,即可获取最新文章。
看完如果觉得有帮助,欢迎点赞、收藏和关注

深入理解 SQL UNION 运算符及其应用场景的更多相关文章
- Sql Server的艺术(五) SQL UNION与UNION JOIN运算符
学习本节所用表: CREATE TABLE TEACHER ( ID INT IDENTITY (,) PRIMARY KEY , --主键,自增长 TNO INT NOT NULL, --教工号 T ...
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转)
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...
- 【转】深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
[原文]:http://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. ...
- (转)理解SQL SERVER中的分区表
简介 分区表是在SQL SERVER2005之后的版本引入的特性.这个特性允许把逻辑上的一个表在物理上分为很多部分.而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个 ...
- 理解SQL SERVER中的分区表(转)
简介 分区表是在SQL SERVER2005之后的版本引入的特性.这个特性允许把逻辑上的一个表在物理上分为很多部分.而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个 ...
- 理解SQL SERVER中的分区表
转自:http://www.cnblogs.com/sienpower/archive/2011/12/31/2308741.html 简介 分区表是在SQL SERVER2005之后的版本引入的特性 ...
- Linq to SQL -- Union All、Union、Intersect和Top、Bottom和Paging和SqlMethods
Union All/Union/Intersect操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1. ...
- 深入理解SQL的四种连接,左外连接,右外连接,内连接,全连接
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...
- T-SQL 理解SQL SERVER中的分区表(转)
转载来源一定要明显: http://www.cnblogs.com/CareySon/archive/2011/12/30/2307766.html 而且这个大神对于数据库方面的文章非常棒 强烈推荐 ...
- 转【深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接】
转自:https://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. ...
随机推荐
- 【Azure 应用服务】Azure App Service能否使用Storage Account File Share
问题描述 Azure App Service能否使用Storage Account File Share? 问题回答 如果部署的App Service为Linux环境,可以直接使用Mount stor ...
- 15. JVM垃圾回收器详解
1. 垃圾回收器的分类 和 GC性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现. 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC ...
- Java -----多线程 创建线程的方式三: 实现Callable接口----JDK 5.0 新增
1 package bytezero.thread2; 2 3 import java.util.concurrent.Callable; 4 import java.util.concurrent. ...
- liquibase customChange
liquibase customChange liquibase changeset 执行Java代码. liquibase支持yml等文件,支持引入sql文件,还支持Java这种方式执行change ...
- .NET Conf China 2023济南站社区活动
2024年3月3日,在这个春暖花开的日子里,由微软MVP项目.山东财经大学管理科学与工程学院.胶东开发者社区.济南.NET俱乐部联合举办了[.NET Conf China 2023 JiNan Wa ...
- 案例7:将"picK"译成密码
密码规则:用当前字母后面的第五各字符来代替当前字符.比如字符'a'后面的第5个字符为'f', 则使用'f'代替'a'.编写程序,实现该功能. 示例代码如下: #define _CRT_SECURE_N ...
- vscode 切换主侧栏可见性 原Ctrl+B 我改为了 Alt+P
vscode 切换主侧栏可见性 原Ctrl+B 我改为了 Alt+P ctrl+b 总是想不起来
- manjaro安装/卸载gnome/kde桌面环境
安装gnome桌面环境 步骤 1. 在运行以下教程之前,请确保我们的系统是最新的: sudo pacman -Syu 步骤 2. 在 Manjaro 20 上安装 GNOME 桌面. 现在我们通过执行 ...
- Github下载release附件变相提速方法
最近找到了个油猴插件,下载2M/s,推荐大家使用Github 镜像访问,加速下载 描述 github上面有许多开源的软件,作者们都打包发布为release版本,我们可以下载打包好的软件,但是,由于国内 ...
- 逆向通达信Level-2 续六 (调试pad控件)
调试终端面版单元, 以及宿主窗口 调试大数据面版单元, 以及宿主窗口 逆向通达信Level-2 续十一 (无帐号登陆itrend研究版) 逆向通达信Level-2 续十 (trace脱壳) 逆向通达信 ...