MySQL子查询

子查询

子查询是指出现在其他SQL语句内的SELECT子句

  • 子查询嵌套在查询内部,且必须始终出现在圆括号内
  • 可以包含多个关键字或者条件,如DISTINCTGROUP BYORDER BYLIMIT、函数等
  • 外层查询可以是:SELECTINSERTUPDATESETDO
  • 返回值:标量、一行、一列或者子查询
1
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

SELECT * FROM t1;称为Outer Query/外查询/Outer Statement
SELECT column1 FROM t2; 称为Sub Query/子查询

使用比较运算符的子查询

1
=、>、<、>=、<=、<>、!=、<=>

语法结构

1
operand comparison_operator [ANY|SOME|ALL] subquery

当子查询返回多个结果的时候就可以用到ANYSOMEALL修饰符的比较运算符

Any: >Any 表示至少大于一个值,即大于最小值。
Any: All 表示大于每一个值。换句话说,它表示大于最大值
All: <All 表示小于每一个值。换句话说,它表示小于最小值
ANY: =ANY 或者 SOME 都是等于他们本身

ANY SOME ALL
> >= 最小值 最小值 最大值
< <= 最大值 最大值 最小值
= 任意值 任意值
<> != 任意值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=5636.36;
//查询所有商品不小于平均价格的
SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price>=(
SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
//利用子查询来进行两者的结合查找
SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price>=ANY (
SELECT goods_price FROM tdb_goods
WHERE goods_cate='超级本');
SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price>=ALL (
SELECT goods_price FROM tdb_goods
WHERE goods_cate='超级本');
SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price>=SOME (
SELECT goods_price FROM tdb_goods
WHERE goods_cate='超级本');

使用[NOT] IN 的子查询

语法结构

1
operand comparison_operator [NOT] {IN|EXISTS} (subquery)

IN 相当于 =ANY 或 =SOME
NOT IN 相当于 !=ALL 或 <>ALL

1
2
3
4
SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price IN (
SELECT goods_price FROM tdb_goods
WHERE goods_cate = '超级本');

使用[NOT] EXISTS 的子查询

如果子查询返任何行,EXISTS返true;反之,返false。

1
2
3
4
CREATE TABLE IF NOT EXISTS tdb_goods_cates(
cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
cate_name VARCHAR(40) NOT NULL
);