1. 联合查询的概念
联合查询,即将两条或多条SELECT语句的结果组合在一起。这里的每一条SELECT语句又称为一个查询块。联合查询通常用于需求跨多个表进行数据查询的情况。比如,需要查询一个订单的客户信息、订单信息、商品信息等,这三个信息分别储存在三个不同的表中,则需要通过联合查询的方式将它们联系起来。
通常情况下,联合查询的语法如下:
SELECT column1, column2, column3, ... FROM table1
UNION [ALL]
SELECT column1, column2, column3, ... FROM table2
[UNION [ALL] SELECT column1, column2, column3, ... FROM table3 ... ]
UNION表示两个查询块的结果集的并集;UNION ALL则表示两个查询块的结果集的并集,不去重。
2. 联合查询的应用场景
2.1 查询多个表中的相同字段
如果一个字段分别在多个表中存在,我们需要查询它在所有表中出现的记录,则可以使用联合查询来实现。
SELECT product_name FROM product
UNION ALL
SELECT product_name FROM sale_product
以上SQL查询语句,会查询所有产品表和销售产品表中的产品名,并将结果合并输出,不去重。
2.2 查询多个表的完整记录
如果需要查询多个表的完整记录,我们可以使用联合查询来实现,此时需要保证所有表的字段数量和类型一致,否则会出现错误。
SELECT order_id, customer_name, order_date FROM orders
UNION ALL
SELECT order_id, supplier_name, order_date FROM purchase_orders
以上SQL查询语句,会查询所有订单表和采购订单表中的完整记录,并将结果合并输出,不去重。
2.3 查询多个表的部分记录
如果需要查询多个表的部分记录,我们仍然可以使用联合查询来实现,此时需要保证所有表的字段数量和类型一致,否则会出现错误。
SELECT product_name, list_price FROM product
UNION ALL
SELECT product_name, sale_price FROM sale_product
以上SQL查询语句,会查询所有产品表和销售产品表中的产品名和价格,并将结果合并输出,不去重。
3. 联合查询的实践
下面我们来通过一个案例来加深对于联合查询的理解。
3.1 案例描述
有两张表users和orders,各有三个字段。如下:
users表:
+----+-----------+-------+
| id | username | age |
+----+-----------+-------+
| 1 | Zhang San | 21 |
| 2 | Li Si | 22 |
| 3 | Wang Wu | 23 |
| 4 | Zhao Liu | 24 |
| 5 | Sun Qi | 25 |
+----+-----------+-------+
orders表:
+--------+---------+-------+
| user_id| product | price |
+--------+---------+-------+
| 1 | Apple | 5 |
| 2 | Banana | 3 |
| 3 | Pear | 4 |
| 3 | Peach | 7 |
| 4 | Orange | 6 |
| 5 | Grape | 2 |
+--------+---------+-------+
3.2 查询所有用户及其所购买的商品信息
SELECT users.username, orders.product, orders.price
FROM users, orders
WHERE users.id = orders.user_id
ORDER BY users.username
以上SQL查询语句,会查询所有用户购买商品的信息,并按用户名排序输出。结果如下:
+-----------+---------+-------+
| username | product | price |
+-----------+---------+-------+
| Li Si | Banana | 3 |
| Sun Qi | Grape | 2 |
| Wang Wu | Pear | 4 |
| Wang Wu | Peach | 7 |
| Zhang San | Apple | 5 |
| Zhao Liu | Orange | 6 |
+-----------+---------+-------+
3.3 查询所有用户及其所购买的商品信息,并包括未购买商品的用户
为了查询未购买商品的用户记录,我们需要使用联合查询,并使用LEFT JOIN语句来查询符合条件的记录。具体代码如下:
SELECT users.username, orders.product, orders.price
FROM users
LEFT JOIN orders ON users.id = orders.user_id
ORDER BY users.username
以上SQL查询语句,会查询所有用户购买商品的信息,包括未购买商品的用户,并按用户名排序输出。结果如下:
+-----------+---------+-------+
| username | product | price |
+-----------+---------+-------+
| Li Si | Banana | 3 |
| Sun Qi | Grape | 2 |
| Wang Wu | Pear | 4 |
| Wang Wu | Peach | 7 |
| Zhang San | Apple | 5 |
| Zhao Liu | Orange | 6 |
| Sun Yang | NULL | NULL |
+-----------+---------+-------+
以上结果中包含了一个用户名为"Sun Yang"的用户,该用户没有购买商品,因此product和price的值为NULL。
4. 总结
联合查询是在MSSQL中非常强大的数据查询工具,可通过多个查询块将结果集合并输出,从而简化了许多跨表查询的复杂操作。在实际应用中,我们需要根据具体的需求,选择合适的联合查询方式,并注意保证所有查询块中的字段数量和类型一致,从而避免错误。