作为计算字段使用子查询

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

为了执行这个操作,遵循下面的步骤。

(1) 从 customers 表中检索客户列表。

(2) 对于检索出的每个客户,统计其在 orders 表中的订单数目。

正如前两章所述,可使用 SELECT COUNT ( *) 对表中的行进行计数,并且通过提供一条 WHERE 子句来过滤某个特定的客户ID,可仅对该客户的订单进行计数。例如,下面的代码对客户 10001 的订单进行计数:

输入:select count(*) as orders from orders where cust_id = 10001;

为了对每个客户执行 COUNT(*) 计算,应该将 COUNT(*) 作为一个子查询。请看下面的代码:

输入:select cust_name,cust_state,(select count(*) from orders where orders.cust_id = customers.cust_id) as orders from customers order by cust_name;

输出:

分析:这 条 SELECT 语 句 对 customers 表 中 每 个 客 户 返 回 3 列 :cust_name 、 cust_state 和 orders 。 orders 是一个计算字段,它是由圆括号中的子查询建立的。该子查询对检索出的每个客户执行一次。在此例子中,该子查询执行了5次,因为检索出了5个客户。

子查询中的 WHERE 子句与前面使用的 WHERE 子句稍有不同,因为它使用了完全限定列名(在第4章中首次提到)。下面的语句告诉SQL比较orders 表中的 cust_id 与当前正从 customers 表中检索的 cust_id :where orders.cust_id = customers.cust_id

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

我们来看看如果不使用完全限定的列名会发生什么情况:

输入:select cust_name,cust_state,(select count(*) from orders where cust_id = cust_id) as orders from customers order by cust_name;

输出:

分析:显然,返回的结果不正确(请比较前面的结果),那么,为什么会这样呢?有两个 cust_id 列,一个在 customers 中,另一个在orders 中,需要比较这两个列以正确地把订单与它们相应的顾客匹配。如果不完全限定列名,MySQL将假定你是对 orders 表中的 cust_id 进行自身比较。而 SELECT COUNT(*) FROM orders WHERE cust_id = cust_id;总是返回 orders 表中的订单总数(因为MySQL查看每个订单的 cust_id是否与本身匹配,当然,它们总是匹配的)。

虽然子查询在构造这种 SELECT 语句时极有用,但必须注意限制有歧义性的列名。

不止一种解决方案 正如本章前面所述,虽然这里给出的样例代码运行良好,但它并不是解决这种数据检索的最有效的方法。在后面的章节中我们还要遇到这个例子。

逐渐增加子查询来建立查询 用子查询测试和调试查询很有技巧性,特别是在这些语句的复杂性不断增加的情况下更是如此。用子查询建立(和测试)查询的最可靠的方法是逐渐进行,这与MySQL处理它们的方法非常相同。首先,建立和测试最内层的查询。然后,用硬编码数据建立和测试外层查询,并且仅在确认它正常后才嵌入子查询。这时,再次测试它。对于要增加的每个查询,重复这些步骤。这样做仅给构造查询增加了一点点时间,但节省了以后(找出查询为什么不正常)的大量时间,并且极大地提高了查询一开始就正常工作的可能性。

【相关推荐】

1.什么是mysql子查询?如何利用子查询进行过滤?

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

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

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

mysql中将某个字段做计算,mysql创建计算字段使用子查询教程相关推荐

  1. mysql中将列动态转换为行,mysql 行转列 MySQL数据库动态行转列

    想把mysql一个表的行转成列,图1是原表,想实现图2的样式SELECT MAX(CAS就是一个动态的行列转换 CREATE TABLE `c_wssb_zz` ( `aa011` varchar(1 ...

  2. mysql创建视图不允许子查询

    不知道为什么mysql创建视图的时候,不允许包含子查询. 解决方式为,把子查询作成一个视图,然后再在想要创建的试图中,把这个视图作为一个表去写. 具体可参考: http://blog.csdn.net ...

  3. mysql视图子查询_mysql创建视图不能包涵子查询的解决办法。View's SELECT contains a subquery in the FROM clause...

    如下查询是没问题,但要创建成视图就报View's SELECT contains a subquery in the FROM clause错误. CREATE or REPLACE VIEW `v_ ...

  4. mysql数据库表子查询语句_MySQL使用子查询教程

    #MYSQL#这是我MyySQL教程的第四篇了,可能对于一些大神来说这些都是小儿科,但是我还是相信这些东西会对一些人有帮助的,本篇主要会介绍上面是子查询以及如何使用它们.大概会从,什么是子查询,利用子 ...

  5. MySQL使用IN、EXISTS、ANY、ALL关键字的子查询

    子查询是SELECT查询的另一个查询的附属,MySQL 4.1可以嵌套多个查询,在外面一层的查询中使用里面一层查询产生的结果集.这样就不是执行两个(或者多个)独立的查询,而是执行包含一个(或者多个)子 ...

  6. mysql用if判断关联的表_mysql表连接,子查询以及if判断

    创建表: CREATE TABLE emp ( ename varchar(10) DEFAULT NULL, hiredate date DEFAULT NULL, sal decimal(10,2 ...

  7. mysql 监控语句_做一个mysql监控系统应该掌握的一些基本语句

    很多系统需要一个MYSQL的监控,查看MYSQL的一些变量配置,吞吐量,连接数,QPS, TPS,慢查询等.当然有一些开源的工具可以满足这些需求,如果是要自己做呢.下面归纳了一些常用监控的SQL语句, ...

  8. docker mysql 蜂巢_在网易蜂巢中创建和管理Docker容器的教程

    创建容器点击左侧的导航菜单「容器管理」,进入容器管理列表页,通过点击容器列表左上角的「创建容器」按钮可进入创建容器页面,如下图所示: 其中带 * 为必填项. 选择镜像可选择的镜像分为「我的镜像」和「官 ...

  9. Web程序员的Mysql进阶序三之sql多表数据删除、子查询、联合查询

    假设表结构如下: create table test(name varchar(10),sex varchar(10) ); create table test1(name varchar(10),s ...

最新文章

  1. 机器学习入门一定要避开的3个陷阱
  2. ML之DTRFRExtraTRGBR:基于四种算法(DT、RFR、ExtraTR、GBR)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能
  3. 使用JMH做Java微基准测试
  4. android IPC及原理简介
  5. ios-deploy out of date (1.9.4 is required). To upgrade with Brew: brew upgrade ios-deploy
  6. 蒙特卡洛树搜索算法(UCT): 一个程序猿进化的故事
  7. word转PDF(使用liberOffice插件)
  8. 智能优化算法:萤火虫算法-附代码
  9. 如何学习硬件设计——理论篇
  10. python图像纹理提取_python 实现 gabor 滤波器提取纹理特征 提取指静脉纹理特征 指静脉切割代码...
  11. baidu 地图 3d版 自定义地图样式
  12. 恢复视力的方法(飞行员都用)治近视的秘方!1000度近视降到只有200
  13. 移动端环境搭建--2
  14. 36周岁这年,我终于知道该怎么活了!
  15. SQL注入漏洞测试(参数加密)
  16. C语言中带负数的除法
  17. 牛客网SQL 进阶篇刷题
  18. Android Okio应用及解析
  19. 视频教程-快速入门Python基础教程_Python基础知识大全-Python
  20. 数据跨域交换成刚需 志翔科技助力企业数据安全合规

热门文章

  1. android 弹窗in,Android监听程序处于INACTIVITY(未操作状态)时间并作出相应的操作
  2. 织梦dedecms的框架的Webshell
  3. vulhub安装教程
  4. 西北大学计算机转专业,西北大学可以转专业吗,西北大学新生转专业政策
  5. 太古鸿蒙诀正式版v1.07,百变队长安崎:台上小辣椒,台下情歌王
  6. 模态对话框和全选反选
  7. Two.js – 为现代浏览器而生的 2D 绘图 API
  8. [贝聊科技]网页端「应用跳转」技术实现演变
  9. 写博客的这几个月,获益良多
  10. node.js中exports与module.exports的区别分析