Heim  >  Artikel  >  Backend-Entwicklung  >  select的执行顺序有关问题

select的执行顺序有关问题

WBOY
WBOYOriginal
2016-06-13 12:12:24862Durchsuche

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》(第二版),没找到楼主说讲的查询顺序的相关描述。希望以下截图能给楼主一些帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:thinkphp暗藏中url的index.phpNächster Artikel:VPS用LNMP装配WordPress