楼主: suzyyang
7815 18

SQL学习心得 [推广有奖]

11
david_mtl 发表于 2012-10-12 00:46:29
thank you so much

12
jimu_xw 发表于 2012-10-12 02:19:58
谢谢分享!

13
Tatasukami 发表于 2012-10-14 11:07:11
没得说

14
tojoan 发表于 2013-1-17 21:58:13
文章贴出来

15
JoyceChou 在职认证  发表于 2013-2-1 12:20:48
很不错啊,对我这个初学者很有用,谢谢楼主分享
孤独和真实使人了解自己

16
robby0330 发表于 2013-2-26 20:08:21
SQL学习总结
一些常用的知识

NULL
1.        ISNULL函数做一个空值的判断,语法表达式为ISNULL(EXPRESSION1,0),意思是如果是0则返回NULL,如果不是零,则返回EXPRESSION1的表达式
ISNULL函数,经常跟CASE WHEN…THEN..ELSE..END 表达式联合在一起做一个复杂的ISNULL判断,他的意图是先统一表中的NULL值和对查询结果不产生影响的值。
2.NULLIF函数,语法表达式为NULLIF(EXPRESSION1,EXPRESSION2),意思是如果两个表达式相等则返回NULL,如果两个表达式不相等则返回EXPRESSION1.


2.数据类型的转换
1.        一般情况来说SQL里面从低级的数据类型转换成高级的数据类型是默认的,但从高级转换为低级的数据类型则需要做定义。
数据类型排序(从高到低)
DATETIME—FLOAT—INT—VARCHAR—CHAR
当自己不能判断哪个数据类型比较高时,可以先不做转换,如果SQL可以运行,则说明是向高级转换,如果不能运行,则必须做一个转换
2.CONVERT函数
表达式;CONVERT(数据类型(长度),EXPRESSION1,样式)
例子;CONVERT(VARCHAR(8),GETDATE(),112)
3.CAST函数
表达式;CAST(EXPRESSION1 AS 数据类型(长度))
例子;CAST(GETDATE()  AS VARCHAR(8))


3.当查询的结果存在小数点时,我们为了查询的结果美观,好比较,可以根据需要定义保留的小数点位数
1.CONVERT函数
表达式;CONVERT(数据类型(长度),EXPRESSION1)
例子;CONVERT(NUMERIC(18,2),EXPRESSION1)
解释;将EXPRESSION1保留两位小数
2. CAST函数
       表示式;CAST(EXPRESSION AS 数据类型(长度))
例子;CAST(EXPRESSION AS NUMERIC(18,2))

4.排序函数
     当我们想对查询的结果取一个极值时,通常容易用到排序函数;ROW_NUMBER
     表达式;ROW_NUMBER () OVER(PARTITION BY COLUMN_NAME1 ORDER BY COLUMN_NAME2 ASC/DESC) AS 新列名
     解释;PARTITION BY 这个函数是为了区别要排序的的结果,而ORDER BY 函数是对要筛选的结果进行排序。
     例子;ROW_NUMBER () OVER(PARTITION BY 基金代码 ORDER BY 基金净值
DESC) AS  最大基金净值
取出每个基金最大的基金净值


5.用函数计算和定义时间间隔
     1.DATEADD函数
       我们可以通过DATEADD函数来定义时间间隔。
       例如;近一周 DATEADD(DD,-7,GETDATE())
             近一个月 DATEADD(MM,-1,GETDATE())
             近半年  DATEADD(MM,-6,GETDATE())
             近一年  DATEADD(YY,-1,GETDATE())
2.        DATEDIFF函数
我们可以通过DATEDIFF函数来计算时间间隔
表达式;DATEDIFF(DD/mm/yy,EXPRESSION1,EXPRESSION2)
例如;现在和TDATE的时间间隔
      DATEDIFF(DD/MM/YY,TDATE,GETDATE())
3.        DATEADD和DATEDIFF的交叉使用
例如;这是计算一个月第一天的SQL 脚本:
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
本周的星期一
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
一年的第一天
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
4.        备注;在使用这两个函数的时候我们必须注意间隔不能用小数来定义,这两个函数无法识别小数
5.        题目要求查询的结果随自然日的变化而变化也要用到这两个函数。
例子;取上月中证500指数权重数据,列名;指数代码,指数名称,日期,权重股代码,权重股市场代码,权重(issweight表),并按照日期,权重股代码排序。
--注日期要能随自然日变化而变化

SELECT指数代码=ISYMBOL,指数名称=INAME,日期=TDATE,权重股代码=SYMBOL,
权重股市场代码=EXCHANGE,权重=WEIGHING
FROM ISSWEIGHT
WHERE INAME='中证500指数'
AND LEFT(CONVERT(VARCHAR(8),TDATE,112),6)=LEFT(CONVERT(VARCHAR(8),DATEADD(MM,-1,GETDATE()),112),6)
ORDER BY 日期


6.对查询的结果进行行业分类
--中信标普
SELECT * FROM CINDUSTRY WHERE STYLE='504'
--申万1级
SELECT * FROM CINDUSTRY WHERE Style='464'
--申万2级
SELECT * FROM CINDUSTRY WHERE Style='489' AND RIGHT(STYLECODE,2)='00'AND RIGHT(STYLECODE,3)<>'000'
--取证监会一级
SELECT * FROM CINDUSTRY WHERE Style='009' AND DATALENGTH(STYLECODE)=2
--取证监会二级
SELECT * FROM CINDUSTRY WHERE Style='009'
AND DATALENGTH(STYLECODE)=CASE WHEN STYLECODE LIKE '%C%' AND STYLECODE<>'ZC99' THEN  3  ELSE  4  END
注释:LEN(STYLECODE)=2   表示取对应代码长度为2的
      LEN(STYLECODE)=CASE WHEN STYLECODE LIKE '%C%' AND STYLECODE<>'ZC99'  THEN 3  ELSE  4  END 表示制造业的时候是取长度为3的对应代码,其他的长度为4的时候都是属于证监会二级分






17
robby0330 发表于 2013-2-26 20:09:13
谢谢楼主分享,我替你贴出来了

18
hello_mia 发表于 2013-6-7 09:42:40
感谢分享~~

19
二妮 发表于 2013-6-7 11:25:07
学习

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 19:25