仓酷云

标题: MSSQL网页编程之教你轻松办理几种罕见的SQL疑问成绩 [打印本页]

作者: 飘灵儿    时间: 2015-1-16 22:16
标题: MSSQL网页编程之教你轻松办理几种罕见的SQL疑问成绩
使为了数据安全,我们搭建了主从。但实时主从备份只能防止硬件问题,比如主库的硬盘损坏。但对于误操作,则无能为力。比如在主库误删一张表,或者一个update语句没有指定where条件,导致全表被更新。罕见的SQL成绩:
◆选择反复,打消反复和选择出序列
有例表:emp
emp_nonameage
001Tom17
002Sun14
003Tom15
004Tom16
请求:
列出一切名字反复的人的纪录
(1)最直不雅的思绪:要晓得一切名字有反复人材料,起首必需晓得哪一个名字反复了:
selectnamefromemp
groupbyname
havingcount(*)>1
一切名字反复人的纪录是:
select*fromemp
where
namein(
selectnamefromemp
groupbyname
havingcount(*)>1
)
(2)略微再伶俐一点,就会想到,假如对每一个名字都和原表举行对照,年夜于2团体名字与这笔记录像同的就是及格的,就有
select*fromemp
where
(selectcount(*)fromemp
ewheree.name=emp.name)
>1
--注重一下这个>1,想下假如是=1,假如是=2假如是>2假如e是别的一张表并且是=0那了局就更好玩了:)
这个历程是在判别工号为001的人的时分先获得001的名字(emp.name)然后和原表的名字举行对照e.name
注重e是emp的一一般名。
再略微想很多一点,就会想到,假如有别的一个名字不异的野生号不与她他不异那末这笔记录切合请求:
select*fromemp
whereexists
(select*fromempewhere
e.name=emp.nameande.emp_noemp.emp_no)
此思绪的join写法:
selectemp.*
fromemp,empe
where
emp.name=e.nameandemp.emp_noe.emp_no
/*
这个语句较标准的join写法是
selectemp.*
fromempinnerjoinempe
on
emp.name=e.nameandemp.emp_noe.emp_no
但团体对照偏向于前一种写法,关头是更明晰
*/
b、有例表:emp
nameage
Tom16
Sun14
Tom16
Tom16
请求:
过滤失落一切过剩的反复纪录
(1)我们晓得distinct、groupby能够过滤反复,因而就有最直不雅的
selectdistinct*fromemp

selectname,agefromempgroupbyname,age
取得必要的数据,假如可使用一时表就有解法:
selectdistinct*into#tmpfromemp
deletefromemp
insertintoempselect*from#tmp
(2)可是假如不成以利用一时表,那该怎样办?
我们察看到我们没举措辨别数据(物理地位纷歧样,对SQLServer来讲没有任何区分),思绪天然是想举措把数据辨别出来了,既然如今的一切的列都没举措辨别数据,独一的举措就是再加个列让它辨别出来,加甚么列好?最好选择是identity列:
altertableempaddchkintidentity(1,1)
暗示例:
nameagechk
Tom161
Sun142
Tom163
Tom164
反复纪录能够暗示为:
select*fromemp
where
(selectcount(*)fromempewheree.name=emp.name)>1
要删除的是:
deletefromemp
where
(selectcount(*)fromempewhere
e.name=emp.nameande.chk>=emp.chk)>1
再把增加的列删失落,呈现了局。
altertableempdropcolumnchk
(3)另外一个思绪:
视图
selectmin(chk)
fromemp
groupbyname
havingcount(*)>1
取得有反复的纪录chk最小的值,因而能够
delete
fromemp
where
chknotin
(
selectmin(chk)
fromemp
groupbyname
)
写成join的情势也能够:
(1)有例表:emp
emp_nonameage
001Tom17
002Sun14
003Tom15
004Tom16
◆请求天生序列号
(1)最复杂的办法,依据b成绩的解法:
altertableempaddchkintidentity(1,1)
或select*,identity(int,1,1)chkinto#tmpfromemp
◆假如必要把持按次怎样办?
selecttop100000*,identity(int,1,1)
chkinto#tmpfromemporderbyage
(2)假设不成以变动表布局,怎样办?
假如不成以独一辨别每笔记录是没有举措的,在能够独一辨别每笔记录的时分,可使用a中的count的思绪办理这个成绩
selectemp.*,(selectcount(*)from
empewheree.emp_no<=emp.emp_no)
fromemp
orderby(selectcount(*)from
empewheree.emp_no<=emp.emp_no)
使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
作者: 小妖女    时间: 2015-1-19 06:31
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
作者: 海妖    时间: 2015-1-27 05:05
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
作者: 若天明    时间: 2015-2-5 01:47
无法深入到数据库系统层面去了解和探究
作者: 小魔女    时间: 2015-2-11 02:47
发几份SQL课件,以飨阅者
作者: 兰色精灵    时间: 2015-3-1 19:55
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
作者: 谁可相欹    时间: 2015-3-10 23:23
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
作者: 再见西城    时间: 2015-3-17 16:08
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
作者: 灵魂腐蚀    时间: 2015-3-17 16:08
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
作者: 活着的死人    时间: 2015-3-24 10:52
大家注意一点。如下面的例子:




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2