相关子查询和嵌套子查询两者之间的区别

相关子查询和嵌套子查询两者之间的区别

表的结构如下:

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的条件控制输出主查询的结果。

相关子查询:执行依赖于外部查询。

执行顺序:先是主查询然后在是子查询。

执行过程

  1. 从主查询中取出一个元组(表中的行),将元组相关的列的值传递给子查询
  2. 子查询将列的值作为条件得到结果
  3. 主查询根据子查询得到的结果或者结果集得到满足条件的行,selece控制显示
  4. 然后主查询取出下一个元组继续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.

猜你喜欢

转载自blog.csdn.net/qq_38238296/article/details/86251165
今日推荐