|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我们只需要把binlog文件反向执行,每个操作都执行逆操作即可。当然也不是所有的event都反转。Table_mapevent必须还是在Rows_log_event每个操作之前。写这本书的最后设法,来自于在第一个公司事情时,与同事的交换和进修。不外公布这本书的导火索,却在于一次在CSDN上读到一篇关于最新信息的报表成绩的贴子。贴子中的成绩能够用子查询和连接两种体例完成。因为前提所限,我不克不及具体解答,由此发贴的伴侣不克不及了解我的本意,让我心生遗憾。以是决意将写书的设法付诸举动,并将这本书贴在CSDN上,与人人一同交换,配合前进。明天恰好又见到相似于当日的成绩,心生感到,决意在这里把它具体会商一下。
在实践事情中,我们偶然会必要创建数据表来存储变化的数据,并由这些数据统计出我们所需的信息。个中有一类成绩的特性在于终极了局的过滤前提来自分组统计后的数据。这类使用罕见于网站数据库、财会体系、及时体系、数据堆栈与数据发掘等。现实上,这类命题自己已包含了数据发掘。如今,我们看上面的例子
例4-4-1:最新报价
网友kikilyq问:
我有一个table:COMPUTER_PRICE,格局以下:
goodspricedates
--------------------------------
HP电脑200005.21
HP电脑200505.23
NEC电脑312005.3
NEC电脑320005.5
查询了局请求:要查出每种电脑的最新代价;
下面表的了局为:
goodspricedates
---------------------------------
HP电脑200505.23
NEC电脑320005.5
帮协助,弄定这个成绩?
依据成绩,我们先创建数据表,经剖析,表中数据应由货品名和日期标示,以是设这两个字段为主关头字:
SQLServer版剧本以下
CREATETABLE[dbo].[GOODS](
[GOODS][char](10)COLLATEChinese_PRC_CI_ASNOTNULL,
[PRICE][money]NOTNULL,
[DATE_TIME][datetime]NOTNULL,
PRIMARYKEY(GOODS,DATE_TIME)
)ON[PRIMARY]
InterBase版剧本以下
CREATETABLEGOODS
(
GOODSCHAR(10)NOTNULL,
PRICENUMERIC(15,4)NOTNULL,
DATE_TIMETIMESTAMPNOTNULL,
PRIMARYKEY(GOODS,DATE_TIME)
)
创建表后,请读者自即将数据拔出。
这个成绩中,终极报表中的电脑的代价取决于厥后一次报价,也就是报价日期最新的那一行数据。典范地属于后面提到的范例。直觉来说,我先试着选出每种电脑的最新报价日期,这个对照复杂:
SELECTGOODS,MAX(DATE_TIME)
FROMGOODS
GROUPBYGOODS
前往了局
GOODS
----------------------------------------------------------------
HP2002-05-2300:00:00.000
NEC2002-05-0500:00:00.000
明显,只需把各品牌电脑在以上日期的报价显现出来,就是我们所要的了局了。那末间接这么写怎样?
SELECTGOODS,PRICE,MAX(DATE_TIME)
FROMGOODS
GROUPBYGOODS
我想这个语句就不必试了,稍有履历的程序员会发明,PRICE列不在统计函数中,也不在GROUPBY之列,数据库体系没法实行如许的语句。如许的列必定要从另外一个数据会合掏出,以是我起首想到的是自连接。不外信任年夜多半伴侣会先想到子查询。如今我们先看看子查询怎样做,究竟如许对照直不雅。最偷懒的举措是间接把PRICE表达为一个拔出的标量子查询:
SELECTL.GOODS,
(SELECTR.PRICEFROMGOODSRWHERER.GOODS=L.GOODSANDR.DATE_TIME=MAX(L.DATE_TIME))ASPRICE,
MAX(L.DATE_TIME)ASCURRENT_DATE_TIME
FROMGOODSL
GROUPBYL.GOODS
不外很遗憾,这个语句只能在SQLServer中实行,InterBase的提醒是invalidcolumnreference(有效的列援用)。不外换一个思绪就能够写一个通用版。如今,我们对体系说,我要从表中掏出部分行,每一个品牌的电脑一行,其日期是这个牌子的最新报价日期:
SELECTL.GOODS,L.PRICE,L.DATE_TIME
FROMGOODSL
WHEREL.DATE_TIME=
(SELECT
MAX(R.DATE_TIME)
FROMGOODSR
WHERER.GOODS=L.GOODS
GROUPBYR.GOODS)
这个
我想应当还能够写出几个分歧的子查询变种,不外迥然不同,就纷歧一实验了。这个版本看来有些不成靠,由于主查询的WHERE前提中只要DATE_TIME,仿佛不克不及正确区域分出每行数据。不外宁神,这里有一个“诡异”的互相援用,主查询的纪录要满意日期即是子查询的前往值,而子查询的货品名(GOODS列)依附于主查询的货品名(GOODS列)。如许,子查询会针对以后的品牌前往其准确日期,这是相干子查询的特技,也是形成它在良多场所效力较差的缘故原由。我对子查询的乐趣到此为止了,后面的文章中我说过,连接查询是一种很好的手艺,那末这个查询有无大概用连接来完成呢?后面对子查询的剖析在这里会有助于我们的思索。如今我们假如有两个数据集,一个有最年夜日期,一个有代价,把它们一连接,不就能够了吗?这两个了局集就在下面的子查询中,如今的成绩是我们怎样把它们连接起来,明显,有一个连接前提是R.GOODS=L.GOODS,这同时也断定了终极了局集的独一标识之一――GOODS列,而日期列的过滤前提照搬L.DATE_TIME=MAX(R.DATE_TIME),加上GROUPBY了局会合的列,因而就有了:
SELECTL.GOODS,L.PRICE,L.DATE_TIME
FROMGOODSL
JOINGOODSR
ONL.GOODS=R.GOODS
GROUPBYL.PRICE,L.GOODS,L.DATE_TIME
HAVINGL.DATE_TIME=MAX(R.DATE_TIME)
有些伴侣大概不分明这个GROUPBY为什么而来,复杂说一下。我们做了一个GOODS表的自连接(两个数据集分离是L和R)后,会天生一个迪卡尔积。有些人称之为数据爆炸。不外把矿石炸开以后,倒便利我们在个中找金子了。用JOIN前提一连接,L数据会合的每种品牌在R数据会合都对应上了本人的一切报价日期。如今我们要对R数据集分组,选出每品牌的最新报价日期,以其过滤L数据集就应当用
GROUPBYR.DATE_TIME
HAVINGL.DATE_TIME=MAX(R.DATE_TIME)
因为我们要掏出L数据会合的三列,以是要把它们也列在GROUPBY中,因为已有了L.GOODS=R.GOODS这个连接前提,R.GOODS却是能够不写在GROUPBY中了。因为我在后面的文章中提到过的各种来由,我团体对照喜好用连接。固然从效力方面讲,当表中每一个分组的数据良多时,连接查询的效力会因伟大的迪卡尔积而被抵消,这时候使用子查询(假如这是一个纪录临盆线立即事情情形的表,统计其最新的临盆情形,一般就是如许);而表中每一个分组的数据很少,但数据组良多(如年夜型网上书店,用户多是一个地理数字,绝对来讲每一个用户买的书就未几了)时,子查询仍要为主查询的每行重复遍历全部表,效力就太低了,而连接只需处置事前天生的迪卡尔积,以空间上的价值换来了工夫上的上风,这时候应该用连接查询。
以上各类计划的前往了局集都是:
GOODSPRICEDATE_TIME
-------------------------------------------------------------------------------------
HP20050.00002002-05-2300:00:00.000
NEC31000.00002002-05-500:00:00.000
除出格指明,以上剧本可在MSSQLServer7.0以上版本和InterBase6.0.1以上版本通用。把握以计划以上剧本的办法,能够普遍用于各类以统计数据为查询前提的SQL编程。由此入手下手,我们还能够就两个风趣的方面睁开会商:连接查询和数据分组。
附:原本这个连接查询剧本还应该贴在kikilyq的成绩前面,不外因为我愚昧地贴了两个不应贴的贴子(一个有错,一个贴重了),CSDN的网页不同意我再往kikilyq的贴子后跟贴了。请kikilyq来这里读吧。抱愧。
关于《SQLStory》:这本书意在提出一些罕见的SQL编程成绩的办理计划,总结出一些干系型数据库计划和SQL言语编程方面的形式,经由过程实践成绩,匡助读者进步数据库编程的才能,本书还会浏览干系代数的实际范畴。我企图在CSDN上搜集一些典范的SQL编程成绩,做为本书的主要内容。作者包管不抄袭任何人的休息功效,一切解答及剖析毫不假手于人。若有妙手指导迷津,我必定会在文中明白指出并提出感激。接待列位网友供应素材,在此先暗示感谢。别的我但愿能有一名Oracle妙手与我互助,完成这本书的Oracle部分。与我分享乐成的高兴和休息的艰苦。
以下是我开端制定的《SQLStory》大纲,也就是说,如今各篇文章的例题届时会分门别类呈现在这本书的符合地位,大概如今的序号编排会有变化。
媒介第一章基础准绳1、编码之前2、编码准绳3、SQL剧本计划准绳第二章干系型数据库的原形1、向量空间中的汇合2、汇合中的信息3、汇合运算4、实在的天下第三章不复杂的复杂查询1、选择信息2、前提过滤3、有序与无序4、信息统计与数据发掘第四章空间的“乘法”――连接查询1、迪卡尔积与信息爆炸2、更高维度的空间3、连接查询4、Join与Where第五章SQL“从句”――子查询1、从句语法2、价值评价3、活用子查询第六章汇合的写操纵――Inert、Delete和Update1、计划办法2、删除3、拔出4、改写第七章最终兵器――游标1、游标的为何2、游标的怎样办3、游标绝技4、历程化编码第八章不成能的义务1、兴趣成绩集锦2、无穷点集3、无穷信息集4、探究汇合第九章不但是SQL――数据库办理1、公道的索引2、耐久存在的代码――存储历程、存储函数和触发器3、视图用法4、数据存储的公道体例跋文附:另类声响
这里我们讨论用binlog来实现闪回的方案。 |
|