子查询

MySQL 4.1引入了对子查询的支持,所以要想使用本章描述的SQL,必须使用MySQL 4.1或更高级的版本。

SELECT语句 是SQL的查询。迄今为止我们所看到的所有 SELECT 语句都是简单查询,即从单个数据库表中检索数据的单条语句。

查询(query) 任何SQL语句都是查询。但此术语一般指 SELECT语句。

SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。为什么要这样做呢?理解这个概念的最好方法是考察几个例子。

利用子查询进行过滤

本书所有章中使用的数据库表都是关系表(关于每个表及关系的描述,请参阅附录B)。订单存储在两个表中。对于包含订单号、客户ID、订单日期的每个订单, orders 表存储一行。各订单的物品存储在相关的orderitems 表中。 orders 表不存储客户信息。它只存储客户的ID。实际的客户信息存储在 customers 表中。现在,假如需要列出订购物品 TNT2 的所有客户,应该怎样检索?下面列出具体的步骤。

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

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

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

上述每个步骤都可以单独作为一个查询来执行。可以把一条 SELECT语句返回的结果用于另一条 SELECT 语句的 WHERE 子句。

也可以使用子查询来把3个查询组合成一条语句。

第一条 SELECT 语句的含义很明确,对于 prod_id 为 TNT2 的所有订单物品,它检索其 order_num 列。输出列出两个包含此物品的订单:

输入:select order_num from orderitems where prod_id = 'TNT2';

输出:

下一步,查询具有订单 20005 和 20007 的客户ID。利用 IN子句,编写如下的 SELECT 语句:

输入:select cust_id from orders where order_num in (20005,20007);

输出:

现在,把第一个查询(返回订单号的那一个)变为子查询组合两个查询。请看下面的 SELECT 语句:

输入:select cust_id from orders where order_num in (select order_num from orderitems where prod_id = 'TNT2');

输出:

分析:在 SELECT 语句中,子查询总是从内向外处理。在处理上面的SELECT 语句时,MySQL实际上执行了两个操作。

首先,它执行下面的查询:select order_num from orderitems where prod_id = 'TNT2';

此查询返回两个订单号: 20005 和 20007 。然后,这两个值以 IN 操作符要求的逗号分隔的格式传递给外部查询的 WHERE 子句。外部查询变成:select cust_id from orders where order_num in (20005,20007);

可以看到,输出是正确的并且与前面硬编码 WHERE 子句所返回的值相同。

格式化SQL 包含子查询的 SELECT 语句难以阅读和调试,特别是它们较为复杂时更是如此。如上所示把子查询分解为多行并且适当地进行缩进,能极大地简化子查询的使用。

现在得到了订购物品 TNT2 的所有客户的ID。下一步是检索这些客户ID的客户信息。检索两列的SQL语句为:

输入:select cust_name,cust_contact from customers where cust_id in (10001,10004);

可以把其中的 WHERE 子句转换为子查询而不是硬编码这些客户ID:

输入: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实际上必须执行3条 SELECT语句。最里边的子查询返回订单号列表,此列表用于其外面的子查询的 WHERE 子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询的 WHERE 子句。最外层查询确实返回所需的数据。

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

列必须匹配 在 WHERE 子句中使用子查询(如这里所示),应该保证 SELECT 语句具有与 WHERE 子句中相同数目的列。通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。

虽然子查询一般与 IN 操作符结合使用,但也可以用于测试等于( = )、不等于( <> )等。

子查询和性能 这里给出的代码有效并获得所需的结果。但是,使用子查询并不总是执行这种类型的数据检索的最有效的方法。更多的论述,请参阅第15章,其中将再次给出这个例子。

【相关推荐】mysql创建计算字段使用子查询

mysql中什么是联结和关系表?

为什么使用联结和如何创建联结

MySQL中WHERE子句重要性和如何联结多个表

mysql子查询设置_什么是mysql子查询?如何利用子查询进行过滤?相关推荐

  1. mysql 外键设置_详解MySQL外键设置

    MySQL外键设置是学习MySQL数据库过程中不能不提的,下面就会为您详细介绍MySQL外键设置的方法,希望对您学习MySQL外键设置方面能有所帮助. 外键的作用: 保持数据一致性,完整性,主要目的是 ...

  2. mysql数据库编码设置_如何修改mysql数据库编码

    在建网站时,有时需要将一个数据库里的数据导入到另一个数据库里,但往往会出现二个数据库的编码不同,造成网页乱码.解决方法就是修改数据库编码. 下面介绍一下如何修改MYSQL数据库编码的方法. 方法/步骤 ...

  3. mysql query 查询失败_如何在mysql进行查询缓存及失败的解决方法

    都知道函数在使用前需要弄清楚参数的属性,这样才能对函数的使用有较好的了解.有些小伙伴学习了查询缓存后,直接进行了下一步的实战操作.这里小编想提醒大家,开始操作之前一定要先设置参数,不然就会出现问题.下 ...

  4. django mysql连接超时设置_坑(一)—— Django ORM 连接超时的坑

    问题 数据库链接丢失异常 django.db.utils.OperationalError: (2013, 'Lost connection to MySQL server during query' ...

  5. mysql通配符查询 性能_使用mysql5.7新特性解决前通配符查询性能问题

    众所周知,在mysql里的后通配符可以使用索引查找,前通配查询却无法使用到索引,即使是使用到了索引,也是使用了索引全扫描,效率依然不高,再MySQL5.7之前,一直都没有好的办法解决,但是到了MySQ ...

  6. mysql 无线网络设置_操作mysql命令行的方法步骤

    操作mysql命令行的方法步骤 现在向大家介绍mysql命令行下,从数据库的建立到表数据的删除全过程,希望对大家有所帮助. 登陆mysql 打cmd命令终端,如果已经添加了mysql的环境变量,可以直 ...

  7. 如何提高mysql查询效率_如何提高MySQL查询效率

    MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一 ...

  8. mysql修改字段设置_在mysql中,如何改变列声明.

    展开全部 修改表 - 修改列的数据类型 使用62616964757a686964616fe59b9ee7ad9431333332616466 CHANGE COLUMN 来修改列的数据类型,还必须 设 ...

  9. 如何设置mysql的运行目录_如何修改mysql数据库文件的路径 | 学步园

    在网上找了好多,没有确定哪个是最终的答案,由于网站在运行中,实在不敢轻易动手,怎么奈我是个菜鸟呢!先把找到的东西简单记录一下,回头再说! 还有一个: 首先在数据库里看一下数据库里当前数据文件的存放路径 ...

最新文章

  1. jdbc mysql 换行符_mysql JDBC URL格式各个参数详解
  2. MySQL学习(四、子查询)
  3. 2.AsyncQueryHandler、内容提供者
  4. 项目评测(共27组)
  5. Chrome V8引擎系列随笔 (1):Math.Random()函数概览
  6. [管理]《高绩效人士的五项管理》 -- 李践
  7. W3school笔记——HTML
  8. 如何进入大华智能分析服务器,如何配置大华录像机区域入侵功能,看完就明白...
  9. 【HUSTOJ】1055: 字符图形11-字母正三角
  10. 两个小球碰撞速度计算方法
  11. 柳州铁一中机器人_柳州铁一中学学子在2020年广西中小学电脑机器人竞赛中勇创佳绩...
  12. 罗马帝国 Ancient Rome 简易修改器
  13. 十行代码完成公众号对话,VFP的能力就是这么强悍,你学会了吗?
  14. 手把手的教你安装PyCharm --Pycharm安装详细教程(一)(非常详细,非常....)
  15. SAP FICO 定义成本组件结构
  16. 愿我们在路上聪明绝顶但不绝顶
  17. 试验试剂LR,双官能交联剂Methyltetrazine-PEG12-DBCO,四嗪二苯基环辛炔
  18. prompt learning 提示学习初步心得及示例 代码
  19. 183 25用计算机算列竖式,新北师大四年级上册数学计算题
  20. android工程文件assts,Android初始化FaceSDK报错

热门文章

  1. python截取逗号_Python基础知识: 元组
  2. windows 打开.ipynb文件
  3. 水下图像处理算法Sea-thru
  4. vector 指针 的指针
  5. The NVIDIA driver on your system is too old
  6. Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received
  7. python 尚未调用 CoInitialize
  8. win nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are depr
  9. Tensorflow csv文件读写与分批训练
  10. s2sh集成dataSource配置无效的问题 -Access denied for user 'sa'@'localhost'