仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 851|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网页设计SQL Story摘录(二)――――连接查询初...

[复制链接]
乐观 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
目前的方案是用mysqlbinlog工具,增加一个Flashback参数,输出结果为一个新的binlog文件――姑且叫做flashbacklog,这个flashbacklog顺序执行,可制定某张表和执行到哪个pos,来实现数据库的闪回。
例1-2、键值反复的信息
如今看一下紧缩失落反复信息的PRODUCT表
IDPNAMEPRICENUMBERPDESCRIPTION
1Apple123000NULL
2Banana16.997600NULL
3Olive25.224500NULL
4CocoNut40.992000NULL
4Orange15.995500NULL
5Pineapple302500NULL
6Olive25.223000NULL

这里另有几个有成绩的中央。表中CocoNut和Orange的ID都是4,ID号为3和6的两种商品的品名(PNAME)都是Olive。而我们的原意明显是想要让每种商品对应一个ID号,并且表中的ID号和PNAME都应当是独一的。这个表中只要7行,我们能够间接察看,用肉眼发明成绩,表中数据量很年夜时呢?
如今我们回忆一下例1中查询反复数据的语句。我们用
……
GROUPBYID,PNAME,PRICE,NUMBER,PDESCRIPTION
对数据集举行了分组,并用
HAVINGCOUNT(*)>1
过滤出了反复的数据,依此类推,独自对ID列举行分组和过滤,可否找出ID反复的数据呢?试一试:
SELECTID
FROMPRODUCT
GROUPBYID
HAVINGCOUNT(*)>1
前往了局:
ID
-----------
4
如许却是呈现了我们所要的ID号,可这类报表其实没甚么实践意义,如今我们查一下这个ID究竟是谁:
SELECTID,PNAME,PRICE,NUMBER,PDESCRIPTION
FROMPRODUCT
GROUPBYID
HAVINGCOUNT(*)>1
这条语句实行堕落,很明显,ID号以后的四列既不在GROUPBY中,也是统计函数,它们不该该呈现在这里。而如许的语句:
SELECTID,PNAME,PRICE,NUMBER,PDESCRIPTION
FROMPRODUCT
GROUPBYID,PNAME,PRICE,NUMBER,PDESCRIPTION
HAVINGCOUNT(*)>1
前往的是一个空了局集:
IDPNAMEPRICENUMBERPDESCRIPTION
---------------------------------------------------------------------------------------------------



(所影响的行数为0行)
良多伴侣用子查询
SELECTID,PNAME,PRICE,NUMBER,PDESCRIPTION
FROMPRODUCT
WHEREIDIN(
SELECTID
FROMPRODUCT
GROUPBYID
HAVINGCOUNT(*)>1
)
来办理,我还见过一个用二级游标的例子(!?),那末没有更好的举措了吗?
我更喜好以下这行语句:
SELECTL.ID,R.PNAME,R.PRICE,R.NUMBER,R.PDESCRIPTION
FROMPRODUCTL
JOINPRODUCTR
ONL.ID=R.ID
GROUPBYL.ID,R.PNAME,R.PRICE,R.NUMBER,R.PDESCRIPTION
HAVINGCOUNT(*)>1
前往了局以下:
IDPNAMEPRICENUMBERPDESCRIPTION
4CocoNut40.992000NULL
4Orange15.995500NULL

利用连接查询,速率会比子查询快良多,由于不必每次用IN操纵在子语句中的了局会合搜刮数据。特别当表中数据良多,前往的了局集也很年夜时,其差别是相称惊人的。假如在多处置器,多硬盘的服务器上运转,连接查询还能够充实使用并交运算来进步效力。1999年炎天,IBM公司的工程师们在兰州年夜学列席天下数据库手艺集会时,向我们解说了使用并交运算手艺优化连接查询所带来的功能飚升。比拟之下,子查询在这方面有点亏损。有些壮大的数据库引擎会在得当的时分将子查询转化为连接查询,或反之。但把真谛把握在我们本人手中,不是更好吗?
固然,子查询并非必定比连接慢,无机会我也会演示一些子查询快于连接查询的例子,乃至有些子查询语句,用连接是很难完成的。实际来说,连接查询会天生一个迪卡尔积,这个汇合的巨细是构成它的各个子集的乘积。这会带来空间上的伟大开支(实践我们所见的数据库体系没有一个真这么干的)。而子查询的情形对照庞大。由天生的了局集来分,有标量子查询和向量子查询,(标量子查询指前往一个复杂数据的查询,这类子查询语句在MSSQLServer中能够间接做为内部查询语句的一列);由子查询与内部查询的干系来分,有相干子查询和非相干子查询(相干子查询的了局集取决于内部查询以后的数据行,非相干子查询反之)。一般相干子查询对照让人头痛,它必要重复实行子查询语句,若内部查询操纵的数据集(不是前往的数据集)行数为n,子查询操纵的数据集行数为m,那它的庞大度最上将是m的n次方!加上子查询数据集睁开带来的伟大空间开支,会极年夜影响速率。上例中的子查询对照侥幸,是一个有关的向量子查询,但即便云云,也要在运算中保留一个子了局集并对其重复操纵,并且难以并交运算,了局是它的速率不会比连接查询快。这也就是MySQL在很长工夫里一向不撑持子查询的缘故原由。在一般情形下,年夜数据集的操纵,连接查询的功能老是优于子查询,以是我们应该充实把握这一办法。
以例2中终极的连接查询为例,我们剖析一下编写这类连接查询的思绪。后面提到,在实际上,连接数据集时,会天生一个迪卡尔积。假如有一个表T的内容以下:
Word
----
a
b
那末实行“SELECTL.Word,R.WordFROMTASLJOINTASRONL.Word=R.Word”时,会师长教师成
L.WordR.Word
aa
ab
ba
bb

然后再实行“ONL.Word=R.Word”,将其过滤为
L.WordR.Word
aa
bb

在这里,我们就使用两头这个迪卡尔积做文章。假如PRODUCT表的ID列中数据切实其实是独一的,那对它做自连接后,就应当像方才看到的T表Word列一样,了局会合的ID也仍旧坚持独一。如今我们实行这个语句尝尝:
SELECTL.ID,R.ID,L.PNAME,R.PNAME
FROMPRODUCTL
JOINPRODUCTR
ONL.ID=R.ID
了局以下:
IDIDPNAMEPNAME
11AppleApple
22BananaBanana
33OliveOlive
44OrangeOrange
44CoconutOrange
44OrangeCoconut
44CoconutCoconut
55PineapplePineapple
66OliveOlive

注重到了吗?底本反复两次的ID号4,如今,反复了4次。这是因为CocoNut和Orange两行ID号反复,迪卡尔积为其平方,没法为连接前提过滤。以是,我们对这个了局集按个中一个子集的ID字段和另外一个子集的别的字段举行分组后,ID为4的数据被分为两组,每组两行,而一般数据每组仅为一行。就能够找出ID反复的数据,乃至我们还能够晓得它反复了几回!请看上面的SQL语句:
SELECTL.ID,R.PNAME,R.PRICE,R.NUMBER,R.PDESCRIPTION,COUNT(*)ROW_COUNT
FROMPRODUCTL
JOINPRODUCTR
ONL.ID=R.ID
GROUPBYL.ID,R.PNAME,R.PRICE,R.NUMBER,R.PDESCRIPTION
HAVINGCOUNT(*)>1
前往了局:
IDPNAMEPRICENUMBERPDESCRIPTIONROW_COUNT
4Coconut40.992000NULL2
4Orange15.995500NULL2

(所影响的行数为2行)
这类布局上的可扩大性也一样是子查询所不及的,同时它也会带来一些风趣的附效应,有好有坏,这就要到前面的章节会商了。
一样,用
SELECTR.ID,L.PNAME,R.PRICE,R.NUMBER,R.PDESCRIPTION,COUNT(*)ROW_COUNT
FROMPRODUCTL
JOINPRODUCTR
ONL.PNAME=R.PNAME
GROUPBYR.ID,L.PNAME,R.PRICE,R.NUMBER,R.PDESCRIPTION
HAVINGCOUNT(*)>1
语句,就能够找出PNAME列反复的数据及其反复次数:
IDPNAMEPRICENUMBERPDESCRIPTIONROW_COUNT
3Olive25.224500NULL2
6Olive25.223000NULL2

(所影响的行数为2行)
经由下面的两个例子,我们能够看到,更深切地懂得干系型数据库的运转机制,纯熟使用复杂查询和连接查询,能够无效地进步程序的功能及可保护性,下降代码庞大度。何乐而不为呢?
InterBase中没有Money数据范例,以是在InterBase中创立PRODUCT表时,记得把PRICE字段界说为别的的范例,这里我用的是NUMERIC(8,4)。别的,InterBase中另有一个成绩,实行以下语句删除反复数据时:
DELETEFROMPRODUCT
WHEREIDIN(SELECTID
FROMPRODUCT
GROUPBYID,PNAME,PRICE,NUMBER,PDESCRIPTION
HAVINGCOUNT(*)>1)
实际来说,它应该把两行“Apple”全都删失落,MSSQLServer2000就是如许做的。可它只删失落了个中一行!实行后的表中数据以下:
IDPNAMEPRICENUMBERPDESCRIPTION
1Apple12.00003000NULL
2Banana16.99007600NULL

明显,它在删除一行数据后,又从头查询了数据表偏重新决意下一行要删除的数据。关于干系型数据库来讲,这不是一个功德,既不松散,也不幽美。不外详细到这个语句,却是一个功德,我们只用一条删除命令就完成了本应分几回操纵的数据兼并。InterBase中,另有相似的一些中央,并没有像MSSQLServer那样,完成真实的汇合操纵。在今后的例子中我会随时提到。在实践事情中人人也要注重。
我利用的InterBase6.0.1是一个能够收费取得的开放源码的数据库,而MSSQLServer是微软的掌上明珠,MSSQLServer7的计划者曾取得1998年的图灵奖。我不能不供认这个轻便快速的InterBase是一个让人惊叹的好器材,它完成了诸如级联更新如许一些MSSQLServer直至2000版才到场的壮大功效,固然它也有其不尽善尽美的地方。不外思索其性价比,我们真的不克不及请求更多了。别的倡议老手借此时机懂得一下一时表的利用。这里未几占篇幅了。
Mysql的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎。
莫相离 该用户已被删除
沙发
发表于 2015-1-19 06:31:52 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
老尸 该用户已被删除
板凳
发表于 2015-1-26 06:04:37 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
柔情似水 该用户已被删除
地板
发表于 2015-2-4 13:38:32 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-10 00:22:28 | 只看该作者
如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。
谁可相欹 该用户已被删除
6#
发表于 2015-2-28 10:38:44 | 只看该作者
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
深爱那片海 该用户已被删除
7#
发表于 2015-3-9 22:45:58 | 只看该作者
比如日志传送、比如集群。。。
飘飘悠悠 该用户已被删除
8#
发表于 2015-3-17 03:06:20 | 只看该作者
我个人认为就是孜孜不懈的学习
不帅 该用户已被删除
9#
发表于 2015-3-23 17:58:40 | 只看该作者
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-7 01:29

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表