MySQL temptable模式和merge模式的区别,哪个好

MySQL temptable模式和merge模式的区别,哪个好,第1张

使用视图的两种算法merge和temptable分别统计

表tb_phone中market_price大于4000的手机,然后查询视图查找出小于6000的手机

简单总结最终获取的结果:查询出market_price大于4000且小于6000的手机

表数据:

merge合并算法

合并的执行方式,每当执行的时候,先将视图的sql语句与外部查询视图的sql语句,合并在一起,最终执行.

以下是使用常规select语句模拟合并算法:

执行结果模拟与算法的结果相同:

temptable临时表算法

先执行视图再执行其他 *** 作的查询

临时表模式,每当查询的时候,将视图所使用的select语句生成一个结果的临时表,再在当前的临时表内进行查询

以下是使用常规select语句模拟临时表算法:

执行结果模拟与算法的结果相同:

比较两种算法结果也相同,似乎是这样的,接下来的实例将不同

实例2

使用视图的两种算法merge和temptable分别统计

表tb_phone , 同类(cid)手机的最高价格(market_price)的产品

表数据:

首先可以考虑基本select语句的实现方式(这里就不再赘述):

先排序再分组

接下来使用两种算法:

merge合并算法

最后一句select模拟合并算法有语法错误的,order by 不能在 group by之前,这时执行会报错,但在视图中不会报错,而是直接跳过了错误部分order by 直接执行了

select * from tb_phone group by cid

最终结果(错误):

temptable临时表算法

发现执行结果与普通语句相同,模拟的语句同样正确

最终结果(正确):

CREATE TABLE SALE_REPORT (

SALE_DATE DATETIME NOT NULL ,

SALE_ITEM VARCHAR(2) NOT NULL ,

SALE_MONEY DECIMAL(10,2) NOT NULL

)

DELIMITER //

CREATE PROCEDURE CreateReportData()

BEGIN

DECLARE v_begin_day DATE

DECLARE v_end_day DATE

SET v_begin_day = STR_TO_DATE('2009-01-01', '%Y-%m-%d')

SET v_end_day = STR_TO_DATE('2013-01-01', '%Y-%m-%d')

WHILE v_begin_day < v_end_day DO

INSERT INTO SALE_REPORT VALUES

(v_begin_day, 'A',

Year(v_begin_day) )

INSERT INTO SALE_REPORT VALUES

(v_begin_day, 'B',

Month(v_begin_day) )

INSERT INTO SALE_REPORT VALUES

(v_begin_day, 'C',

DAY(v_begin_day) )

SET v_begin_day = DATE_ADD(v_begin_day, INTERVAL 1 DAY)

END WHILE

END

//

DELIMITER

call CreateReportData()

使用模拟的 ROW_NUMBER + PARTITION 的方式

SELECT

sale_item,

sale_date,

sale_money

FROM

(

SELECT

CASE

WHEN @cn != sale_item THEN @rownum:= 1

ELSE @rownum:= @rownum + 1

END AS No,

@cn := sale_item AS sale_item,

sale_date,

sale_money

FROM

(SELECT @rownum:=0) r,

(SELECT @cn:='') p,

SALE_REPORT

ORDER BY

SALE_ITEM,

SALE_DATE DESC

) subQuery

WHERE

no <=3

+-----------+---------------------+------------+

| sale_item | sale_date | sale_money |

+-----------+---------------------+------------+

| A | 2012-12-31 00:00:00 |2012.00 |

| A | 2012-12-30 00:00:00 |2012.00 |

| A | 2012-12-29 00:00:00 |2012.00 |

| B | 2012-12-31 00:00:00 | 12.00 |

| B | 2012-12-30 00:00:00 | 12.00 |

| B | 2012-12-29 00:00:00 | 12.00 |

| C | 2012-12-31 00:00:00 | 31.00 |

| C | 2012-12-30 00:00:00 | 30.00 |

| C | 2012-12-29 00:00:00 | 29.00 |

+-----------+---------------------+------------+

9 rows in set (0.02 sec)

wow单机版一般还需要你安装MySQL的管理工具的,例如navicat之类,里面就有时间查看器啊之类的东西了,用那个就可以执行了。还是去弄一个一键的安装版吧。那个SQL脚本太多了,一个个打你要整死的。

好了分给我吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7168770.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存