SQL学习(组合查询)

组合查询

多数SQL查询都只包含一个或从多个表中返回数据的单条SELECT语句。MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为复合查询
有两种情况需要使用组合查询:

  • 在单个查询中从不同的表返回类似结构的数据
  • 对单个表执行多个查询,按单个查询返回数据

创建组合查询

使用UNION

可用UNION操作符来组合数条SQL查询。利用UNION,可给出多条SELECT语句,将它们的结果组合成单个结果集。

假如需要价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的所有物品(不考虑价格)。

mysql> SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 UNION SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002);
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
|    1003 | FC      |       2.50 |
|    1002 | FU1     |       3.42 |
|    1003 | SLING   |       4.49 |
|    1003 | TNT1    |       2.50 |
|    1001 | ANV01   |       5.99 |
|    1001 | ANV02   |       9.99 |
|    1001 | ANV03   |      14.99 |
|    1002 | OL1     |       8.99 |
+---------+---------+------------+
8 rows in set (0.00 sec)

UNION规则

  • UNION必须由两条或以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合4条SELECT语句,将要使用3个UNION关键字)
  • UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。
  • 列数据类型必须兼容: 类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。

如果想返回所有匹配的行,可使用UNION ALL。

对组合查询结果排序

SELECT语句输出用ORDER BY子句排序。在用UNION组合查询时,只能使用一条ORDER BY 子句,它必须出现在最后一条SELECT语句之后。

mysql> SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 UNION SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1001,1002) ORDER BY vend_id, prod_price;
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
|    1001 | ANV01   |       5.99 |
|    1001 | ANV02   |       9.99 |
|    1001 | ANV03   |      14.99 |
|    1002 | FU1     |       3.42 |
|    1002 | OL1     |       8.99 |
|    1003 | FC      |       2.50 |
|    1003 | TNT1    |       2.50 |
|    1003 | SLING   |       4.49 |
+---------+---------+------------+
8 rows in set (0.02 sec)
<think>好的,用户想了解SQL Server中组合查询的使用方法示例。首先,我需要明确什么是组合查询根据之前的引用资料,组合查询通常指的是使用集合操作符如UNION、INTERSECT、EXCEPT来合并多个SELECT语句的结果。用户可能指的是这些操作,或者也可能指更广义的多连接查询,但根据问题中的“组合查询”常见定义,应该是指前者。 接下来,我需要检查已有的引用内容。引用[4]提到了UNION运算符的示例,引用[2]、[3]、[5]涉及子查询、ROW_NUMBER()连接查询。用户的问题明确提到“组合查询”,所以应聚焦在UNION、INTERSECT、EXCEPT这些集合操作上。 需要确保回答结构清晰,分点说明每个操作符的使用方法,并提供示例。同时根据用户提供的引用,可以引用[4]中的UNION示例,但可能需要补充更多例子,比如UNION ALL,以及INTERSECTEXCEPT的示例,这些在现有引用中没有提到,但属于组合查询的一部分。 还要注意用户可能需要了解组合查询的注意事项,比如列的数量类型必须一致,以及默认去重等特性。需要指出这些注意点,避免用户在使用时出错。 最后,生成相关问题,帮助用户一步学习。例如,组合查询与连接查询的区别,性能优化等。确保问题与主题相关,并基于已有引用可能的知识点展开。</think>### SQL Server 组合查询详解 组合查询是通过集合运算符将多个`SELECT`语句的结果合并为个结果集的操作,主要包括`UNION`、`INTERSECT``EXCEPT`三种类型[^4]。 --- #### 1. **`UNION`运算符** **作用**:合并两个查询结果并自动去重 **语法**: ```sql SELECT 列1, 列2 FROM 1 UNION SELECT 列1, 列2 FROM 2; ``` **示例**(合并不同的订记录): ```sql -- 合并2023年2024年订(自动去重) SELECT OrderID, CustomerID FROM Orders2023 UNION SELECT OrderID, CustomerID FROM Orders2024; ``` **`UNION ALL`**:保留重复记录,性能更高 ```sql SELECT ProductName FROM ProductsA UNION ALL SELECT ProductName FROM ProductsB; ``` --- #### 2. **`INTERSECT`运算符** **作用**:返回两个查询结果的交集 **语法**: ```sql SELECT 列1 FROM 1 INTERSECT SELECT 列1 FROM 2; ``` **示例**(查找同时购买过商品A商品B的用户): ```sql SELECT CustomerID FROM Orders WHERE ProductID = 'A' INTERSECT SELECT CustomerID FROM Orders WHERE ProductID = 'B'; ``` --- #### 3. **`EXCEPT`运算符** **作用**:返回第一个查询中存在但第二个查询中不存在的记录 **语法**: ```sql SELECT 列1 FROM 1 EXCEPT SELECT 列1 FROM 2; ``` **示例**(查找未退货的订): ```sql SELECT OrderID FROM AllOrders EXCEPT SELECT OrderID FROM ReturnedOrders; ``` --- ### 组合查询的注意事项 1. **列匹配**:所有`SELECT`语句的列数量、数据类型必须一致 2. **排序规则**:若需排序,只能在最后一个`SELECT`语句中使用`ORDER BY` 3. **性能优化**:对大数据量查询建议添加索引,或使用`UNION ALL`代替`UNION`[^1] --- ### 组合查询 vs 连接查询 | 类型 | 场景 | 示例 | |------------|------------------------------|-------------------------------| | 组合查询 | 纵向合并数据 | 合并多相同结构的销售记录 | | 连接查询 | 横向关联数据(如`JOIN`) | 关联用户[^5] | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值