书是肯定有的,估计应是1990年代的。不过我没看过(给我看我也不一定去看)按流程推演,用 php 的关联数组都可以简单的模拟出那个过程 mysql 的开发者们总不至于弱智到用你听说的那个流程来操作的吧
怎么模拟的? 所以,我想知道mysql开发者们在程序里是如何操作的按版主的说法,是不是只产生一张虚拟表?如果语句中存在多个 select 呢,会不会有多个虚拟表?如: select * from tp_goods where cat_id=(select id from tp_cat where cat_name='手机'); 版主是否举一个比较复杂的语句,包含where, group by, having, orderby....等等的,来解释一下它第一步的执行过程?
1.from子句用来组装不同数据源的数据2,where子句用于基于指定条件的筛选3.group by 子句用来将数据划分为多个分组4,使用聚集函数进行计算5.使用having子句对分组进行筛选6.计算所有表达式7.使用order 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 的内容
mysql 的开发者们总不至于弱智到用你听说的那个流程来操作的吧
所以,我想知道mysql开发者们在程序里是如何操作的按版主的说法,是不是只产生一张虚拟表?如果语句中存在多个 select 呢,会不会有多个虚拟表?如:
select * from tp_goods where cat_id=(select id from tp_cat where cat_name='手机');
版主是否举一个比较复杂的语句,包含where, group by, having, orderby....等等的,来解释一下它第一步的执行过程?
遇到上面括号的情况,当然是按照括号内部再如上述优先级执行。