表的结构如下:
-
mysql>
select *
from product;
-
+
----+------+-------+-----+
-
| id | name | price | num |
-
+
----+------+-------+-----+
-
| 1 | 伊利 | 68 | 1 |
-
| 2 | 蒙牛 | 88 | 1 |
-
| 3 | nike | 888 | 2 |
-
| 4 | 阿迪 | 688 | 2 |
-
| 5 | kris | 1888 | 3 |
-
| 6 | tom | 2888 | 3 |
-
| 7 | sam | 1688 | 3 |
-
+
----+------+-------+-----+
嵌套子查询:执行不依赖于外部的查询。
执行顺序:先子查询然后在是主查询。
子查询的结果不会被显示,会将其传递给外部查,作为外部查询的条件来输出
例子:查询所有价格高于平均价格的商品信息。
-
mysql>
select *
from product
where price > (
select
avg(price)
from product);
-
+
----+------+-------+-----+
-
| id | name | price | num |
-
+
----+------+-------+-----+
-
| 5 | kris | 1888 | 3 |
-
| 6 | tom | 2888 | 3 |
-
| 7 | sam | 1688 | 3 |
-
+
----+------+-------+-----+
先执行子查询得到product表中商品的平均价格 然后通过price>avg的条件控制输出主查询的结果。
相关子查询:执行依赖于外部查询。
执行顺序:先是主查询然后在是子查询。
执行过程:
- 从主查询中取出一个元组(表中的行),将元组相关的列的值传递给子查询
- 子查询将列的值作为条件得到结果
- 主查询根据子查询得到的结果或者结果集得到满足条件的行,selece控制显示
- 然后主查询取出下一个元组继续1-3步骤,直到所有元组全部处理完毕。
例:取出不同num中的最高价格的商品信息
-
mysql>
select *
from product p
where p.price = (
select
max(price)
from product
where
num=p.num);
-
+
----+------+-------+-----+
-
| id | name | price | num |
-
+
----+------+-------+-----+
-
| 2 | 蒙牛 | 88 | 1 |
-
| 3 | nike | 888 | 2 |
-
| 6 | tom | 2888 | 3 |
-
+
----+------+-------+-----+
-
-
执行过程:
-
1.取出这个元组:| 1 | 伊利 | 68 | 1 | (传递“num=1”到子查询中)
-
2.select max(price) from product where num=1;
-
3.select * from produt p where p.price=88;
-
4.得到商品信息:| 2 | 蒙牛 | 88 | 1 |
-
5.依次取出接下来的元组然后执行1-4.
-
</div>