1.建临时表
create table #temp (Cyear int, Cmonth int ,Cscore double)
错误信息:
消息 102,级别 15,状态 1,第 1 行
')' 附近有语法错误。
错误原因:没有 double型啊!还是说double型有别的意思所以被识别出来了?这个留待研究,反正,正确代码是:
create table #temp (Cyear int, Cmonth int ,Cscore float)
2.跨数据库连接多张表。
问题描述:有A,B两个数据库,将数据库A中的表a,表b,表c跟数据库B中的表d进行等值连接(表d里面含有跟表a,表b,表c相同的列),并且表a还跟自己做了一次自连接。
然后郁闷的事情出现了,
执行完语句,影响行数为190行。
在where语句里面加了一个限制之后(这个限制本来加跟不加都不影响结果的),再执行sql语句,影响行数变成了200行!(正常情况下增加where语句的限制,影响行数不减少也不至于增加吧……?)
并且,执行(加限制过的sql语句)except(没有加限制过的sql语句),影响行数为0行。
后来改写了SQL语句,让数据库A里面的表先完成各种自连接呀等值连接之类的,得到的查询结果再跟数据库B的表d进行连接,就没有问题了。
结论:跨数据库连接很多张表的时候,尽量将在同一个数据库里面的表放在一起处理,再连接这些处理过的结果进行再处理。
3.union 与 union all
问题描述:执行ex1.sql的select语句,选出了100行数据。
执行ex2.sql的select语句,选出了200行数据。
然后我将ex1.sql的语句跟ex2.sql的语句放在了一起,用union拼起来,执行之后,只选出了280行的数据,中间损失的20行数据去哪里了呢?
调查了一下发现ex1.sql筛选出来的数据跟ex2.sql筛选出来的数据相同的时候,有些数据就被“消失”了。
将union 改成 union all,就没有问题了。
结论:以后遇到要将很多的select语句的结果拼起来的时候,一定要用union all而不是union啊~
4.做到日期,时间的增减之类的,要用dateadd函数。
例如:求明天的日期。
不好的例子:
select getdate()+1
正确的例子:
select dateadd(dd,1,getdate())
5.使用到关于星期的判断的时候,要看看系统的语言设置。
具体参考:http://blog.youkuaiyun.com/zhuoruling/article/details/5028309
自己觉得常用的一些关于星期的写法
--查看当前使用的语言
--select @@language
--设置语言为中文(原来全局变量的设置是这样的啊)
--set language '简体中文'
--设置星期五为一周开始的第一天
--set datefirst 5
--查看一周开始的第一天
select @@datefirst
--查看今天是一周的第几天
select datepart(dw,getdate())
--查看今天星期几
select datename(dw,getdate())
--削除datefirst的影响,让一个星期都从星期七开始,
--也就是,星期七为1,星期一为2这样子......
--ps.最后注意一下cast的写法......
select datepart(dw,cast ('20120305' as datetime) + @@datefirst);