一点体会
最近两周都是在学习数据库。试着做一些报表。说起来,可能有经验的人都会觉得是很简单的事情。不过事实上,对于刚出来实习的我。还是比较吃力 的。
虽然之前在学校也比较注重数据库的学习了。可是在看公司前辈做的报表,里面写的视图和存储过程。发觉自己的学习还是太肤浅了一点。 O(∩_∩)O~。趁着今晚有时间,也有这个心情。就对这两周做的事情做一些小小的总结,算是对自己的一个反思。
首先说到具体一点的就是表的几种连接方式了。
LEFT JOIN, LEFT OUTER JOIN ,RIGHT JOIN,RIGHT OUTER JOIN,INNER JOIN,
FULL OUTER JOIN,UNION,
这几种表的连接方式。到底有什么不同。用一个表来说明:
TABLE A TABLE B
ID NAME NAME DEPT
A
B BOBY BOBY SALES
C JASON JASON MATERIALS
D MILEY JASON SALES
从上边可以看到。两个表是用NAME字段来连接的。
首先必须说明,LEFT JOIN,LEFT OUTER JOIN 本质上是没什么区别的。起码从结果的方面来讲是这样的。当然性能有没有差别,这个还没有时间研究。同理RIGHT JOIN 和 RIGHT OUTER JOIN在查询的结果上面也是没什么区别的。那么现在就来看看各个连接对查询结果有什么区别。
SELECT * FROM A LEFT JOIN B ON A.NAME=B.NAME
得到结果如下:
A
B BOBY SALES
C JASON MATERIALS
C JASON SALES
D MILEY NULL
当时上网查一些朋友的left join的说的很简单。就说A LEFT JOIN B 就是以A 表为主。B表中。有的就对应连接。没有的就为NULL。其实这里边有一个很重要的问题。需要考虑到。那就是假如B表中有多个数据对应A的一条数据。那么其 实,结果表里面就会有多条的数据出现。因此,当你不需要这种有重复的数据,就需要对其进行WHERE的选择。
那么同理,RIGHT JOIN也是一样的道理。详细的就不再赘述。
INNER JOIN就是和WHERE 一样的了。
FULL OUTER JOIN
这个或许可以这样理解。将两个分别作左连接和右连接。得到的结果就是FULL OUTER JOIN 了。
例如上面的例子
SELECT * FROM A FULL OUTER JOIN B ON A.NAME=B.NAME得到的结果如下
TABLE
ID NAME DEPT
A
B BOBY SALES
C JASON MATERIALS
C JASON SALES
D MILEY NULL
当然。掌握了这么几个连接表的工具。再对数据字典有了一点熟悉。就可以开发一些比较的简单直观的报表了。
其次就是对一些特殊的数据进行格式处理了。
1.日期格式处理。
MSSQL的DATETIME存的是日期跟时间。从系统的方面来讲,很有必要的。但是在具体的报表中。往往是仅仅是有日期就好,看报表的人其实并不关心事务发生的具体时间。因此,我们为了报表的效率,常常需要在查询的时候就转换其中的格式。转换的方法如下
CONVERT(VARCHAR(10),@DATE,[PARAM]) PARAM可以使102/105/120中的任意一个。具体取哪一个要看报表的具体需求。我比较常用的是120.转换成的时间格式是这样的
但是很多时候我们并不能做这样的转换。因为,有可能你的报表是通过查询数据库中的视图得到的。而为了具体的程序的需求,视图并没有对时间做相应的转换。因为对程序来讲后面的时间往往也是相当的有用的。这时候就只能通过报表的内置的函数来转换了。当然这里讲的报表开发工具就是水晶报表。
CDate(Fileds!DATE.Value).ToString(''yyyy-mm-dd").对报表中的字段做上面的处理。出来的结果就是类似于
CDate()将目标字符串转换成时间类型。这里需要明白,数据从数据库中取出来放到报表里面,就是string的,需要转换过来。然后对它的显示 格式Format用”yyyy-mm-dd“来配置。
第二情况就是,我们需要得到日期中的年,月,天,还有星期几。在报表开发里面,这些是很常用的。经常需要把数据按年,月,天分类。按星期几确定某些事务的合法性。上面给出得到这些数据的转换方法。
DATE YEAR(DATE) MONTH(DATE) DAY(DATE) DATENAME(DATE)
时分秒的获得也是这样的。虽然报表不怎么用。但我上网查的时候顺便也mark了下来。谁知道什么时候用的着呢。
TIME HOUR(TIME) MINUTE(TIME) SECOND(TIME)
21:20:45 21 20 45
除了日期格式的处理。字符串的处理也是很有必要的。很多的时候,客户的输入并不规范。包括我自己也是。⊙﹏⊙b汗一个。我往往习惯性的打完一段文字 就来一个enter或者space,qq给我养成的坏习惯。同样的,客户输入一些表格的数据的时候有可能也掺杂了不少的空格。有一点必须明确。计算机是很较真的。一个空格它也不会放过。因此,如果做字符串比较的时候,没有经过相应的处理,我们人看来是一样的两个字符串往往计算机认为他不是一样的。好了,废 话有点多。
一般的字符串处理的函数就是下面两个。
LTRIM(PARAM) TRIM(PARAM)
它们分别可以去掉PARAM的左边的空格,右边的空格。平常的使用中。我们一般会将它们两个嵌套使用,类似这种形式 LTRIM(RTRIM(PARAM)) 这样就可以把PARAM中的左边和右边的空格都去掉了。
获取字符串中的特定的几个位置的字符。
这个在业务逻辑中也很常用。尤其当我们不能修改表的结构的时候,开发人员往往有自己的方法。例如,约定一个大家都熟知的编码规则。例如 Jack,头一个字母大写的是First Name,不然则是second name。那么在做报表开发的时候,如果要区分,就只能取这些字段的特定位置来判断了。
SUBSTRING ( expression, start, length ) 这是网上copy的。懒得打了~。expression就是字符串,start 索引开始位置,length要取的子字符串长度 例如:substring(”abcde“,1,1)得到的结果就是b。
可能有的开发人员更有想法。例如,合同号。如果是采购合同。就为12位的流水号,销售合同就是13位的流水号。那么这个时候就要用到下面的函数了
len(expression)。返回的就是位数。但是要注意的一点就是,如果字符串中有中文,那么一个汉字是占两个索引
例如 len(”a顶b“)返回的就是4. 同样的事项请同样在取子字符串中留意。
夜深了。今天就写到这里。有空再写。