注册 登录
编程论坛 SQL Server论坛

[转帖]精妙SQL语句

EA_Games 发布于 2005-03-26 17:52, 15727 次点击
精妙SQL语句 SQL执行的效率主要看你语句写得如何 希望以下内容对大家提高SQL语句有好处 说明:复制表(只复制结构,源表名:a 新表名:b) SQL: select * into b from a where 1<>1 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) SQL: insert into b(a, b, c) select d,e,f from b; 说明:显示文章、提交人和最后回复时间 SQL: 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) 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 说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 说明:两张关联表,删除主表中已经在副表中没有的信息 SQL: 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') &brvbar;&brvbar; '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y, WHERE X.NUM = Y.NUM (+) AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B WHERE A.NUM = B.NUM 说明:-- SQL: select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩 说明: 从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源) SQL: SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration FROM TELFEESTAND a, TELFEE b WHERE a.tel = b.telfax) a GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') 说明:四表联查问题: SQL: 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 ..... 说明:得到表中最小的未使用的ID号 SQL: SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID FROM Handle WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a) --压缩日志及数据库文件大小 /*--特别注意 请按步骤进行,未进行前面的步骤,请不要做后面的步骤 否则可能损坏你的数据库. 一般不建议做第4,6两步 第4步不安全,有可能损坏数据库或丢失数据 第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复. --*/ 1.清空日志 DUMP TRANSACTION 库名 WITH NO_LOG 2.截断事务日志: BACKUP LOG 数据库名 WITH NO_LOG 3.收缩数据库文件(如果不压缩,数据库的文件不会减小 企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件 --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 也可以用SQL语句来完成 --收缩数据库 DBCC SHRINKDATABASE(客户资料) --收缩指定数据文件,1是文件号,可以通过这个语句查询到: select * from sysfiles DBCC SHRINKFILE(1) 4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行) a.分离数据库: 企业管理器--服务器--数据库--右键--分离数据库 b.在我的电脑中删除LOG文件 c.附加数据库: 企业管理器--服务器--数据库--右键--附加数据库 此法将生成新的LOG,大小只有500多K 或用代码: 下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。 a.分离 EXEC sp_detach_db @dbname = 'pubs' b.删除日志文件 c.再附加 EXEC sp_attach_single_file_db @dbname = 'pubs', @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf' 5.为了以后能自动收缩,做如下设置: 企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩" --SQL语句设置方式: EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE' 6.如果想以后不让它日志增长得太大 企业管理器--服务器--右键数据库--属性--事务日志 --将文件增长限制为xM(x是你允许的最大数据文件大小) --SQL语句的设置方式: alter database 数据库名 modify file(name=逻辑文件名,maxsize=20) 使用SQLDMO Public Function BackupDatabase(Database As String, FileName As String) As Boolean '备份数据库 On Error GoTo er If mState <> 1 Then Exit Function Dim oBackup As Object Set oBackup = CreateObject("SQLDMO.Backup") oBackup.Database = Database oBackup.Files = FileName If Len(Dir(FileName)) > 0 Then Kill (FileName) End If oBackup.SQLBackup sql er: BackupDatabase = IIf(Err.Number = 0, True, False) End Function Public Function RestoreDatabase(Database As String, FileName As String) As Boolean '恢复数据库 On Error GoTo er If mState <> 1 Then Exit Function Dim oRestore As Object Set oRestore = CreateObject("SQLDMO.Restore") oRestore.Database = Database oRestore.Files = FileName oRestore.ReplaceDatabase = True If Len(Dir(FileName)) > 0 Then Kill (FileName) End If oRestore.SQLRestore sql er: RestoreDatabase = IIf(Err.Number = 0, True, False) End Function
48 回复
#2
mingc_mis2005-03-30 17:44
支持一下
#3
卜酷塔2005-03-30 20:44
应该说还是不错的,顶!
#4
光明之子2005-03-31 09:41
不错,收藏 !
#5
伤心邱比特2005-04-14 21:23
好贴~~ 顶了再看
#6
老猫怕鱼2005-05-02 10:52
正在看 笔记中
#7
cfchhh2005-05-13 13:36
极力支持,小菜本人正在学sql,正在努力学习基本语句,以期望能尽快写一个自己想的存储过程出来.

----------------------------------------
碰到问题是好事,解决问题是关键,回避问题是危险.
#8
xqiang2006-03-24 14:12
好东东,顶
#9
Tailor2006-03-24 16:41
还不错,顶了.
#10
xyhyh2006-03-25 13:42

不错,顶一下

#11
public_0882006-05-02 15:36
不错
#12
raoyq2006-05-05 15:58
很好
#13
silence2006-05-05 21:00

多谢!

#14
hanyuxinghu2006-05-10 21:50
支持一下
!!!!!!!!!!!!!!!
#15
huolangan2006-07-27 00:06
hao tie!
#16
jiweida2006-07-27 14:26

#17
yjh6332006-09-16 16:28
GOOD....
#18
小水滴2006-09-16 20:05

才看到,谢谢!

#19
bbjianke2006-09-21 21:55
还没到那种程度, 看不懂...现在只知道 select * from 语句........
不知道怎么学好
#20
nxcgh20062006-09-22 09:25
好贴子
值的表杨!!

谢谢 提供
#21
mengyu022006-09-22 12:44
很不错哦!!
虽然刚学,但相信在以后的学习中会有很大的帮助!!!!
#22
fanzq_772006-10-10 16:37
顶下
#23
wohemachen2006-10-11 16:23
这个帖子好~
#24
青鸟2006-10-13 03:27

支持`

#25
Reflection2006-10-13 17:02

up! 笔记中!

#26
Reflection2006-10-13 17:27

说明:拷贝表(拷贝数据,源表名:a 目标表名:b)
SQL: insert into b(a, b, c) select d,e,f from b;

这一段代码不理解 并未出现与源表有关的语句啊。

是不是应该改为 insert into b(a,b,c) select d,e,f from a;

请指教~
#27
honkerman2006-10-28 15:25
好东西啊,顶起来~~
#28
lt20462006-10-29 12:25
#29
hanbingchong2006-11-21 19:30
very good
#30
ninggang2006-11-22 10:56
hao a ,我顶啊
#31
le2004072007-03-07 20:28
ding
#32
sky262007-04-09 03:46
支持!
#33
licaiks2007-04-24 14:32
支持亚
哈哈
#34
du68372094512007-06-02 16:52

支持

#35
fqbnet20082007-06-05 17:12


说明:
从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)
SQL:
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC
FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
FROM TELFEESTAND a, TELFEE b
WHERE a.tel = b.telfax) a
GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')


你好,能给出上面两张表的表结构吗? 不胜感激!!!

#36
tzyfc2007-09-13 10:48

很好!!!1

#37
枫飘天涯2007-09-13 22:06
支持一个  
#38
jxdz0864652007-09-14 15:41
#39
topcool2007-09-21 17:52
很值得新人学习啊~~~
#40
wleigh2007-10-09 16:19
刚好看到我正要找的内容。。。顶…………
#41
qazwsx1234562007-10-09 18:13
支持!
#42
huifeituzi2007-11-30 21:21
顶一下
#43
xinzhe2007-12-05 17:52
好东西,受教了
#44
xunmi_love2007-12-05 18:45
呵呵,頭都看大了!
支持!!!
#45
DB_windx2008-09-20 09:20
慢点看吧.哎.虽然看的不是很懂
#46
宠物在线2008-09-20 11:41
谢谢楼主!
#47
happynight2008-09-22 14:38
太长了 没时间看 作个记号 慢慢研究
#48
爱de谎言2008-09-24 12:05
如果在好好排下般,就漂亮了
#49
夜の枫2008-09-24 18:12
不错是不错!只是太!看得眼都花啦!~
1