工学1号馆

home

« | 返回首页 | »

MySQL使用子查询

By Wu Yudong on July 03, 2017

本文介绍什么是子查询以及如何使用它们。

1、利用子查询进行过滤

有如下的场景,订单存储在两个表中。对于包含订单号、客户ID、订单日期的每个订单, orders表存储一行。各订单的物品存储在相关的orderitems表中。 orders表不存储客户信息。它只存储客户的ID。实际的客户信息存储在customers表中。

现在,假如需要列出订购物品TNT2的所有客户,应该怎样检索?可以分以下几个步骤:

(1)检索包含物品TNT2的所有订单的编号

(2)检索具有前一步骤列出的订单编号的所有客户的ID

(3)检索前一步骤返回的所有客户ID的客户信息。

mysql> select cust_name, cust_contact
-> from customers
-> where cust_id in (select cust_id
->                                 from orders
->                                 where order_num in (select order_num
->                                                                        from orderitems
->                                                                        where prod_id='TNT2'));

为了执行上述SELECT语句, MySQL实际上必须执行3SELECT语句。最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询的WHERE子句。最外层查询确实返回所需的数据。

可见,在WHERE子句中使用子查询能够编写出功能很强并且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。

2、作为计算字段使用子查询

使用子查询的另一方法是创建计算字段。假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。

mysql> select cust_name,cust_state,
-> (select count(*)
-> from orders
-> where orders.cust_id=customers.cust_id) as orders
-> from customers
-> order by cust_name;

这种类型的子查询称为相关子查询。任何时候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)。

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)