>  기사  >  백엔드 개발  >  select的执行顺序有关问题

select的执行顺序有关问题

WBOY
WBOY원래의
2016-06-13 12:12:24867검색

select的执行顺序问题

本帖最后由 php_way 于 2014-12-20 09:17:09 编辑 一张商品表tp_goods:
mysql> select * from tp_goods;
+----+-----------------------+-------------+--------------+--------+
| id | goods_name            | goods_price | market_price | cat_id |
+----+-----------------------+-------------+--------------+--------+
|  1 | 锤子手机t1白色版32G       |     1998.00 |      2488.00 |      1 |
|  2 | 联想E431笔记本                |     4029.00 |      4998.50 |      2 |
|  3 | mysql数据库深入浅出         |       29.80 |        36.30 |      4 |
|  4 | 苹果6 plus新加坡版             |     2998.00 |      6299.00 |      1 |
|  5 | OSA女装羽绒服2014新款  |      538.50 |      1510.00 |      3 |
+----+-----------------------+-------------+--------------+--------+

根据网上资料
mysql> select cat_id,goods_name,goods_price from tp_goods where cat_id=1;
先执行from操作,得到虚拟表VT1 ——> 然后执行where操作,筛选出cat_id=1的所有行,得到虚拟表VT2。此时的列,还是tp_goods表中所有的列 ——>最后执行 select 操作,此时列是 cat_id, goods_name, goods_price的列,结果返回。
-----------------------------------------------------------------------
mysql> select cat_id,max(goods_price) as max_price from tp_goods group by cat_id;
问题:
1. 这条语句又是如何执行的,group by 和 max函数是同时执行的吗?
2. group by 和 select 又是谁先执行?
------解决思路----------------------
1.group by 優先
2.group by 優先

where > group by > 聚合函數 > select
------解决思路----------------------
你理解的执行顺序是错误的,至少是不科学的
如果 tp_goods 有 10000000 条记录,而符合 cat_id=1 的只有一条
那么你的第一步的抄写 tp_goods 到 VT1 不就浪费了大量时间和空间了吗?

所以应该是:
建立虚拟表 VT(只有 cat_id,goods_name,goods_price 3列)
遍历 tp_goods 将符合 cat_id=1 的记录追加到 VT 中
输出 VT 的内容

对于 select cat_id,max(goods_price) as max_price from tp_goods group by cat_id
执行的过程应该是:
建立虚拟表 VT(只有 cat_id, max_price 2列,并标识 cat_id 为聚类, max_price 为计算)
遍历 tp_goods 将记录追加到 VT 中,方法是如果 tp_goods.cat_id 的值在 VT.cat_id 中已存在。则修改对应的 max_price 为 max(goods_price,max_price),否则追加
输出 VT 的内容


------解决思路----------------------
1.from子句用来组装不同数据源的数据2,where子句用于基于指定条件的筛选3.group by 子句用来将数据划分为多个分组4,使用聚集函数进行计算5.使用having子句对分组进行筛选6.计算所有表达式7.使用order by 对所有结果集进行排序
遇到上面括号的情况,当然是按照括号内部再如上述优先级执行。

------解决思路----------------------
跑个题:你那表里的  苹果6 是真的么?
------解决思路----------------------
特意去翻查了《高性能MySQL》(第二版),没找到楼主说讲的查询顺序的相关描述。希望以下截图能给楼主一些帮助。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.