MySQL Subquery
Summary: in this tutorial, we will show you how to use the MySQL subquery to write complex queries and explain the correlated subquery concept.
A MySQL subquery is a query that is nested inside another query such as SELECT, INSERT, UPDATEor DELETE. In addition, a MySQL subquery can be nested inside another subquery.
A MySQL subquery is also called an inner query while the query that contains the subquery is called an outer query.
Let’s take a look at the following subquery that returns employees who locate in the offices in the USA.
- The subquery returns all offices codes of the offices that locate in the USA.
- The outer query selects the last name and first name of employees whose office code is in the result set returned by the subquery.

You can use a subquery anywhere that you use an expression. In addition, you must enclose a subquery in parentheses.
MySQL subquery within a WHERE clause
We will use the payments table for the demonstration.

MySQL subquery with comparison operators
You can use comparison operators e.g., =, >, <, etc., to compare a single value returned by the subquery with the expression in the WHERE clause.
For example, the following query returns the customer who has the maximum payment.
SELECT customerNumber,
checkNumber,
amount
FROM payments
WHERE amount = (
SELECT MAX(amount)
FROM payments
);

In addition to the equality operator, you can use other comparison operators such as greater than (>), less than(<), etc.
For example, you can find customers whose payments are greater than the average payment using a subquery.
First, you use a subquery to calculate the average payment using the AVG aggregate function. Then, in the outer query, you query payments that are greater than the average payment returned by the subquery.
SELECT customerNumber,
checkNumber,
amount
FROM payments
WHERE amount > (
SELECT AVG(amount)
FROM payments
);
MySQL subquery with IN and NOT IN operators
If a subquery returns more than one value, you can use other operators such as INor NOT INoperator in the WHERE clause.
See the following customers and orders tables.

For example, you can use a subquery with NOT IN operator to find customer who has not ordered any products as follows:
SELECT customername
FROM customers
WHERE customerNumber NOT IN(
SELECT DISTINCT customernumber
FROM orders
);
MySQL subquery with EXISTS and NOT EXISTS
When a subquery is used with EXISTS or NOT EXISTS operator, a subquery returns a Boolean value of TRUE or FALSE. The subquery acts as an existence check.
In the following example, we select a list of customers who have at least one order with total sales greater than 10K.
First, we build a query that checks if there is, at least, one order with total sales greater than 10K:
SELECT
priceEach * quantityOrdered
FROM
orderdetails
WHERE
priceEach * quantityOrdered > 10000
GROUP BY
orderNumber;

The query returns 6 rows so that when we use it as a subquery, it will return TRUE; therefore the whole query will return all customers:
SELECT
customerName
FROM
customers
WHERE
EXISTS (
SELECT
priceEach * quantityOrdered
FROM
orderdetails
WHERE
priceEach * quantityOrdered > 10000
GROUP BY
orderNumber
)

If you replace the EXISTS with NOT EXIST, the query will not return any records at all.
MySQL subquery in FROM clause
When you use a subquery in the FROM clause, the result set returned from a subquery is used as a table. This table is referred to as a derived table or materialized subquery.
The following subquery finds the maximum, minimumand average number of items in sale orders:
SELECT
MAX(items),
MIN(items),
FLOOR(AVG(items))
FROM
(
SELECT
orderNumber,
COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY
orderNumber
) AS lineitems;

Notice that the subquery returns the following result set that is used as a derived table for the outer query.
MySQL correlated subquery
In the previous examples, you notice that the subquery is independent. It means you can execute the subquery as a single query. However, a correlated subquery is a subquery that uses the information from the outer query. In other words, a correlated subquery depends on the outer query. A correlated subquery is evaluated once for each row in the outer query.
In the following correlated subquery, we select products whose buy prices are greater than the average buy price of all products for a specific product line.
SELECT
productname,
buyprice
FROM
products AS p1
WHERE
buyprice > (
SELECT
AVG(buyprice)
FROM
products
WHERE
productline = p1.productline
)

The inner query executes for every product line because the product line is changed for every row. Hence, the average buy price will also change.
In this tutorial, we have shown you how to use MySQL subquery and correlated subquery to write more complex queries.
原文:http://www.mysqltutorial.org/mysql-subquery/
MySQL Subquery的更多相关文章
- MYSQL --Subquery returns more than 1 row查询结果多于一行
Subquery returns more than 1 row表示子查询返回了多行数据 例如: select * from table1 where table1.colums=(select co ...
- MySQL----This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'的意思是,这版本的 MySQL 不支持使 ...
- [慢查优化]慎用MySQL子查询,尤其是看到DEPENDENT SUBQUERY标记时
案例梳理时间:2013-9-25 写在前面的话: 在慢查优化1和2里都反复强调过 explain 的重要性,但有时候肉眼看不出 explain 结果如何指导优化,这时候还需要有一些其他基础知识的佐助, ...
- This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery 解决方法
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'的意思是,这版本的 MySQL 不支持使 ...
- This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 解决办法
背景:mysql5.1.36,mybatis 前言:为了解决一对多,分页显示,但是前端主要是显示的一的一方的数据和(多方的某个字段拼接在一起),此时的limit不能直接跟在查询的后面,需要用子查询把需 ...
- Mysql:1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'错误解决
select distinct b.sale_count from product_sale b where b.pro_id in (select a.pro_id from product a L ...
- This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'的意思是,这版本的 MySQL 不支持使 ...
- MySQL Crash Course #07# Chapter 15. 关系数据库. INNER JOIN. VS. nested subquery
索引 理解相关表. foreign key JOIN 与保持参照完整性 关于JOIN 的一些建议,子查询 VS. 联表查询 我发现MySQL 的官方文档里是有教程的. SQL Tutorial - W ...
- mysql 报错 ‘u'Subquery returns more than 1 row'’
watch_course_sql ) , '%%Y-%%m-%%d %%T') regtime, a.username FROM bskuser a where a.UserName in (sele ...
随机推荐
- 一步一步学习Vim 全图解释
转载:http://linux.chinaunix.net/techdoc/desktop/2009/01/03/1056322.shtml 一步一步学习Vim 全图解释 以下注释,根据图示和自己实践 ...
- DevExpress Winform 通用控件打印方法(允许可自定义边距) z
DevExpress Winform 通用控件打印方法,包括gridcontrol,treelist,pivotGridControl,ChartControl,LayoutControl...(所有 ...
- 如何使用Omnifocus做时间管理 4 多项目管理
这一篇和大家分享作为一个管理者,可能遇到的时间管理挑战和如何用omnifocus应对这些挑战. 张经理在一家IT公司上班,从程序员开始打拼了5年,凭借权威的技术能力当上了项目经理,同时管理三个项目,苦 ...
- Go:《Go语言 云动力》
背景 中秋快速的读了一遍<Go语言 云动力>,对Go有一下几点感觉: 在静态类型和动态类型之间取得了非常好的平衡,隐式接口实现会被后续的语言借鉴(希望C#能借鉴一下). 缺乏异常处理机制, ...
- U3D内存优化
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 U3D内存优化 读了Hog关于内存管理文章 ...
- [转] Markdown
转自 https://en.wikipedia.org/wiki/Markdown#Example 英文版本 - http://daringfireball.net/projects/markdown ...
- iOS开源项目:DYNavigationController
DYNavigationController是一个实现了左右滑动导航的项目. https://github.com/dyang/DYNavigationController 首先用之前的跟视图初始化D ...
- XHTML学习要点
目标 掌握XHTML语法,能正确书写出符合规则的文档. 要点 基本概念,与HTML有什么不一样 基本语法规则: XHTML 文档必须拥有一个根元素 标签名.属性名称必须小写 属性值必须加引号 属性不能 ...
- STM32+IAP方案 实现网络升级应用固件
关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案. 原理与网上流传的串口作为传输手段 一致:不同之处,无非我这里使用了网络设备传输.==(lwip ...
- [Functional Programming] Monad
Before we introduce what is Monad, first let's recap what is a pointed functor: A pointed functor is ...

