子查询作为数据源

子查询生成的结果集包含行、列数据,因而非常适合将它与表一起包含在from子句的子查询里。例:

  1. SELECT d.dept_id, d.name, e_cnt.how_many num_employees
  2. FROM department d INNER JOIN
  3. (SELECT dept_id, COUNT(*) how_many
  4. FROM employee
  5. GROUP BY dept_id) e_cnt
  6. ON d.dept_id = e_cnt.dept_id;

数据加工

除了使用查询总结现有数据,读者还可以生成数据库中不存在的数据。例:

  1. SELECT 'zifeiy' name, 0 low_limit, 4999.99 high_limit
  2. UNION ALL
  3. SELECT 'feiyzi' name, 5000 low_limit, 9999.99 high_limit
  4. UNION ALL
  5. SELECT 'hahahe' name, 10000 low_limit, 9999999.99 high_limit;

结果:

  1. +--------+-----------+------------+
  2. | name | low_limit | high_limit |
  3. +--------+-----------+------------+
  4. | zifeiy | 0 | 4999.99 |
  5. | feiyzi | 5000 | 9999.99 |
  6. | hahahe | 10000 | 9999999.99 |
  7. +--------+-----------+------------+
  8. 3 rows in set (0.00 sec)

上面的SQL能够生成一个包含3组数据的结果集,然后我们将其滋味子查询添加到下面的SQL中:

  1. SELECT groups.name, COUNT(*) num_customers
  2. FROM
  3. (SELECT SUM(a.avail_balance) cust_balance
  4. FROM account a INNER JOIN product p
  5. ON a.product_cd = p.product_cd
  6. WHERE p.product_type_cd = 'ACCOUNT'
  7. GROUP BY a.cust_id) cust_rollup
  8. INNER JOIN
  9. (SELECT 'zifeiy' name, 0 low_limit, 4999.99 high_limit
  10. UNION ALL
  11. SELECT 'feiyzi' name, 5000 low_limit, 9999.99 high_limit
  12. UNION ALL
  13. SELECT 'hahahe' name, 10000 low_limit, 9999999.99 high_limit) groups
  14. ON cust_rollup.cust_balance
  15. BETWEEN groups.low_limit AND groups.high_limit
  16. GROUP BY groups.name;

过滤条件中的子查询

过滤条件中的子查询不一定出现在where子句中,下面的例子演示在having子句中使用子查询来查找开户最多的雇员:

  1. SELECT open_emp_id, COUNT(*) how_many
  2. FROM account
  3. GROUP BY open_emp_id
  4. HAVING COUNT(*) = (
  5. SELECT MAX(emp_cnt.how_many)
  6. FROM (
  7. SELECT COUNT(*) how_many
  8. FROM account
  9. GROUP BY open_emp_id
  10. ) emp_cnt
  11. );

子查询作为表达式生成器

单行单列的标量子查询,除了用于过滤条件中外,1还可以用在表达式可以出现的任何位置。其中包括查询中的select和order by子句以及insert语句中的values子句。例:

  1. SELECT
  2. (
  3. SELECT p.name FROM product p
  4. WHERE p.product_cd = a.product_cd
  5. AND p.product_type_cd = 'ACCOUNT'
  6. ) product,
  7. (
  8. SELECT b.name FROM branch b
  9. WHERE b.branch_id = a.open_branch_id
  10. ) branch,
  11. (
  12. SELECT CONCAT(e.fname, ' ', e.lname) FROM employee e
  13. WHERE e.emp_id = a.open_emp_id
  14. ) name,
  15. SUM(a.avail_balance) tot_deposits
  16. FROM account a
  17. GROUP BY a.product_cd, a.open_branch_id, a.open_emp_id
  18. ORDER BY 1,2;

此SQL在select子句中使用了子查询,它在select子句中使用了关联标量子查询查找产品、分行和雇员的名字。

在MySQL中使用子查询的更多相关文章

  1. 详细讲述MySQL中的子查询操作 (来自脚本之家)

    继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 1 ...

  2. MySQL中IN子查询会导致无法使用索引

    今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表 ...

  3. 在MySQL中使用子查询和标量子查询的基本用法

    一.MySQL 子查询 子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性.子查询没 ...

  4. MySQL中in子查询会导致无法使用索引问题(转)

    MySQL的测试环境 测试表如下 create table test_table2 ( id int auto_increment primary key, pay_id int, pay_time ...

  5. mysql 中 delete 子查询的限制

    1 DELETE FROM tablename 中的 tablename 不能起别名 delete ; [Err] - You have an error in your SQL syntax; 2 ...

  6. mysql 在update中实现子查询的方式

    当使用mysql条件更新时--最先让人想到的写法 UPDATE buyer SET is_seller=1 WHERE uid IN (SELECT uid FROM seller) 此语句是错误的, ...

  7. mysql中的模糊查询

    转载自:http://www.letuknowit.com/archives/90/ MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或 ...

  8. update 中实现子查询

    mysql 在update中实现子查询的方式   当使用mysql条件更新时--最先让人想到的写法 UPDATE buyer SET is_seller=1 WHERE uid IN (SELECT  ...

  9. MySQL里面的子查询

    一.子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中. 子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询. 子查询可以包含普通select可以包括的任何子句,比如:dis ...

随机推荐

  1. 【Python】 SQLAlchemy的初步使用

    SQLAlchemy 在很多Python的web框架中都整合进了SQLAlchemy这个主要发挥ORM作用的模块.所谓ORM,就是把复杂的SQL语句给包装成更加面向对象,易于理解的样子.在操作数据库的 ...

  2. 教你怎么样在大陆直接使用google搜索

    一.环境准备 我们需要一个nginx的模块来进行设置,ngx_http_google_filter_module.前提我们是有一个海外的VPS,并且可以访问谷歌,我的VPS是亿速云香港的. 首先先感受 ...

  3. 套接字API

    Q:套接字特点 A:管道,消息队列,信号量,共享内存这些通信机制只能允许同一计算机上运行的进程相互通信,而套接字不仅可以提供在同一计算机上的进程间通信,还可以提供不同计算机上的进程间通信. 服务器端: ...

  4. [poj3461]Oulipo_KMP

    Oulipo poj-3461 题目大意:给你两个字符串s和p,问s中有多少个等于p的子串. 注释:$1\le strlen(p)\le 10^4\qquad1\le strlen(s)\le 10^ ...

  5. 基于以太坊开发的类似58同城的DApp开发与应用案例

    今天,Origin开发团队很高兴地宣布在以太坊Rinkeby测试网络上推出Origin Protocol Demo DApp ! 在这个DApp中,你可以在不同垂直行业的solidarity econ ...

  6. linux小白成长之路9————打包部署SpringBoot项目

    [内容指引] SpringBoot项目介绍: 打包SpringBoot项目: 1.pom.xml: 2.application.properties配置: 3.application-dev.prop ...

  7. 【RabbitMQ系列】 Spring mvc整合RabbitMQ

    一.linux下安装rabbitmq 1.安装erlang环境 wget http://erlang.org/download/otp_src_18.2.1.tar.gz tar xvfz otp_s ...

  8. 贯穿程序员一生的必备开发技能——debug

    1.什么是debug debug是一种运行模式,用来跟踪程序的走向,以及跟踪程序运行过程中参数的值的变化. 2.debug的作用 debug一般用来跟踪代码的运行过程,通常在程序运行结果不符合预期或者 ...

  9. 福州大学W班 软件工程课中期调查

    问卷地址:https://www.wjx.cn/jq/17054810.aspx

  10. c语言字符类型作业

    一.PTA实验作业 题目1:7-2 统计一行文本的单词个数 1. 本题PTA提交列表 2. 设计思路 1.定义整形变量i=0,count=0,flag. 2.定义数组str[999] 3.输入str[ ...