一点体会

最近两周都是在学习数据库。试着做一些报表。说起来,可能有经验的人都会觉得是很简单的事情。不过事实上,对于刚出来实习的我。还是比较吃力 的。

  虽然之前在学校也比较注重数据库的学习了。可是在看公司前辈做的报表,里面写的视图和存储过程。发觉自己的学习还是太肤浅了一点。 O(∩_∩)O~。趁着今晚有时间,也有这个心情。就对这两周做的事情做一些小小的总结,算是对自己的一个反思。

  首先说到具体一点的就是表的几种连接方式了。

  LEFT JOIN, LEFT OUTER JOIN ,RIGHT JOIN,RIGHT OUTER JOIN,INNER JOIN,

  FULL OUTER JOIN,UNION,UNION ALL

   这几种表的连接方式。到底有什么不同。用一个表来说明:

  TABLE A                       TABLE B

      ID                 NAME                               NAME             DEPT

      A                   JACKSON                         JACKSON          IT

  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                   JACKSON                                 IT

  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                   JACKSON                         IT

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.转换成的时间格式是这样的 2010-4-22.

      但是很多时候我们并不能做这样的转换。因为,有可能你的报表是通过查询数据库中的视图得到的。而为了具体的程序的需求,视图并没有对时间做相应的转换。因为对程序来讲后面的时间往往也是相当的有用的。这时候就只能通过报表的内置的函数来转换了。当然这里讲的报表开发工具就是水晶报表。

CDate(Fileds!DATE.Value).ToString(''yyyy-mm-dd").对报表中的字段做上面的处理。出来的结果就是类似于2010-4-22.

CDate()将目标字符串转换成时间类型。这里需要明白,数据从数据库中取出来放到报表里面,就是string的,需要转换过来。然后对它的显示 格式Format用”yyyy-mm-dd“来配置。

     第二情况就是,我们需要得到日期中的年,月,天,还有星期几。在报表开发里面,这些是很常用的。经常需要把数据按年,月,天分类。按星期几确定某些事务的合法性。上面给出得到这些数据的转换方法。

DATE     YEAR(DATE)    MONTH(DATE)   DAY(DATE)  DATENAME(DATE)

2010-4-22           2010                      4                         22              星期四

时分秒的获得也是这样的。虽然报表不怎么用。但我上网查的时候顺便也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. 同样的事项请同样在取子字符串中留意。

夜深了。今天就写到这里。有空再写。

 

posted @ 2010-04-23 13:34  JacksonChina  阅读(168)  评论(0)    收藏  举报