mysql子查询设置_什么是mysql子查询?如何利用子查询进行过滤?
子查询
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子查询?如何利用子查询进行过滤?相关推荐
- mysql 外键设置_详解MySQL外键设置
MySQL外键设置是学习MySQL数据库过程中不能不提的,下面就会为您详细介绍MySQL外键设置的方法,希望对您学习MySQL外键设置方面能有所帮助. 外键的作用: 保持数据一致性,完整性,主要目的是 ...
- mysql数据库编码设置_如何修改mysql数据库编码
在建网站时,有时需要将一个数据库里的数据导入到另一个数据库里,但往往会出现二个数据库的编码不同,造成网页乱码.解决方法就是修改数据库编码. 下面介绍一下如何修改MYSQL数据库编码的方法. 方法/步骤 ...
- mysql query 查询失败_如何在mysql进行查询缓存及失败的解决方法
都知道函数在使用前需要弄清楚参数的属性,这样才能对函数的使用有较好的了解.有些小伙伴学习了查询缓存后,直接进行了下一步的实战操作.这里小编想提醒大家,开始操作之前一定要先设置参数,不然就会出现问题.下 ...
- django mysql连接超时设置_坑(一)—— Django ORM 连接超时的坑
问题 数据库链接丢失异常 django.db.utils.OperationalError: (2013, 'Lost connection to MySQL server during query' ...
- mysql通配符查询 性能_使用mysql5.7新特性解决前通配符查询性能问题
众所周知,在mysql里的后通配符可以使用索引查找,前通配查询却无法使用到索引,即使是使用到了索引,也是使用了索引全扫描,效率依然不高,再MySQL5.7之前,一直都没有好的办法解决,但是到了MySQ ...
- mysql 无线网络设置_操作mysql命令行的方法步骤
操作mysql命令行的方法步骤 现在向大家介绍mysql命令行下,从数据库的建立到表数据的删除全过程,希望对大家有所帮助. 登陆mysql 打cmd命令终端,如果已经添加了mysql的环境变量,可以直 ...
- 如何提高mysql查询效率_如何提高MySQL查询效率
MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一 ...
- mysql修改字段设置_在mysql中,如何改变列声明.
展开全部 修改表 - 修改列的数据类型 使用62616964757a686964616fe59b9ee7ad9431333332616466 CHANGE COLUMN 来修改列的数据类型,还必须 设 ...
- 如何设置mysql的运行目录_如何修改mysql数据库文件的路径 | 学步园
在网上找了好多,没有确定哪个是最终的答案,由于网站在运行中,实在不敢轻易动手,怎么奈我是个菜鸟呢!先把找到的东西简单记录一下,回头再说! 还有一个: 首先在数据库里看一下数据库里当前数据文件的存放路径 ...
最新文章
- jdbc mysql 换行符_mysql JDBC URL格式各个参数详解
- MySQL学习(四、子查询)
- 2.AsyncQueryHandler、内容提供者
- 项目评测(共27组)
- Chrome V8引擎系列随笔 (1):Math.Random()函数概览
- [管理]《高绩效人士的五项管理》 -- 李践
- W3school笔记——HTML
- 如何进入大华智能分析服务器,如何配置大华录像机区域入侵功能,看完就明白...
- 【HUSTOJ】1055: 字符图形11-字母正三角
- 两个小球碰撞速度计算方法
- 柳州铁一中机器人_柳州铁一中学学子在2020年广西中小学电脑机器人竞赛中勇创佳绩...
- 罗马帝国 Ancient Rome 简易修改器
- 十行代码完成公众号对话,VFP的能力就是这么强悍,你学会了吗?
- 手把手的教你安装PyCharm --Pycharm安装详细教程(一)(非常详细,非常....)
- SAP FICO 定义成本组件结构
- 愿我们在路上聪明绝顶但不绝顶
- 试验试剂LR,双官能交联剂Methyltetrazine-PEG12-DBCO,四嗪二苯基环辛炔
- prompt learning 提示学习初步心得及示例 代码
- 183 25用计算机算列竖式,新北师大四年级上册数学计算题
- android工程文件assts,Android初始化FaceSDK报错
热门文章
- python截取逗号_Python基础知识: 元组
- windows 打开.ipynb文件
- 水下图像处理算法Sea-thru
- vector 指针 的指针
- The NVIDIA driver on your system is too old
- Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received
- python 尚未调用 CoInitialize
- win nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are depr
- Tensorflow csv文件读写与分批训练
- s2sh集成dataSource配置无效的问题 -Access denied for user 'sa'@'localhost'