电脑桌面
添加蜗牛文库到电脑桌面
安装后可以在桌面快捷访问

人生哲理小品十篇精妙语句

栏目:合同范文发布:2025-01-29浏览:1收藏

人生哲理小品十篇精妙语句

第一篇:人生哲理小品十篇精妙语句

人生哲理小品十篇精妙语句 2010-04-13 23:45:40 阅读13 评论0 字号:大中小.每个人的人生都不相同,而我相信,下面的这些内容会对你的人生有所帮助,特别是对人生迷茫的同学。

1、站在烦恼里仰望幸福

幸福总围绕在别人身边,烦恼总纠缠在自己心里,这是大多数人对幸福和烦恼的理解。差学生以为考了高分就可以没有烦恼,贫穷的人以为有了钱就可以得到幸福。结果是,有烦恼的依旧难销烦恼,不幸福的仍然难得幸福。

烦恼,永远是寻找幸福的人命中的劫数。

另一类人也像在登山,但他们并不刻意要登到哪里。一路上走走停停,看看流岚,赏赏虹霓,吹吹清风,心灵在放松中,得到某种自足。

尽管不得大愉悦,然而,这些琐碎而细微的小自在,萦绕于心扉,一样芬芳身心,恬静自我。

有的人本来幸福着,却看起来很烦恼;有的人本来该烦恼,却看起来很幸福。

活得糊涂的人,容易幸福;活得清醒的人,容易烦恼。这是因为,清醒的人看得太真切,一较真,生活中便烦恼遍地;而糊涂的人,计较得少,虽然活得简单粗糙,却因此觅得了人生的大滋味。

所以,人生的烦恼是自找的。不是烦恼离不开你,而是你撇不下它。

这个世界,为什么烦恼的都有。为权,为钱,为名,为利,人人行色匆匆,背上背着这个沉重的布囊,装得越多,牵累得也就越多。

几乎所有的人都在追逐着人生的幸福。然而,就像卞之琳《断章》诗所写的那样,我们常常看到的风景是:一个人总在仰望和羡慕着别人的幸福,一回头,却发现,自己正被别人仰望和羡慕着。

其实,谁都是幸福的。只是,你的幸福,常常感受在别人心里。

2、时间的步子

我坐在老屋的大门口,看屋檐角滴下的雨点,仿佛看见了时间的身影。人生命的长短是用时间来衡量的,谁都希望长寿,但时间总是不答应,它依然按照自己的节拍行走,且从来不失却公平。

年轻时,时间的步子要慢得多,尤其是童年,总是留下比较多的回忆。年岁越高,日子过得越快,才知道要节约。可是,却挽不住时间匆匆的脚步。时间是高利贷者,如果你要时间预先支付,他日必会付出最昂贵的代价。简单地说,人一宿不睡觉,并不是睡一宿就能还清的。

最好是不紧不慢。站在桥下,看江水奔流,一边是现在,一边是过去。只有桥是现在。逝者如斯夫!人不免要感到悲哀。可是话说回来,真要是有大把的闲暇,无所事事,又觉得无聊的侵袭。闲暇对忙碌者是沙漠的甘泉,对无聊者是折磨的负累。

人对新鲜的事物充满好奇,因而印象深刻。对重复的东西,熟视无睹,不愿调动更多的精力予以关注。人们总认为时光在加速行进,不过是一种错觉罢了。童年慢,老年快,童年做加法,老年做减法,对谁都是一样。

和时间赛跑,只会受到时间的嘲笑。把时间当海绵用力挤压,实际上是一种透支。信贷消费花明天的钱,过今天的日子,时间可不可以信贷呢?或者把现在切割得很细小,塞满人生的悲欢离合?时间可以任你切割,但它的长度和节奏你无法更改。

你可以向别人借金钱,却不可以借时间。如果你强行剥夺别人的时间,就等于谋财害命。谋财害命也不能增加自己的时间,这又何必呢?

不管世界上的事物有多么复杂,在时间的面前,他们都是运转的钟。太阳是钟,日出日落分出白天黑夜。树木是钟,一枯一荣就是寒暑更替。人就是钟,一生一世记录不同时代的生活。人在旅途,含辛茹苦,时间会使我们了解事物,看事物很清楚吗?

科学上的时间是慢不下来的,心理上的时间却能够调整。让日子像童年那般新鲜!让生命像树木一样生长!

3、生命的长度与密度

若按岁计算,人生也不过两万五千多天,可是我还是要计算

有一位朋友问我一个问题,并要求我不假思索地答出。他说:人的一生有没有万天?“

我说肯定有吧。我想,万元钱一天就可挣回,一天也可花掉。人的一生岂能没有万天?可朋友说:”否“

于是细算,果然:人生七十古来稀,若按岁计算,人生也不过两万五千多天,连万天都不到!难怪罗大佑的《凡人歌》唱道:”人生何其短,何必苦留恋。“

生命如此短促,我们每个人不过是一颗流星。算一算,出生在上世纪六十年代末的我,如果能战胜七病八灾有幸终老,死后墓志铭上最多写上这么一段:1969-2050年。前面是古人,后面是来者,我与他们无缘谋面。

生命来之不易,而又魅力无穷。每个生命的孕育都经过了与几亿个对手的竞争,每个都曾是他双亲怀里的至爱。忙碌的人生就像一辆快速奔跑的战车,疾病、痛苦、嫉妒、诅咒都是两旁嗖嗖作响的子弹。可我们不能停止,还要顽强地活下来,最终站到胜利的山巅与尊严握手。

这本身就是一部可歌可泣的英雄史诗。但生命是有长度的,它因人而异。我确信生命的长度取决于它的密度。--想到这一点,我才明白我之所以羡慕那些艺术家的原因:他们总是更醉心于关注他人和自己的人生和命运,他们也更乐于表现、展示、美化、创造那些富于个性魅力和共同命运的人生,他们其中甚至有很大的一部分,是以自己仅有的一次生命深投其中,无怨无悔。像海明威、巴尔扎克、贝多芬、凡]……他们生命的密度因此而加大,闪烁出金刚钻般坚韧的光泽,而被他们赋予灵魂的艺术则更接近于永恒。

还有那些终日勤勉于工作的人。那些也许并不懂得美学和艺术而朴素诚实的人,谁能说他们的生命没有意义,是空虚的外壳呢?

你我皆凡人,但我们的生命仍然可以”加密“。当我们最大限度地投入我们的智慧和热情,让我们的身体和灵魂都像果实饱满的庄稼;当我们积极地面对人生种种不测,执著于信仰;我们又何尝要担忧岁月的转瞬即逝,又何尝不可能骄傲地说,我爱过,梦想过,生活过呢?

珍惜生命,死而无憾。

4、残酷的现实

一位父亲去拜访他在一家公司的好朋友。下面是他们之间的对话。

”你还是这家公司的副总裁吗?“

”是啊,怎么了?“ ”我儿子刚刚毕业,我希望让他接受点锻炼,丰富一下人生经历,同时开始赚点小钱。“ 如果你需要,我可以帮忙。” 当然。我希望他能从点点滴滴做起,对劳动和金钱形成正确的看法。“

”那好……我想可以让他去当总经理。总经理不需要做任何具体的事情,我让他来的时候他来一下,随便说些无关痛痒的废话。工资每月8万比索,有奖金,公司还负责报销一些日常花销。可以吗?“

”嗯,不好,那可是一大笔钱啊,而且职位太高了。还有别的吗?“

”那就项目主管吧。工作就是批示一下下级交上来的汇报书以及做一些别的琐事,工资每月5万比索,有奖金,还有餐饮和差旅补贴。“

”也不好,要知道他刚参加工作,还有低些的职位吗?“

”那……部门经理吧。每天给员工下达些指令,训训话什么的,每月工资3.8万比索,有奖金和差旅费,还有带薪休假。“

”嗯……还有更低层些的吗?“

”项目负责人或是主管分析师、财务执行官也可以。工资每月3.2万比索,还有奖金。做的事情也很简单:打几个电话,时不时地同来访的客户聊聊天。“

”不,我想让他多学点东西,珍惜劳动。还有别的吗?“

”哦,这样吧,我让他去当办公室副主任,帮助办公室主任管理下面的分析员,监督他们工作。每月工资2.2万比索,工作时间朝九晚五。你觉得呢?“

”算了。还有更基层的工作吗?“

” 那就只剩工程人员和会计了。这两个职位需要掌握很多金融和规划方面的知识,整天同经理、项目主管和客户打交道。加班是家常便饭,没有加班费,成绩还往往是别人的。工资是最低的8500比索,每天辛苦工作12到13个小时,只有半小时的时间可以用来吃饭,而且每天都要拿工作回家干。“

”噢……这些活真是费力不讨好,不过,的确可以让我儿子从中学点东西。能让我儿子干这活吗?“

”不可能!做这件事的人,他必须最起码是硕士,会讲流利的英语和法语,还要有足够的相关工作经验才行!“

5、宽窄都是路

无论处于任何时间、法象里面,生命都是独一无二的。这颗葡萄和昨天吃的那颗葡萄并不一样,这杯酸梅汤和我15岁去台北在中华路喝的那一杯也有所不同,因此不必刻意用过去的经验与眼前做比较。

一般人都喜欢拿过去和现在相比较,连吃一盘蛋炒饭也会认为昨天那一家炒的好吃些。禅宗注重”异“,人们都用过去的经验在生活,他们最无法开悟的一点就是”同“。不能开悟,许多痛苦就此产生。

若能了解自己的每一分每一秒都是不同的,不需要拿任何一秒钟做标准,你就会生活得很好。无论你是独自处于非洲大沙漠的烈日之下,或者和朋友一起待在舒适的冷气房里,都没有什么差别,每一个点都是生命的一部分,加起来才等于你整个的生命。

有一年我获得了”杰出青年奖“,香港《东方日报》的总编希望我写一篇文章。

”我写什么呢?“我问。

”写崎岖的道路。“

”那是什么?“

”你的成功史。写你如何达到今日的成功之境。“

”我不能写。因为我的人生中没有崎岖的道路,对我而言,无论什么情况都是很好的。“

如果我走在崎岖的小径上,我就用崎岖小径的心去欣赏它;如果走在林荫大道上,我就从林荫大道的角度去品尝。我不认为林荫大道就优于崎岖小径,一旦真正了解生命的意义,事物就没有好坏之别。

不论剩下多少水,我只想”我还有水“,而不去在意水的多少。我画过一幅漫画:黄河的源头是生,出海口是死,它整个生命的过程当然有时细水长流,有时波涛澎湃,有时顺畅,有时受阻;有时宽,有时窄;我在宽时品尝宽,在窄时品尝窄;在逆时面对逆,在顺时享受顺。我不愿自己的生命从头到尾一样宽畅、平凡。

6、年轻时你想砍哪棵树?

上大学时,有一次我们去一位老教授家做客,那时正年轻,豪情无限高谈阔论,仿佛世间之事无所不能。老教授一直微笑着倾听,不参与我们的种种话题。

待大家热情一过,老教授提出要做个测试,我们顿时都来了兴致。老教授问:”如果你去山上砍树,正好面前有两棵树,一棵粗,另一棵较细,你会砍哪一棵?“ 问题一出,大家都说:”当然砍那棵粗的了!“老教授一笑,说:”那棵粗的不过是一棵普通的杨树,而那棵细的却是红松,现在你们会砍哪一棵“我们一想,红松比较珍贵,就说:”当然砍红松了,杨树也不值钱!“

老教授带着不变的微笑看着我们,问”那如果杨树是笔直的,而红松却七歪八扭,你们会砍哪一棵“我们觉得有些疑惑,就说:”如果这样的话,还是砍杨树,红松弯弯曲曲的,什么都做不了!“老教授目光闪烁着,我们猜想他又要加条件了,果然,他说:”杨树虽然笔直,可由于年头太多,中间大多空了,这时,你们会砍哪一棵?“

虽然搞不懂老教授的葫芦里卖的什么药,我们还是从他所给的条件出发,说:”那还是砍红松,杨树都中空了,更没有用!“老教授紧接着问:”可是红松虽然不是中空的,但它扭曲得太厉害,砍起来非常困难,你们会砍哪一棵?“我们索性也不去考虑他到底想得出什么结论,就说:”那就砍杨树,同样没啥大用,当然挑容易砍的砍了!“老教授不容喘息地又问:”可是杨树之上有个鸟巢,几只幼鸟正躲在巢中,你会砍哪一棵?“

终于,有人问:”教授,您问来问去的,导致我们一会儿砍杨树,一会儿砍红松,选择总是随着您的条件增多而变化,您到底想告诉我们什么、测试些什么呢?“老教授收起笑容,说:”你们怎么就没人问问自己,到底为什么砍树呢?虽然我的条件不断变化,可是最终结果取决于你们最初的动机。如果想要取柴,你就砍杨树,想做工艺品,就砍红松。你们当然不会无缘无故提着斧头上山砍树了!“

听了这番话,我们心中似都有所感悟,可一时又抓不住什么。老教授看着我们说:”刚才听你们纵论天下之事,似乎无所不在话下。可是,当你们踏上社会之后,当许多事摆在眼前,你们便只顾着去做那些事,往往于各种变数中淡忘了初衷,所以也就常常会做些没有意义的事。一个人,只有在心中先有了目标,先有了目的,做事的时候才不会被各种条件和现象所迷惑,才不会偏离正轨。这就是我的测试,也是我想要告诉你们的!“

7、给别人留有余地

韩国北部的乡村公路边有很多柿子园,金秋时节正是采摘柿子的季节,当地的农民常常会留一些成熟的柿子在树上,他们说,这是留给喜鹊的食物。

经过这里的游客都会觉得不可思议,这时,导游就会给大家讲一个故事:这里是喜鹊的栖息地,每到冬天,喜鹊们都在果树上筑巢过冬。有一年冬天特别冷,下了很大的雪,几百只找不到食物的喜鹊一夜之间都被冻死了。第二年,一种不知名的毛毛虫突然泛滥成灾,那年秋天,果园没有收获到一个柿子。直到这时,人们才想起了那些喜鹊,如果有喜鹊在,就不会发生虫灾了。从那以后,每年秋天收获柿子时,人们都会留下一些柿子,作为喜鹊过冬的食物……

给别人留有余地,往往就是给自己留下生机和希望啊!

8、没有一种给予是理所应当的

老人是菲律宾华侨,在海外跋涉半生。几经浮沉,衣锦还乡的他萌生了济世助人,造福相邻的念头。

于是,老人分别给家乡几所学校的校长写了信,希望每个校长能提供十来个学生名单,他从中选定人选,作为他资助的对象。

家人真怪他的愚昧,既是捐赠,何必把程序搞得这样复杂?不如来个快捷方式,譬如通过”希望工程“或者”春蕾计划“,干净利落地了却一桩心愿,岂不是更好?

老人摇摇头说:”我的血汗钱只给与那些配得到他的孩子。“哪些孩子才有资格得到资助。是那些家庭贫困的孩子,还是优秀生抑或是特长生,谁也不知道老人心里的答案。

名单很快就到了老人手里。老人让家人买来了许多书,分门别类地包装好,准备寄给名单上的孩子,家人面面相觑,这样微薄的赠与是不是太寒碜了。大家断定书中自有黄金屋,可翻来覆去也没有找到夹在书中的纸钞。只是,在书的第一页看到了老人的亲笔,赠给品学兼优的学生,落款处是老人的地址,姓名,电话和电子信箱。

家人大惑不解,却也不愿悖逆老人的旨意,只好替他一一寄出那些书。

夕晖来去匆匆,老人常常对着电话发呆,有莫名奇妙的唉声叹气。从黄叶凋零到瑞雪飘飞,谁也猜不透老人所为何事。

终于读懂老人的心,源于新年的一张贺卡,很普通。上面写着:感谢您给我寄来的书,虽然我不认识您,但我会记着您。祝您新年快乐!没想到老人竟然兴奋地大呼小叫:有回音了,有回音了,终于找到一个可资助的孩子。

家人恍然大悟,终于明白老人这些日子郁郁寡欢的原因,他寄出去的书原来是块儿试金石,只有心存感激的人才会有资格得到他的资助。

老人说:土地失去水分滋润会变成沙漠,人心没有感激滋养会变的荒芜,不知感恩的人,注定是个冷漠自私的人,不是关爱别人,纵使给他阳光,日后也不会放射出自身的温暖,且也不配得到别人的爱。的确,没有一种给予是理所应当的,没有什么是必须应该的,所以,没有一种领受可以使无动于衷心安理得的,都应心存感激。一朵花会为一滴雨露鲜艳妩媚,一株草会因一缕春风摇曳多姿,一湖水也会因一片落叶荡漾清波,一颗心更应对另一颗关爱的心静静的绽放感情的笑脸。

9、有理更需宽容

有一个朋友和老板去餐厅吃饭。服务小姐的态度非常恶劣,脸上没有一点笑容。朋友很生气,要投诉她,却被老板制止了。老板说:”也许她失恋了,也许她刚刚被上司指责过,总之,我们应当原谅她。“

”不管什么理由,也不应该影响工作,这是她的错。“

”是的,“老板意味深长地说,”正是因为她全错,而你全对,才需要你的宽容。“

朋友说了一句让老板喷饭的话:”没想到您还有傻根精神。“

”所以,我是头儿,“老板笑着说,”你是我的员工“。

在我们感到不痛快的时候,感到人生无望的时候,我们能不能走到窗口,去看看行色匆匆的人们,去想一想别人的痛苦。在理解与宽容的世界里,有更轻松的呼吸和更新鲜的空气。

10、需要奋斗是幸福的

试想一种如此美好的生活:

出生了,父母都在家中全心全意地照顾你,你的母亲在产假里照领全薪。而你的父亲也因妻子生育而享受9个月的”产假“。

在你16周岁前,你的父母可获得生活津贴。你绝不会”穷人的孩子早当家“。

16周岁以后,你完成了9年义务教育,想继续深造?没问题,国家给你学习津贴。

病了?不用慌,你可享受病假补助,其数额视病假长短而定,相当于工资的75%至100%,医疗费用和经医生之手的药品,大部分由国家负担。

失业了?领救济金去吧。每月1.3万克朗,约相当于1.3万元人民币一个月,比北京、上海的普通白领还要高。如果你再打一份不用交税的零工,日子过得就更红火了。

不想工作,无所事事?念大学去呀--反正也是免费。

老了?国家养着你。

这就是瑞典人民的美好生活。富裕的国家为人民制定了从摇篮到坟墓的福利保护。它的公民不愁吃不愁穿不怕病,失业了也很快乐,老了也生活得很体面。生活环境优美,担心的只是全球变暖之类的问题。

这样的生活,天上人间,不是神仙赛神仙啊。

且慢,来看看这样的数据吧:每年有2000个瑞典人自杀,是世上自杀率最高的国家之一。不久前,瑞典摔跤世界冠军米歇尔·永贝里自杀身亡,年仅34岁。

在瑞典的负面新闻里,”年轻人的恶作剧“、”自杀"这样的字眼司空见惯。前不久,芬兰发生校园枪击案,8人死亡,两个瑞典小青年觉着好玩,于是在网络上发布告示,说也要在瑞典制造一起类似事件,警方闻讯连忙将两人捉拿。

他们自杀的原因之一就是:生活太好。他们无需奋斗,没有压力,无所事事,生活无忧之余就想:上帝要我来干什么?上帝要我来到底要干什么?找不到生活的意义,想呀想,想不通,就去自杀。

想想我们的生活。我们要制定年长远目标。每天勤奋地工作,可怜的一点薪水要孝顺父母、养孩子、养车子,一不小心成了房奴,又得养房子,还务必要养好身子,病了,昂贵的医药费让你吃不了兜着走。自杀,哪里敢,养育之恩还待报,培养孩子的责任压在肩头,生命可不是我们自己的。我们失眠、抱怨,发梦也想中 500万。可不曾想,奋斗令我们的生活充满生机,责任让我们的生命充满意义,压力让我们不断成长,成就让我们充满自豪。不要再抱怨生活的艰辛,原来,需要奋斗也是幸福的一种。不是吗?

第二篇:精妙SQL语句

精妙SQL语句

 说明:复制表(只复制结构,源表名:a 新表名:b)select * into b from a where 1<>1

 说明:拷贝表(拷贝数据,源表名:a 目标表名:b)insert into b(a, b, c)select d,e,f from b; 说明:显示文章、提交人和最后回复时间

select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b

 说明:外连接查询(表名1:a 表名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  说明:日程安排提前五分钟提醒

select * from 日程安排 where datediff('minute',f开始时间,getdate())>5  说明:两张关联表,删除主表中已经在副表中没有的信息

delete from info where not exists(select * from infobz where info.infid=infobz.infid)

 说明:--

SQL:

SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE

FROM TABLE1,(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE

FROM(SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND

FROM TABLE2

WHERE TO_CHAR(UPD_DATE,'YYYY/MM')= TO_CHAR(SYSDATE, 'YYYY/MM'))X,(SELECT NUM, UPD_DATE, STOCK_ONHAND

FROM TABLE2

WHERE TO_CHAR(UPD_DATE,'YYYY/MM')=

TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM')|| '/01','YYYY/MM/DD')1 FROM Handle a)

 一个SQL语句的问题:行列转换 select * from v_temp 上面的视图结果如下: user_name role_name-------------------------系统管理员 管理员

feng 管理员

feng 一般用户

test 一般用户

想把结果变成这样: user_name role_name---------------------------系统管理员 管理员

feng 管理员,一般用户

test 一般用户

=================== create table a_test(name varchar(20),role2 varchar(20))insert into a_test values('李','管理员')insert into a_test values('张','管理员')insert into a_test values('张','一般用户')insert into a_test values('常','一般用户')

create function join_str(@content varchar(100))returns varchar(2000)as begin declare @str varchar(2000)set @str='' select @str=@str+','+rtrim(role2)from a_test where [name]=@content select @str=right(@str,len(@str)-1)return @str end go

--调用:

select [name],dbo.join_str([name])role2 from a_test group by [name]

--select distinct name,dbo.uf_test(name)from a_test  快速比较结构相同的两表

结构相同的两表,一表有记录3万条左右,一表有记录2万条左右,我怎样快速查找两表的不同记录?

============================ 给你一个测试方法,从northwind中的orders表取数据。select * into n1 from orders select * into n2 from orders

select * from n1 select * from n2

--添加主键,然后修改n1中若干字段的若干条

alter table n1 add constraint pk_n1_id primary key(OrderID)alter table n2 add constraint pk_n2_id primary key(OrderID)

select OrderID from(select * from n1 union select * from n2)a group by OrderID having count(*)> 1

应该可以,而且将不同的记录的ID显示出来。下面的适用于双方记录一样的情况,select * from n1 where orderid in(select OrderID from(select * from n1 union select * from n2)a group by OrderID having count(*)> 1)至于双方互不存在的记录是比较好处理的--删除n1,n2中若干条记录

delete from n1 where orderID in('10728','10730')delete from n2 where orderID in('11000','11001')

--*************************************************************--双方都有该记录却不完全相同

select * from n1 where orderid in(select OrderID from(select * from n1 union select * from n2)a group by OrderID having count(*)> 1)union--n2中存在但在n1中不存的在10728,10730 select * from n1 where OrderID not in(select OrderID from n2)union--n1中存在但在n2中不存的在11000,11001 select * from n2 where OrderID not in(select OrderID from n1) 四种方法取表里n到m条纪录:

1.select top m * into 临时表(或表变量)from tablename order by columnname--将top m笔插入 set rowcount n select * from 表变量 order by columnname desc

2.select top n * from(select top m * from tablename order by columnname)a order by columnname desc

3.如果tablename里没有其他identity列,那么: select identity(int)id0,* into #temp from tablename

取n到m条的语句为:

select * from #temp where id0 >=n and id0 <= m

如果你在执行select identity(int)id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行: exec sp_dboption 你的DB名字,'select into/bulkcopy',true

4.如果表里有identity属性,那么简单:

select * from tablename where identitycol between n and m  如何删除一个表中重复的记录?

create table a_dist(id int,name varchar(20))

insert into a_dist values(1,'abc')insert into a_dist values(1,'abc')insert into a_dist values(1,'abc')insert into a_dist values(1,'abc')

exec up_distinct 'a_dist','id'

select * from a_dist

create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))--f_key表示是分组字段﹐即主键字段 as begin declare @max integer,@id varchar(30),@sql varchar(7999),@type integer select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*)from ' +@t_name +' group by ' +@f_key +' having count(*)> 1' exec(@sql)open cur_rows fetch cur_rows into @id,@max while @@fetch_status=0 begin

select @max = @max-1 set rowcount @max

select @type = xtype from syscolumns where id=object_id(@t_name)and name=@f_key if @type=56 select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id if @type=167 select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +'''' exec(@sql)fetch cur_rows into @id,@max end

close cur_rows deallocate cur_rows set rowcount 0 end

select * from systypes select * from syscolumns where id = object_id('a_dist') 查询数据的最大排序问题(只能用一条语句写)

CREATE TABLE hard(qu char(11),co char(11),je numeric(3, 0))

insert into hard values('A','1',3)insert into hard values('A','2',4)insert into hard values('A','4',2)insert into hard values('A','6',9)insert into hard values('B','1',4)insert into hard values('B','2',5)insert into hard values('B','3',6)insert into hard values('C','3',4)insert into hard values('C','6',7)insert into hard values('C','2',3)

要求查询出来的结果如下:

qu co je

---------------------------A 6 9 A 2 4 B 3 6 B 2 5 C 6 7 C 3 4

就是要按qu分组,每组中取je最大的前2位!而且只能用一句sql语句!!

select * from hard a where je in(select top 2 je from hard b where a.qu=b.qu order by je)

 求删除重复记录的sql语句?

怎样把具有相同字段的纪录删除,只留下一条。例如,表test里有id,name字段

如果有name相同的记录 只留下一条,其余的删除。name的内容不定,相同的记录数不定。有没有这样的sql语句?

============================== A:一个完整的解决方案:

将重复的记录记入temp1表: select [标志字段id],count(*)into temp1 from [表名] group by [标志字段id] having count(*)>1

2、将不重复的记录记入temp1表: insert temp1 select [标志字段id],count(*)from [表名] group by [标志字段id] having count(*)=1

3、作一个包含所有不重复记录的表:

select * into temp2 from [表名] where 标志字段id in(select 标志字段id from temp1)

4、删除重复表: delete [表名]

5、恢复表:

insert [表名] select * from temp2

6、删除临时表: drop table temp1 drop table temp2 ================================ B: create table a_dist(id int,name varchar(20))

insert into a_dist values(1,'abc')insert into a_dist values(1,'abc')insert into a_dist values(1,'abc')insert into a_dist values(1,'abc')

exec up_distinct 'a_dist','id'

select * from a_dist

create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))--f_key表示是分组字段﹐即主键字段 as begin declare @max integer,@id varchar(30),@sql varchar(7999),@type integer select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*)from ' +@t_name +' group by ' +@f_key +' having count(*)> 1' exec(@sql)open cur_rows

fetch cur_rows into @id,@max while @@fetch_status=0 begin

select @max = @max-1 set rowcount @max

select @type = xtype from syscolumns where id=object_id(@t_name)and name=@f_key if @type=56 select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id if @type=167 select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +'''' exec(@sql)fetch cur_rows into @id,@max end

close cur_rows deallocate cur_rows set rowcount 0 end

select * from systypes select * from syscolumns where id = object_id('a_dist') 行列转换--普通

假设有张学生成绩表(CJ)如下

Name Subject Result 张三 语文 80 张三 数学 90 张三 物理 85 李四 语文 85 李四 数学 92 李四 物理 82

想变成

姓名 语文 数学 物理

张三 80 90 85 李四 85 92 82

declare @sql varchar(4000)set @sql = 'select Name'

select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end)['+Subject+']'

from(select distinct Subject from CJ)as a

select @sql = @sql+' from test group by name' exec(@sql)

行列转换--合并

有表A, id pid 1 1 1 2 1 3 2 1 2 2 3 1

如何化成表B: id pid 1 1,2,3 2 1,2 3 1

创建一个合并的函数

create function fmerg(@id int)returns varchar(8000)as begin

declare @str varchar(8000)set @str=''

select @str=@str+','+cast(pid as varchar)from 表A where id=@id set @str=right(@str,len(@str)-1)return(@str)End go

--调用自定义函数得到结果

select distinct id,dbo.fmerg(id)from 表A  如何取得一个数据表的所有列名

方法如下:先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。

SQL语句如下:

declare @objid int,@objname char(40)set @objname = 'tablename'

select @objid = id from sysobjects where id = object_id(@objname)

select 'Column_name' = name from syscolumns where id = @objid order by colid

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'

 通过SQL语句来更改用户的密码

修改别人的,需要sysadmin role

EXEC sp_password NULL, 'newpassword', 'User'

如果帐号为SA执行EXEC sp_password NULL, 'newpassword', sa  怎么判断出一个表的哪些字段不允许为空?

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename  如何在数据库里找到含有相同字段的表?

a.查已知列名的情况

SELECT b.name as TableName,a.name as columnname From syscolumns a INNER JOIN sysobjects b ON a.id=b.id AND b.type='U'

AND a.name='你的字段名字'

 未知列名查所有在不同表出现过的列名

Select o.name As tablename,s1.name As columnname From syscolumns s1, sysobjects o Where s1.id = o.id And o.type = 'U' And Exists(Select 1 From syscolumns s2 Where s1.name = s2.name And s1.id <> s2.id)

 查询第xxx行数据

假设id是主键:

select * from(select top xxx * from yourtable)aa where not exists(select 1 from(select top xxx-1 * from yourtable)bb where aa.id=bb.id)

如果使用游标也是可以的

fetch absolute [number] from [cursor_name] 行数为绝对行数

 SQL Server日期计算

a.一个月的第一天

SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)b.本周的星期一

SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)c.一年的第一天

SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)d.季度的第一天

SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)e.上个月的最后一天

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))f.去年的最后一天

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))g.本月的最后一天

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))h.本月的第一个星期一

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

i.本年的最后一天

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。

 获取表结构[把 'sysobjects' 替换 成 'tablename' 即可]

SELECT CASE IsNull(I.name, '')When '' Then '' Else '*'

End as IsPK,Object_Name(A.id)as t_name, A.name as c_name,IsNull(SubString(M.text, 1, 254), '')as pbc_init, T.name as F_DataType,CASE IsNull(TYPEPROPERTY(T.name, 'Scale'), '')WHEN '' Then Cast(A.prec as varchar)

ELSE Cast(A.prec as varchar)+ ',' + Cast(A.scale as varchar)END as F_Scale,A.isnullable as F_isNullAble FROM Syscolumns as A JOIN Systypes as T

ON(A.xType = T.xUserType AND A.Id = Object_id('sysobjects'))LEFT JOIN(SysIndexes as I JOIN Syscolumns as A1

ON(I.id = A1.id and A1.id = object_id('sysobjects')and(I.status & 0x800)= 0x800 AND A1.colid <= I.keycnt))

ON(A.id = I.id AND A.name = index_col('sysobjects', I.indid, A1.colid))LEFT JOIN SysComments as M

ON(M.id = A.cdefault and ObjectProperty(A.cdefault, 'IsConstraint')= 1)ORDER BY A.Colid ASC

 提取数据库内所有表的字段详细说明的SQL语句

SELECT

(case when a.colorder=1 then d.name else '' end)N'表名', a.colorder N'字段序号', a.name N'字段名',(case when COLUMNPROPERTY(a.id,a.name,'IsIdentity')=1 then ''else '' end)N'标识',(case when(SELECT count(*)FROM sysobjects WHERE(name in(SELECT name FROM sysindexes

WHERE(id = a.id)AND(indid in(SELECT indid

FROM sysindexkeys

WHERE(id = a.id)AND(colid in(SELECT colid FROM syscolumns

WHERE(id = a.id)AND(name = a.name)))))))AND(xtype = 'PK'))>0 then '' else '' end)N'主键', b.name N'类型',a.length N'占用字节数',COLUMNPROPERTY(a.id,a.name,'PRECISION')as N'长度',isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0)as N'小数位数',(case when a.isnullable=1 then ''else '' end)N'允许空', isnull(e.text,'')N'默认值',isnull(g.[value],'')AS N'字段说明' FROM syscolumns a left join systypes b on a.xtype=b.xusertype inner join sysobjects d

on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' left join syscomments e on a.cdefault=e.id

left join sysproperties g

on a.id=g.id AND a.colid = g.smallid order by object_name(a.id),a.colorder

 快速获取表test的记录总数[对大容量表非常有效]

快速获取表test的记录总数:

select rows from sysindexes where id = object_id('test')and indid in(0,1)

update 2 set KHXH=(ID+1)2 2行递增编号

update [23] set id1 = 'No.'+right('00000000'+id,6)where id not like 'No%' //递增

update [23] set id1= 'No.'+right('00000000'+replace(id1,'No.',''),6)//补位递增 delete from [1] where(id%2)=1 奇数

 替换表名字段

update [1] set domurl = replace(domurl,'Upload/Imgswf/','Upload/Photo/')where domurl like '%Upload/Imgswf/%'  截位

SELECT LEFT(表名, 5)

下列语句部分是Mssql语句,不可以在access中使用。

SQL分类:

DDL-数据定义语言(CREATE,ALTER,DROP,DECLARE)

DML-数据操纵语言(SELECT,DELETE,UPDATE,INSERT)

DCL-数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

首先,简要介绍基础语句:

1、说明:创建数据库

CREATE DATABASE database-name

2、说明:删除数据库

drop database dbname

3、说明:备份sql server

---创建 备份数据的 device

USE master

EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'

---开始 备份

BACKUP DATABASE pubs TO testBack

4、说明:创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根据已有的表创建新表:

A:create table tab_new like tab_old(使用旧表创建新表)

B:create table tab_new as select col1,col2… from tab_old definition only

5、说明:删除新表drop table tabname

6、说明:增加一个列

Alter table tabname add column col type

注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

7、说明:添加主键: Alter table tabname add primary key(col)

说明:删除主键: Alter table tabname drop primary key(col)

8、说明:创建索引:create [unique] index idxname on tabname(col….)

删除索引:drop index idxname

注:索引是不可更改的,想更改必须删除重新建。

9、说明:创建视图:create view viewname as select statement

删除视图:drop view viewname

10、说明:几个简单的基本的sql语句

选择:select * from table1 where 范围

插入:insert into table1(field1,field2)values(value1,value2)

删除:delete from table1 where 范围

更新:update table1 set field1=value1 where 范围

查找:select * from table1 where field1 like ‟%value1%‟---like的语法很精妙,查资料!

排序:select * from table1 order by field1,field2 [desc]

总数:select count * as totalcount from table1

求和:select sum(field1)as sumvalue from table1

平均:select avg(field1)as avgvalue from table1

最大:select max(field1)as maxvalue from table1

最小:select min(field1)as minvalue from table1

11、说明:几个高级查询运算词

A: UNION 运算符

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

B: EXCEPT 运算符

EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。

C: INTERSECT 运算符

INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。

注:使用运算词的几个查询结果行必须是一致的。

12、说明:使用外连接

A、left outer join:

左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:right outer join:

右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

C:full outer join:

全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

其次,大家来看一些不错的sql语句

1、说明:复制表(只复制结构,源表名:a 新表名:b)(Access可用)

法一:select * into b from a where 1<>1

法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b)(Access可用)

insert into b(a, b, c)select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)

insert into b(a, b, c)select d,e,f from b in „具体数据库‟ where 条件

例子:..from b in '“&Server.MapPath(”.“)&”data.mdb“ &”' where..4、说明:子查询(表名1:a 表名2:b)

select a,b,c from a where a IN(select d from b)或者: select a,b,c from a where a IN(1,2,3)

5、说明:显示文章、提交人和最后回复时间

select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b

6、说明:外连接查询(表名1:a 表名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a)

select * from(SELECT a,b,c FROM a)T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法

select * from table1 where a [not] in(„值1‟,‟值2‟,‟值4‟,‟值6‟)

10、说明:两张关联表,删除主表中已经在副表中没有的信息

delete from table1 where not exists(select * from table2 where table1.field1=table2.field1)

11、说明:四表联查问题:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where.....12、说明:日程安排提前五分钟提醒

SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页

select top 10 b.* from(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

14、说明:前10条记录

select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

select a,b,c from tablename ta where a=(select max(a)from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表

(select a from tableA)except(select a from tableB)except(select a from tableC)

17、说明:随机取出10条数据

select top 10 * from tablename order by newid()

18、说明:随机选择记录

select newid()

19、说明:删除重复记录

Delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)

20、说明:列出数据库里所有的表名

select name from sysobjects where type='U'

21、说明:列出表里的所有的

select name from syscolumns where id=object_id('TableName')

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end)FROM tablename group by type

显示结果:

type vender pcs

电脑 A 1

电脑 A 1

光盘 B 2

光盘 A 2

手机 B 3

手机 C 3

23、说明:初始化表table1

TRUNCATE TABLE table1

24、说明:选择从10到15的记录

select top 5 * from(select top 15 * from table order by id asc)table_别名 order by id desc

随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)

对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:

Randomize

RNumber = Int(Rnd*499)+1

While Not objRec.EOF

If objRec(“ID”)= RNumber THEN

...这里是执行脚本...end if

objRec.MoveNext

Wend

这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?

采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:

Randomize

RNumber = Int(Rnd*499)+ 1

SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber

set objRec = ObjConn.Execute(SQL)

Response.WriteRNumber & “ = ” & objRec(“ID”)& “ ” & objRec(“c_email”)

不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。

再谈随机数

现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。

为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:

SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber & “ OR ID = ” & RNumber2 & “ OR ID = ” & RNumber3

假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):

SQL = “SELECT * FROM Customers WHERE ID BETWEEN ” & RNumber & “ AND ” & RNumber & “+ 9”

注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

随机读取若干条记录,测试过

Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)

Sql server:select top n * from 表名 order by newid()

mysqlelect * From 表名 Order By rand()Limit n

Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)

语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where...使用SQL语句 用...代替过长的字符串显示

语法:

SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename

Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field)FROM tablename;

Conn.Execute说明

Execute方法

该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:

1.执行SQL查询语句时,将返回查询得到的记录集。用法为:

Set 对象变量名=连接对象.Execute(“SQL 查询语言”)

Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:

连接对象.Execute “SQL 操作性语句” [, RecordAffected][, Option]

·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。

·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

·BeginTrans、RollbackTrans、CommitTrans方法

这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。

事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。

BeginTrans和 CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。

常用SQL语句书写技巧(转)

关键词: SQL

SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实、最有效的手段,有时甚至是唯一的手段,比如在不允许大幅度修改现有数据库结构的情况下。

通过优化SQL语句提高查询性能的关键是:

l 根据实际需求情况,建立合适的索引; l 使用一切可能的方式去利用好索引,避免全表扫描;

l 尽量减少内存及数据I/O方面的开销

一、建立索引

(一)建立“适当”的索引,是快速查询的基础。

索引(index)是除表之外另一重要的、用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据时,索引提供了对数据的快速访问。事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,但随着表变得越来越大,使用“适当”的索引的效果就越来越明显。注意,在这句话中,我们用了“适当”这个词,这是因为,如果使用索引时不认真考虑其实现过程,索引既可以提高也会破坏数据库的工作性能。

索引实际上是一种特殊的目录,SQL SERVER提供了两种索引:

l 聚集索引(clustered index,也称聚类索引、簇集索引)

我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

例如:

汉语字典中按拼音查某一个字,就是使用“聚集索引”,实际上,你根本用不着查目录,直接在字典正文里找,就能很快找到需要的汉字(假设你知道发音)。

l 非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)

我们把目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

例如:

汉语字典中按部首查某一个字,部首目录和正文一定要刻意的通过页码才能联系到一起,其顺序不是天然一致的。

聚集索引与非聚集索引的最大区别就在于:聚集索引是对原数据表进行排序,因此只要符合索引条件,就能够直接连续的读取数据记录,几乎可以达到对数据表的零扫描;而非聚集索引仅仅只是另外建了一张索引表,取数据的时候,从索引表取得结果后,还需要到指针所指的数据行读取相应数据,因此,在性能上,聚集索引会大大优于非聚集索引。

但是在一张表中,聚集索引只允许一个,是比较宝贵的,因此要尽可能的用于那些使用频率最高的索引上。另外,查询时必需要用到索引的起始列,否则索引无效。另外,起始列也必需是使用频繁的列,那样的索引性能才会达到最优化。

(二)表:何时应使用聚集索引或非聚集索引

动作描述 使用聚集索引 使用非聚集索引

列经常被分组排序 ○ ○

返回某范围内的数据 ○

一个或极少不同值

小数目的不同值 ○

大数目的不同值 ○

频繁更新的列 ○

外键列 ○ ○

主键列 ○ ○

频繁修改索引列 ○

(三)索引建立的一些注意项

1、不要把聚集索引浪费在主键上,除非你只按主键查询

虽然SQL SERVER默认是在主键上建立聚集索引的,但实际应用中,这样做比较浪费。通常,我们会在每个表中都建立一个ID列,以区分每条数据,并且这个ID列是自动增大的,步长一般为1。此时,如果我们将这个列设为主键,SQL SERVER会将此列默认为聚集索引。这样做有好处,就是可以让您的数据在数据库中按照ID进行物理排序,但这样做实用价值不大。

从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,迅速缩小查询范围,避免全表扫描。在实际应用中,因为ID号是自动生成的,我们并不知道每条记录的ID 号,所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。聚集索引相对与非聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加宝贵,应该用在其他查询频率高的字段上。其次,让每个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则;当然,这种情况只是针对用户经常修改记录内容,特别是索引项的时候会负作用,但对于查询速度并没有影响。

2、索引的建立要根据实际应用需求来进行

并非是在任何字段上简单地建立索引就能提高查询速度。聚集索引建立的规则大致是“既不能绝大多数都相同,又不能只有极少数相同”。举个例子,在公文表的收发日期字段上建立聚合索引是比较合适的。在政务系统中,我们每天都会收一些文件,这些文件的发文日期将会相同,在发文日期上建立聚合索引对性能的提升应该是相当大的。在群集索引下,数据物理上按顺序存于数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。

另一个相反的例子:比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就完全没必要建立索引。

3、在聚集索引中加入所有需要提高查询速度的字段,形成复合索引

根据一些实验的结果,我们可以得出一些可供参考的结论:

ü 仅用复合聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询,速度是几乎一样的,甚至比后者还要快(在查询结果集数目一样的情况下);

ü 仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。

ü 复合聚集索引的所有列都用上,而且因为查询条件严格,查询结果少的话,会形成“索引覆盖”,性能可以达到最优。

ü 最重要的一点:无论是否经常使用复合聚合索引的其他列,其起始列一定要是使用最频繁的列。

4.根据实践得出的一些其他经验,特定情况下有效

ü 用聚合索引比用不是聚合索引的主键速度快;

ü 用聚合索引比用一般的主键作order by速度快,特别是在小数据量情况;

ü 使用聚合索引内的时间段,搜索时间会按数据占整个数据表的百分比成比例减少,而无论聚合索引使用了多少个;

ü 日期列不会因为有分秒的输入而减慢查询速度;

ü 由于改变一个表的内容,将会引起索引的变化。频繁的insert,update,delete语句将导致系统花费较大的代价进行索引更新,引起整体性能的下降。一般来讲,在对查询性能的要求高于对数据维护性能要求时,应该尽量使用索引,否则,就要慎重考虑一下付出的代价。在某些极端情况下,可先删除索引,再对数据库表更新大量数据,最后再重建索引,新建立的索引总是比较好用。

二、编写优化的SQL语句,充分利用索引

下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。

SQL语句在提交给数据库进行操作前,都会经过查询分析阶段,SQLSERVER内置的查询优化器会分析查询条件的的每个部分,并判断这些条件是否符合扫描参数(SARG)的标准。只有当一个查询条件符合SARG的标准,才可以通过预先设置的索引,提升查询性能。

SARG的定义:用于限制搜索操作的一种规范,通常是指一个特定的匹配,一个确定范围内的匹配或者两个以上条件的AND连接。一般形式如下:

列名 操作符 <常数 或 变量> 或

<常数 或 变量> 操作符 列名

列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:

Name=‟张三‟

价格>5000

5000<价格

Name=‟张三‟ and 价格>5000

如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是说SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件,既进行全表扫描。所以,一个索引对于不满足SARG形式的表达式来说是无用的, 如:当查询条件为“价格*2 >5000”时,就无法利用建立在价格字段上的索引。

SQLSERVER内置了查询优化器,能将一些条件自动转换为符合SARG标准,如:将“价格*2 >5000” 转换为“价格 >2500/2 ”,以达到可以使用索引的目的,但这种转化不是100%可靠的,有时会有语义上的损失,有时转化不了。如果对“查询优化器”的工作原理不是特别了解,写出的SQL语句可能不会按照您的本意进行查询。所以不能完全依赖查询优化器的优化,建议大家还是利用自己的优化知识,尽可能显式的书写出符合SARG标准的 SQL语句,自行确定查询条件的构建方式,这样一方面有利于查询分析器分析最佳索引匹配顺序,另一方面也有利于今后重读代码。

介绍完SARG后,我们再结合一些实际运用中的例子来做进一步的讲解:

1、Like语句是否属于SARG取决于使用%通配符的样式

如:name like „张%‟,这就属于SARG

而:name like „%张‟ ,就不属于SARG

通配符%在字符串首字符的使用会导致索引无法使用,虽然实际应用中很难避免这样用,但还是应该对这种现象有所了解,至少知道此种用法性能是很低下的。

2、“非”操作符不满足SARG形式,使得索引无法使用

不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等。

下面是一个NOT子句的例子:

...where not(status ='valid')

not运算符也隐式的包含在另外一些逻辑运算符中,比如<>运算符。见下例:

...where status <>'invalid';

再看下面这个例子:

select * from employee where salary<>3000;

对这个查询,可以改写为不使用not:

select * from employee where salary<3000 or salary>3000;

虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许对salary列使用索引,而第一种查询则不能使用索引。

3、函数运算不满足SARG形式,使得索引无法使用

例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:

select * from record where substring(card_no,1,4)=′5378′(13秒)

select * from record where amount/30< 1000(11秒)

select * from record where convert(char(10),date,112)=′19991201′(10秒)

分析:

where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行全表扫描,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:

select * from record where card_no like ′5378%′(< 1秒)

select * from record where amount < 1000*30(< 1秒)

select * from record where date= ′1999/12/01′(< 1秒)

你会发现SQL明显快很多

4、尽量不要对建立了索引的字段,作任何的直接处理

select * from employs where first_name + last_name ='beill cliton';

无法使用

人生哲理小品十篇精妙语句

第一篇:人生哲理小品十篇精妙语句 人生哲理小品十篇精妙语句 2010-04-13 23:45:40 阅读13 评论0 字号:大中小.每个人的人生都...
点击下载
分享:
最新文档
热门文章
    确认删除?
    QQ
    • QQ点击这里给我发消息
    微信客服
    • 微信客服
    回到顶部