恩,个人空间,以后就开这个了

发布新日志

  • 如何实现关系表的级联删除(ON DELETE CASCADE的用法)

    2008-10-15 16:09:25

    以下面两张表为例:

    SQL> desc person
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ------------------------

     PERSONID                                  NOT NULL NUMBER(9)
     PROFESSION                                         NUMBER(2)
     IDORPASSPORTNO                                     VARCHAR2(18)
     INSURANCE                                          VARCHAR2(32)
     FIRSTNAME                                          VARCHAR2(32)
     LASTNAME                                           VARCHAR2(32)
     CHINESENAME                                        VARCHAR2(64)
     SEX                                                CHAR(1)
     BIRTHDAY                                           DATE
     USERTYPE                                           VARCHAR2(2)
     SEARCHCODE                                         CHAR(10)
     ORGID                                              NUMBER(9)
     ADDRESSID                                          NUMBER(9)

    SQL> desc PERSONPROFESSION
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ------------------------

     PROFESSIONID                              NOT NULL NUMBER(2)
     NAME                                               VARCHAR2(32)
     ALIAS                                              VARCHAR2(32)
     INITCREDIT                                         NUMBER(3)
     MEMO                                               VARCHAR2(200)

    假定PERSONPROFESSION为父表,PERSON为子表,建立如下约束条件:

    SQL>ALTER TABLE PERSONPROFESSION ADD (CONSTRAINT PK_PERSONPROFESSION PRIMARY KEY (PROFESSIONID) USING INDEX  TABLESPACE WACOS;

    表已更改。

    SQL>ALTER TABLE PERSON ADD (CONSTRAINT PK_PERSON PRIMARY KEY (PERSONID) USING INDEX  TABLESPACE WACOS;

    表已更改。

    增加PERSON表的外键约束:

    SQL>ALTER TABLE PERSON ADD (CONSTRAINT FK_PERSON1 FOREIGN KEY (PROFESSION)
    REFERENCES PERSONPROFESSION (PROFESSIONID) );

    表已更改。

    分别向两张表里插入一行数据:

    SQL>insert into PERSONPROFESSION values('1','sdfd','df','342','dfs');

    已创建 1 行。

    SQL> commit;

    提交完成。

    SQL>insert into person values('10','1','dsf','d','d','df','df','0','','sd','s','11','11');

    已创建 1 行。

    SQL> commit;

    SQL> select  PERSONID,PROFESSION from person;

      PERSONID PROFESSION
    ---------- ----------
            10          1

    SQL> select PROFESSIONID,name from  PERSONPROFESSION;

    PROFESSIONID NAME
    ------------ --------------------------------
               1 sdfd

    SQL> delete from PERSONPROFESSION;
    delete from PERSONPROFESSION
    *
    ERROR 位于第 1 行:
    ORA-02292: 违反完整约束条件 (WACOS.FK_PERSON1) - 已找到子记录日志.

    报错是因为父表里存在子表的记录,应先删除子表记录,再删除父表记录:

    SQL> delete from PERSON;

    已删除 1 行。

    SQL> delete from  PERSONPROFESSION;

    已删除 1 行。

    SQL> commit;

    提交完成。

    那么,如何实现两张表的级连删除呢?

    重新建立PERSON的外键,加上ON DELETE CASCADE选项试一下:

    SQL> alter table person drop CONSTRAINT FK_PERSON1;

    表已更改。

    SQL>ALTER TABLE PERSON ADD (CONSTRAINT FK_PERSON1 FOREIGN KEY (PROFESSION)
    REFERENCES PERSONPROFESSION (PROFESSIONID) ON DELETE CASCADE);


    表已更改。


    增加外键约束的时候加ON DELETE CASCADE选项目的是可以在子表记录存在的情况下直接删除父表记录,而不用受约束的限制:
    SQL>  delete from PERSONPROFESSION;

    已删除 1 行。

    SQL> select  PERSONID,PROFESSION from person;

      PERSONID PROFESSION
    ---------- ----------
            10          1

    SQL> select * from PERSONPROFESSION;

    未选定行

    以上可以看出父表记录删除了,子表记录还存在。

    那么在delete语句的末尾加上CASCADE,就可以实现两张表的级删除:

    SQL> delete from PERSONPROFESSION cascade;

    已删除 1 行。

    SQL> select * from person;

    未选定行

    SQL> select * from PERSONPROFESSION;

    未选定行


    以下是ON DELETE的官方解释:

    ON DELETE
    The ON DELETE clause indicates that when a DELETE is executed on a referenced row in the referenced table, one of the following actions will be executed upon the constrained column, as specified by action:

    NO ACTION(default)
    The NO ACTION clause produces an error if the reference is violated. This is the default if action is not specified.

    CASCADE
    The CASCADE keyword removes all rows which reference the deleted row. Exercise caution with this action.

    SET NULL
    The SET NULL clause assigns a NULL value to all referenced column values.

  • Oracle下建立同义词(Synonym)

    2008-10-14 20:55:59

    问题描述:
    有两个oralce数据库用户:lyweb@martdb1和lylocal@martdb1

    lylocal@martdb1下的表ft_mid_user_daily
    在lyweb@martdb1下要用该表
    想在lyweb@martdb1下进行如下操作:
    select * from ft_mid_user_daily

    问题解答:

    1.在lylocal@martdb1下进行赋权限:
    grant  select on ft_mid_user_daily to lyweb;
    2.在lyweb@martdb1下进行如下操作:

    create or replace synonym ft_mid_user_daily  for lylocal.ft_mid_user_daily;
     
    需要注意的一点:
    在lyweb@martdb1中不能包含有表ft_mid_user_daily,虽然create or replace synonym 语句可以执行,但是执行select * from ft_mid_user_daily(本意为想读lylocal@martdb1下的ft_mid_user_daily中的内容),但显示的还是lyweb@martdb1下的表ft_mid_user_daily内容,需要先把lyweb@martdb1下的表ft_mid_user_daily删除掉,重新建立synonym即可。

  • Oracle的同义词(synonyms)总结

    2008-10-14 20:52:18

    Oracle的同义词(synonyms)总结 [收藏] [打印] [推荐]
    作者:中国IT实验室  2008-09-06 07:11:44
    oracle的同义词总结:

    从字面上理解就是别名的意思,和试图的功能类似。就是一种映射关系。

    1.创建同义词语句:

    create public synonym table_name for user.table_name;

    其中第一个user_table和第二个user_table可以不一样。

    此外如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个Database Link(数据库连接)来扩展访问,然后在使用如下语句创建数据库同义词:create synonym table_name for table_name@DB_Link;

    当然,你可能需要在user用户中给当前用户(user2)授权: grant select/delete/update on user2

    2.删除同义词:

    drop public synonym table_name;

    3.查看所有同义词:

    select * from dba_synonyms

    同义词拥有如下好处:节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;同义词可以创建在不同一个数据库服务器上,通过网络实现连接。

  • Oracle的NLS设置

    2008-10-10 14:21:25

    一:介绍一个概念:
      NLS  ‘National Language Support (NLS)’ 从概念我们看出这个参数实际上定义了数据库的存放数据的语言环境,当我们设定一种nls的时候实际上我们是为oracle在存放数据时指定了他的语种所特 有的一些表达形式,比如我们选择chinese,那么它的中文字符如何存放,按什么规则排序,货币如何表示,日期格式也就被设定了。
      
      二:如何查询我们的数据库中到底使用的是什么字符集
      SQL> select * from V$NLS_PARAMETERS;
      NLS_LANGUAGE                     SIMPLIFIED CHINESE
      NLS_TERRITORY                          CHINA
      NLS_CURRENCY                           RMB
      NLS_ISO_CURRENCY                         CHINA
      NLS_NUMERIC_CHARACTERS                      .,
      NLS_CALENDAR                         GREGORIAN
      NLS_DATE_FORMAT                       DD-MON-RR
      NLS_DATE_LANGUAGE                  SIMPLIFIED CHINESE
      NLS_CHARACTERSET                       ZHS16GBK
      NLS_SORT                             BINARY
      NLS_TIME_FORMAT                      HH.MI.SSXFF AM
      NLS_TIMESTAMP_FORMAT             DD-MON-RR HH.MI.SSXFF AM
      NLS_TIME_TZ_FORMAT                  HH.MI.SSXFF AMTZR
      NLS_TIMESTAMP_TZ_FORMAT         DD-MON-RR HH.MI.SSXFF AM TZR
      NLS_DUAL_CURRENCY                        RMB
      NLS_NCHAR_CHARACTERSET                  AL16UTF16
      NLS_COMP                             BINARY
      NLS_LENGTH_SEMANTICS                       BYTE
      NLS_NCHAR_CONV_EXCP                       FALSE
      其中nls_language表示了中文显示方式,nls_characterset是字符集设定,另外date,time等为日期时间的格式,currency是货币格式。
      
      三:存在问题及解决方法
      我们在使用字符集过程中主要存在两种问题。
      
      一是我们在查询时显示中文部分显示乱字符。
      这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。只要将两者修改一致就可以解决问题。
      在windows里需要到注册表里local machine-software-oracle-home0里更改nls_lang,unix下需要在.profile或这.bash_profile(根据你用的shell)里更改nls_lang.
      二是我们在导入数据时提示字符集不匹配问题。(有些可以兼容的不用管)
      解决方法目前我看到3种
       1:)exp/imp与sql*plus一样是客户端产品,因此他的字符集是由服务端的nls_lang所设定的。用exp导出备份的export file时,字符集的设定也被存放在export file里。这就是有些人在imp发生字符无法转换时更改export file文件头的原理。(相关内容可以看看http://chinaunix.net/forum/viewtopic.php?t=22352& amp;highlight=字符)
      2:) <=8.1
      在imp之前执行SQL > create database character set US7ASCII 
      * create database character set US7ASCII 
      ERROR at line 1: 
      ORA-01031: insufficient privileges 
       ---- 你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上ORACLE数据库的字符集已被强行修改为US7ASCII,接着用imp命令装载 数据。等数据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE数据库,在sql>命令提示符下,运行select * from V$NLS_PARAMETERS,可以看到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正确显示。 
      3:)用数据管道导入数据
      这种方法我早期用过pb6的数据管道,将数据管道连接至需要导入导出的两个数据库进行数据传输,传输后中文显示没有问题。
      4:)更该数据字典props$  >8.1
      1. )Use SQL*Plus connect to database as user SYS 
      2. )Issue this below command 
      SQL> UPDATE PROPS$ SET VALUE$='xxx' WHERE NAME='NLS_CHARACTERSET'; 
      3.) Shutdown database and restart it 
      最后添加一个关于字符集可以自动转换方面的(在imp时):
      Warning You can't change character set of current database that have number of bits greater than the new one. For example, 
      我理解就是7-8 can,8-8ican,8-8cannot,8-7cannot
      US7ASCII -> WE8ISO8859P1 => Can 
      TH8TISASCII -> US7ASCII => Cannot 
      WE8ISO8859P1 -> TH8TISASCII => Cannot 
      TH8TISASCII -> WE8ISO8859P1 => Can 
      US7ASCII -> TH8TISASCII => Can
  • Oracle的系统服务

    2008-10-09 09:50:40

    Oracle的系统服务。在完全安装的情况下,Oracle的系统服务共有11项:
        1.Oracle OLAP 9.0.1.0.1
        2.Oracle OLAP Agent
        3.OracleOraHome90Agent
        4.OracleOraHome90ClientCache
        5.OracleOraHome90HTTPServer
        6.OracleOraHome90ManagementServer(0.5M)
        7.OracleOraHome90PagingServer
        8.OracleOraHome90SNMPPeerEncapsulator
        9.OracleOraHome90SNMPPeerMasterAgent
        10.OracleOraHome90TNSListener(5.2M)
        11.OracleServiceORACLE(70M)
    (注:OraHome90是可以在安装时改变的Oracle的主目录名称,是安装时的默认值)

    其中最重要的服务有3个,分别是OracleOraHome90ManagementServer、oracleOraHome90TNSListener与OracleServiceORACLE。下面就来看一下有哪些启动错误与它们有关。

        1.Oracle系统提示:Ora-12541:TNS:没有监听器;
        2.操作系统提示:在本地计算机无法启动OMS服务 错误:1053:服务并未及时响应来控制请求附带;
        以上两种错误提示大都是由OracleOraHome90TNSListener监听服务引起的。
        解决方法:控制面版->管理工具->服务->右键单击“OracleOraHome90TNSListener”,再单击“启动”。

        3.Oracle系统提示:Ora-12500:TNS:监听程序无法启动专用服务器进程;
        该错误是由OracleServiceORACLE专用服务器进程引起的。
        解决方法:控制面版->管理工具->服务->右键单击“OracleServiceORACLE”,再单击“启动”。

        4.Oracle系统提示:VTK-1000:无法连接到Management Server。请验证您已输入Oracle Management Server的正确主机名和状态。
        该错误引起的原因有两种,一是OracleOraHome90ManagementServer还没启动;二是没有输入主机名。
        解决方法:控制面版->管理工具->服务->右键单击“OracleOraHome90ManagementServer”,再单击“启动”,或是输入您这台计算机的完整名称。

      
        接着针对第二点谈谈登录时用的用户名和口令。在安装结束后,系统提供了两个默认的数据库系统管理员,其用户名和口令分别是 SYS/change_on_install和SYSTEM/manager,同时系统还提供了登录OMS的用户名和口令:sysman /oem_temp。这里容易出现错误的是在登录OMS是用SYS或SYSTEM作为用户名进行登录,那么Oracle系统就回有“登录身份证明不正确” 的提示。

       小结:这三个服务的启动或关闭还有先后的顺序。一般来讲,启动时必须先启动OracleOraHome90TNSListener再启动 OracleOraHome90ManagementServer或OracleServiceORACLE,在启动 OracleOraHome90ManagementServer时,同时也启动了OracleServiceORACLE。而关闭时必须先关闭 OracleOraHome90ManagementServer再关闭OracleOraHome90TNSListener或 OracleServiceORACLE,关闭OracleOraHome90ManagementServer时,若有提示输入用户名和口令,请输入 sysman的用户名和口令,以确保成功的执行。有些其他提示如:资源已被占用,I/O重复,端口已被使用等等之类的话,那最好与系统管理员联系,再寻求 解决办法。

  • sequence

    2008-09-25 18:47:07

    在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。 
    1、Create Sequence 
    你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限, 
    CREATE SEQUENCE emp_sequence 
        INCREMENT BY 1  -- 每次加几个 
        START WITH 1    -- 从1开始计数 
        NOMAXVALUE      -- 不设置最大值 
        NOCYCLE         -- 一直累加,不循环 
        CACHE 10; 

    一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL 
     CURRVAL=返回 sequence的当前值 
     NEXTVAL=增加sequence的值,然后返回 sequence 值 
    比如: 
      emp_sequence.CURRVAL 
      emp_sequence.NEXTVAL 

    可以使用sequence的地方: 
    - 不包含子查询、snapshot、VIEW的 SELECT 语句 
    - INSERT语句的子查询中 
    - NSERT语句的VALUES中 
    - UPDATE 的 SET中   

    可以看如下例子: 
    INSERT INTO emp VALUES  
    (empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20); 

    SELECT empseq.currval     FROM DUAL; 

    但是要注意的是: 
    - 第 一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回 当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的 值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白? 

    - 如果指定CACHE值,ORACLE就可以 预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳 号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在 create sequence的时候用nocache防止这种情况。 

    2、Alter Sequence 
    你或者是该 sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有 sequence参数.如果想要改变start值,必须 drop  sequence 再 re-create . 
    Alter sequence 的例子 
    ALTER SEQUENCE emp_sequence 
        INCREMENT BY 10 
        MAXVALUE 10000 
        CYCLE    -- 到10000后从头开始 
        NOCACHE ; 


    影响Sequence的初始化参数: 
    SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。  

    可以很简单的Drop Sequence 
    DROP SEQUENCE order_seq; 
  • 嵌套查询

    2008-09-11 13:45:48

    嵌套查询
    定义:
    1 .指在一个外层查询中包含有另一个内层查询。其中外层查询称为主查询,内层查询称为子查询。
    2 .SQL允许多层嵌套,由内而外地进行分析,子查询的结果作为主查询的查询条件
    3 .子查询中一般不使用order by子句,只能对最终查询结果进行排序
    子查询(sub query)
    where  表达式  [ not ]   in  (子查询)
    where  表达式 比较运算符 [ any|all ]  子查询
    where   [ not ]   exists  (子查询)

    1 .子查询-单值比较
    返回单值子查询,只返回一行一列
    主查询与单值子查询之间用比较运算符进行连接:
    运算符:
    > , >= , < , <= , = , <>
    例:找出与太行同龄的同事
    select   *   from  company
    where  age  =  ( select  age  from  company
                 
    where  name = taihang)

    2 .子查询- in
    例:查询选修了‘
    001 ’课程的学生学号,姓名。
    select  id,name
    from  student
    where  id  in  ( select  id 
                 
    from  taihang
                 
    where  id = ' 001 ' )

    3 .子查询-多值比较all
    多行一列
    1 .父查询与多值子查询之间的比较需用all来连接
    2 .标量值S比子查询返回集R中的每个都大时,s >all ,r为true
    3 .all表示所有
    4 . >all , <all , >=all , <=all , <>all ,注:all等价于not  in
    例:找出年龄最小的学生
    select   *   from  student
    where  age <all ( select  age  from  student)

    4 .子查询-多值比较some /any
    1 .父查询与多值子查询之间的比较需用some / any来连接
    2 .标量值S比子查询返回集r中的某一个都大时,s > some时r为true 或s > any时r为true
    3 .some表示部分
    4 . >some , >=some , =some , <some , <=some , <>some ,注: = some等价于in, <> some不等价于not  in .
    例:找出不是最小年龄的学生
    select   *   from  student
    where  age  >   some ( select  age  from  student)

    5 .子查询-存在判断exists
    1 . exists+ 子查询用来判断该子查询是否返回元组
    2 .当子查询的结果集非空时,exists为true
    3 .当子查询的结果集为空时,exists为false
    4 .不关心子查询的具体内容,因此用select  *
    例:列出先修了C01课程的学习的学号,姓名
    select  son,sname
    from  strdent
    where   exists ( select   *   from  sc
                 
    where  sc.sno = stusent.sno  and
                 cno
    = ' C01 ' )
    最后这一个不是很好理解呀!等用多了就好了。
  • Oracle索引概述

    2008-08-29 16:58:24

    概述

      索引在各种关系型数据库系统中都是举足轻重的组成部分,其对于提高检索数据的速度起至关重要的作用。在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等。本文主要就前6种索引进行分析。

      首先给出各种索引的简要解释:

      b*tree index:几乎所有的关系型数据库中都有b*tree类型索引,也是被最多使用的。其树结构与二叉树比较类似,根据rid快速定位所访问的行。

      反向索引:反转了b*tree索引码中的字节,是索引条目分配更均匀,多用于并行服务器环境下,用于减少索引叶的竞争。

      降序索引:8i中新出现的索引类型,针对逆向排序的查询。

      位图索引:使用位图来管理与数据行的对应关系,多用于OLAP系统。

      函数索引:这种索引中保存了数据列基于function返回的值,在select * from table where function(column)=value这种类型的语句中起作用。

  • Oracle初学者入门指南-索引是干什么用的?

    2008-08-29 16:55:39

    关于索引是什么的最简单的比喻是,索引之于表数据如同目录之于一本书。

     

    通过目录的页码我们可以快速的定位一个内容,同样通过索引记录的rowid我们可以快速的定位一条数据。

     

    如同目录很难针对书中每个字词一样,索引也很难针对所有字段。

     

    我们通常索引最能代表章节,记录属性的内容。

     

    索引并非总能带来性能提升,但是通常情况下,索引能加快访问,所以建表的时候,你一定要知道还有索引这样一类对象。

     

    下面这个案例是我们绝对不应该和不想看到的。

     

    今天一个部门报数据库巨慢无比,上去看了一下,抓到如下的SQL:

    SQL> select sql_text

      2  from v$sqltext a

      3  where a.hash_value = (

      4  select sql_hash_value from v$session b

      5  where b.sid='&sid'

      6  )

      7  order by piece asc

      8  /

     

    SQL_TEXT

    ----------------------------------------------------------------

    select * from i_cm_power t WHERE T.SJH='13911xxxxx6'

     

    检查了一下该查询访问的数据表,居然一个索引都没有:

    SQL> select index_name from dba_indexes where table_name=upper('i_cm_power');

     

    INDEX_NAME

    ------------------------------

     

    没有索引意味着,即使为了获取这一条记录,Oracle也必须对5.28G的一个表进行全表扫描,如果不慢那就怪了:

    SQL> col segment_name for a20

    SQL> select segment_name,bytes/1024/1024/1024

         from dba_segments where segment_name=upper('i_cm_power');

     

    SEGMENT_NAME         BYTES/1024/1024/1024

    -------------------- --------------------

    I_CM_POWER                  5.28173828125

     

    创建一个索引再说:

    SQL> create index idx_i_cm_power_sjh on i_cm_power(sjh);

     

    Index created.

     

    Elapsed: 00:20:50.73

     

    SQL> col segment_name for a20

    SQL> select segment_name,bytes/1024/1024 MB

      2  from dba_segments where segment_name=upper('idx_i_cm_power_sjh');

     

    SEGMENT_NAME                 MB

    -------------------- ----------

    IDX_I_CM_POWER_SJH         1360

     

    SQL>

     

    无疑这个索引对于这样的简单查询是大有益处的:

     

    SQL> select * from i_cm_power t WHERE T.SJH='13911xxxxx6';

     

    Elapsed: 00:00:00.07

     

    Execution Plan

    ----------------------------------------------------------

       0      SELECT STATEMENT ōptimizer=CHOOSE

       1    0   TABLE ACCESS (BY INDEX ROWID) OF 'I_CM_POWER'

       2    1     INDEX (RANGE SCAN) OF 'IDX_I_CM_POWER_SJH' (NON-UNIQUE)

     

     

    Statistics

    ----------------------------------------------------------

              0  recursive calls

              0  db block gets

              6  consistent gets

              0  physical reads

              0  redo size

           1022  bytes sent via SQL*Net to client

            503  bytes received via SQL*Net from client

              2  SQL*Net roundtrips to/from client

              0  sorts (memory)

              0  sorts (disk)

              2  rows processed

     

    然而在实际中,你需要考虑更多的因素。

     

    增加索引会占用更多的存储空间;索引的维护会增加数据库的负担,如果有海量的数据加载,可能会极大影响性能...

     

    所以事实可能总是比你想象的更复杂,你只有知道的更多...

  • 数据库的索引

    2008-08-29 16:54:26

    阅读提示:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

    索引

    使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列多列的值进行排序的一种结构,例如 employee 表的姓(lname)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。

    索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。

    在数据库关系图中,您可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。有关详细信息,请参见创建索引。

    注意;并非所有的数据库都以相同的方式使用索引。有关更多信息,请参见数据库服务器注意事项,或者查阅数据库文档。

    作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的。

    索引列

    可以基于数据库表中的单列或多列创建索引。多列索引使您可以区分其中一列可能有相同值的行。

    如果经常同时搜索两列或多列或按两列或多列排序时,索引也很有帮助。例如,如果经常在同一查询中为姓和名两列设置判据,那么在这两列上创建多列索引将很有意义。

    确定索引的有效性:

    • 检查查询的 WHERE 和 JOIN 子句。在任一子句中包括的每一列都是索引可以选择的对象。
    • 对新索引进行试验以检查它对运行查询性能的影响。
    • 考虑已在表上创建的索引数量。最好避免在单个表上有很多索引。
    • 检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引。
    • 检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比较的结果就是该列的可选择性,这有助于确定该列是否适合建立索引,如果适合,确定索引的类型。
    索引类型

    根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引主键索引聚集索引。有关数据库所支持的索引功能的详细信息,请参见数据库文档。

    提示:尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。

    唯一索引

    唯一索引是不允许其中任何两行具有相同索引值的索引。

    当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在 employee 表中职员的姓 (lname) 上创建了唯一索引,则任何两个员工都不能同姓。

    主键索引

    数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。

    在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

    聚集索引

    在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

    如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

  • SQL语句 SELECT LIKE like用法详解

    2008-08-22 11:33:30

    LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的。

      假设有一个数据库中有个表table1,在table1中有两个字段,分别是namesex二者全是字符型数据。现在我们要在姓名字段中查询以“张”字开头的记录,语句如下:

       select * from table1 where name like "*"

       如果要查询以“张”结尾的记录,则语句如下:

      select * from table1 where name like "*"

       这里用到了通配符“*”,可以说,like语句是和通配符分不开的。下面我们就详细介绍一下通配符。

      
    匹配类型  
      
    模式
      举例 及 代表值
      
    说明
      

     

    *

    多个字符

    c*c

    cc,cBc,cbc,cabdfec

    它同于DOS命令中的通配符,代表多个字符

    %

    多个字符

    %c%

    agdcagd

    这种方法在很多程序中要用到,主要是查询包含子串的。

    a

    特殊字符

    a

    a*a

    代替*

    #

    单数字

    k#k

    k1k,k8k,k0k

    大致同上,不同的是代只能代表单个数字。

    -

    字符范围

    [a-z]

    代表az26个字母中任意一个

    指定一个范围中任意一个

    !

    排除

    [!a-z]

    代表9,0,%,*

     

     

    组合类型

    cc[!a-d]#

    代表ccF#

     

      

    可以和其它几种方式组合使用
      假设表table1中有以下记录:
      name sex
      张小明    男
      李明天    男
      李a天    女
      王5五    男
      王清五    男
      下面我们来举例说明一下:
       例1,查询name字段中包含有“明”字的。
      select * from table1 where name like '%%'
       例2,查询name字段中以“李”字开头。
      select * from table1 where name like '*'
       例3,查询name字段中含有数字的。
      select * from table1 where name like '%[0-9]%'
       例4,查询name字段中含有小写字母的。
      select * from table1 where name like '%[a-z]%'
      例5,查询name字段中不含有数字的。
      select * from table1 where name like '%[!0-9]%'
      以上例子能列出什么值来显而易见。但在这里,我们着重要说明的是通配符“*”与“%”的区别。
      很多朋友会问,为什么我在以上查询时有个别的表示所有字符的时候用"%"而不用“*”?先看看下面的例子能分别出现什么结果:
      select * from table1 where name like '**'
       select * from table1 where name like '%%'
      大家会看到,前一条语句列出来的是所有的记录,而后一条记录列出来的是name字段中含有“明”的记录,所以说,当我们作字符型字段包含一个子串的查询时最好采用“%”而不用“*,用“*”的时候只在开头或者只在结尾时,而不能两端全由“*”代替任意字符的情况下。
  • 套表建立

    2008-08-22 11:24:44

    1、执行如下语句找出需要建立的月表及其owner

    select owner,table_name from dba_tables where owner in('KF','XG') and table_name like '%200607%'

    2、手工取这些表的建表脚本来建立下个月的套表

    3、注意:由于新需求的增加或者其他原因导致套表的数据库表结构修改时,需要对已经提前建好的套表进行修改。
  • 数据库设计工具对比

    2008-08-18 11:14:48

    PowerDesign:PowerDesign是Sybase推出的主打数据库设计工具。PowerDesign致力于采用基于Entiry- Relation的数据模型,分别从概念数据模型(Conceptual Data Model)和物理数据模型(Physical Data Model)两个层次对数据库进行设计。概念数据模型描述的是独立于数据库管理系统(DBMS)的实体定义和实体关系定义。物理数据模型是在概念数据模型 的基础上针对目标数据库管理系统的具体化。

        ERWin:这个是CA公司的拳头产品,它有一个兄弟是BPWin,这个是CASE工具的一个里程碑似的产品。ERWin界面相当简洁漂 亮,也是采用ER模型,如果你是开发中小型数据库,极力推荐ERWin,它的Diagram给人的感觉十分清晰。在一个实体中,不同的属性类型采用可定制 的图标显示,实体与实体的关系也一目了然。ERWin不适合非常大的数据库的设计,因为它对Diagram欠缺更多层次的组织。

    如何一次性将表结构的脚本导出来?
        Database --->Generate Database ---> Genarate scrīpt 就可实现。

    Name用中文英文以便查询、写程序的时候方便, Code才是最终产生的Table Name

    PowerDesigner中建了模型,如何把它作为文档导出?
        利用REPORT。选择一个模板,然后就生成了RTF或是HTM格式的文档

    如何将已经存在的数据库所有表,导入到PowerDesign中?
        用PD里的反向工程file--->reverse engineering ===> and go on

    概念数据模型(CDM)
        CDM表现数据库的全部逻辑的结构,与任何的软件或数据储藏结构无关。一个概念模型经常包括在物理数据库中仍然不实现的数据对象。它给运行计划或业务活动的数据一个正式表现方式。不考虑物理实现细节,只考虑实体之间的关系。

    物理数据模型 (PDM)
        PDM叙述数据库的物理实现。主要目的是把CDM中建立的现实世界模型生成特定的DBMS脚本,产生数据库中保存信息的储存结构,保证数据在数据库中的完整性和一致性。

    面向对象模型 (OOM)
        一个OOM包含一系列包,类,接口和他们的关系。这些对象一起形成所有的(或部份)一个软件系统的逻辑的设计视图的类结构。一个OOM本质上是软件系统的一个静态的概念模型。

    业务程序模型(BPM)
        BPM描述业务的各种不同内在任务和内在流程,而且客户如何以这些任务和流程互相影响。BPM是从业务合伙人的观点来看业务逻辑和规则的概念模型,使用一个图表描述程序,流程,信息和合作协议之间的交互作用。

    正向工程
        你能直接地从PDM产生一个数据库, 或产生一个能在你的数据库管理系统环境中运行的数据库脚本。可以生成数据库脚本,如果选择ODBC方式,则可以直接连接到数据库,从而直接产生数据库表以及其他数据库对象。

    逆向工程
        将已存在的数据库产生进新的PDM 之内。数据来源可能是从脚本文件或一个开放数据库连接数据来源。

        并不是每个设计都需要用到Power Designer。 例如:小的系统,或Table数比较少的情况下就没有必要采用Power Designer了。

    设计步骤

    CDM PDM OOM三者转换关系

    2004-08-22更新

    PowerDesigner仅仅是实现的工具
        不要以为Power能帮你把关系什么的全部建立好,很多数据库理论只是还是需要的,设计数据库的时候,那些范式什么的,一定要掌握。
        设计一个好的数据库,最好的工具不是必须的,但是基础理论是一定要的。

    PowerDesigner用途不局限于数据建模
        还可以用PowerDweigner设计web service

    并不是每个设计都需要用到PD
        用Powerdesigner对付比较大型的项目,是很好的,对于短平快类型的项目,如果时间要求 你1个星期完成一个程序,那么完全没有必要用PowerDesigner,直接维护数据库就可以了,当表的数量超过10个(一个小系统的表在10个左右) 的时候,建议还是用用Powerdesigner 。
        我的看法:如果想做成一个比较规范的数据库,小项目也可以用。毕竟生成报表和正反向工程很有用。

    零碎

        PD中的CDM设计时,可以将所有需要的字段都定义好。然后在设计实体是直接取出来。PD提供了这样的统一管理的工具。在PD菜单栏-Model-Data Item下。

        为了使自己设计的CDM看起来象样一点,可以从工具栏中,拖动一个Title。其显示的信息,是当前CDM的属性值。

        为了使实体等Symbol看起来显眼和舒服。可以根据个人喜好进行外观上的调整。当前设计界面中,右键-Display Perferences中进行设置。还可以增加shadow效果。选中Symbol后,Ctrl+W。或者右键菜单。

        为了使布局整齐。选中需要调整的Symbol后,菜单-Symbol-Align进行设置。快捷键:ctrl+UP,ctrl+Down,ctrl+Left,ctrl+Right即为上下左右对齐。

        设计实体属性时注意的细节:M:表示强制非空;P:是否为主键;D:是否在模型中显示。gerenate:表示是否作为表生成。

        默认情况下,CDM的实体会显示Identifier一栏。如果不想其显示出来,在右键-Display Perferences中ObjectView-Entity中设置。

        关系的命名方法是:实体名1 实体名2。

        关系中的角色(Role)表示联系线上一个方向上的含义。用一个动词来描述。Role只是起一个描述作用。

        依赖(Dependency):表示在联系中一个实体的存在是否依赖于另一个实体。寄生实体(Dependent Entity)是一种部分地被另一实体确定的实体。在依赖联系中,一个实体与另一实体通过标识符相联系,当一个实体的存在没有另一个实体的存在作为参考就 不能唯一确定时,两个实体间就存在依赖联系。
        主从表就是典型的依赖关系。

        中间实体(Associative Entity):是为了解决多对多联系而产生的一个人工实体,能够为中间实体定义属性。用鼠标右键单击多对多联系线,在弹出的菜单中选择“Change to entity”,能够把这个联系转换成连接两个实体的中间实体。
        善于利用自动生成的中间实体,可以简化设计工作,提高数据库设计的正确性。
        中间实体一般不用再加入新的字段。

        牢记:外键是通过关系Relationship自动来建立的,不需要手动建立。不然会产生多余的键。所以设计时,关注实体本身的字段,以及实体间的关系,特别是多对多和依赖关系。

        从CDM到PDM的转换需要注意:


    不能改变Diagram的名称
    在树状图中,如果钩选红色标出的Symbol表示覆盖修改,不钩选表示保护修改。

        数据库为了保证数据完整性和一致性,提出了约束。即表约束,列约束以及参照完整性约束。通常数据库设计和程序开发不是绝对的分离的。所以前两者在实际开发过程中逐渐的完善。需要注意的还是参照完整性约束。
        在PD中前两者的设定是对字段,后者是对关系。

        参照完整性约束


    限制(Restrict)。不允许进行修改或删除操作。若修改或删除主表的主键时,如果子表中存在子记录,系统将产生一个错误提示。这是缺省的参照完整性设置。
    置空(Set Null)。如果外键列允许为空,若修改或删除主表的主键时,把子表中参照的外键列设置为空值(NULL)。
    置为缺省(Set Default)。如果指定了缺省值,若修改或删除主表的主键时,把子表中参照的外键设置为缺省值(Default)。
    级联(Cascade)。把主表中主键修改为一个新的值时,相应修改子表中外键的值;或者删除主表中主键的记录时,要相应删除子表中外键的记录。

        注意理解以上的约束时,抓住操作的都是主表。子表的操作都是相对主表来说的。操作方式就是Update和Delete。

        引用基础数据表的数据时,可以建立对应的视图。选中需要作为视图的表,菜单栏-Tools-Create View

        PD支持对已有数据的表更新表结构。不过需要谨慎操作,检查生成的SQL脚本。

        PD也可以生成随机的测试数据。

        触发器就是DBMS中提供的事件驱动机制。发生在表的Insert,Update和Delete。执行SQL语句或存储过程。

        在PD中可以完成存储过程的编写,也便于管理。

        逆向工程可以通过数据库脚本或者通过ODBC数据源来实现。

  • 视图的概念

    2008-08-07 15:43:23

    视图是原始数据库数据的一种变换,是查看表中数据的另外一种

    方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的

    数据。

        视图是从一个或多个实际表中获得的,这些表的数据存放在数据

    库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从

    另一个视图中产生。

        视图的定义存在数据库中,与此定义相关的数据并没有再存一份

    于数据库中。通过视图看到的数据存放在基表中。

        视图看上去非常象数据库的物理表,对它的操作同任何其它的表

    一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反

    地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑

    上的原因,有些视图可以修改对应的基表,有些则不能(仅仅能查询)。

     

    视图的作用

         * 简单性。看到的就是需要的。视图不仅可以简化用户对数据的理

    解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,

    从而使得用户不必为以后的操作每次指定全部的条件。

        * 安全性。通过视图用户只能查询和修改他们所能见到的数据。数

    据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用

    户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特

    定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上:

          使用权限可被限制在基表的行的子集上。

          使用权限可被限制在基表的列的子集上。  

          使用权限可被限制在基表的行和列的子集上。  

          使用权限可被限制在多个基表的连接所限定的行上。  

          使用权限可被限制在基表中的数据的统计汇总上。

          使用权限可被限制在另一视图的一个子集上,或是一些视图和基表

    合并后的子集上。

         * 逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。

     

    视图的安全性

         视图的安全性可以防止未授权用户查看特定的行或列,是用户只能

    看到表中特定行的方法如下:

        1 在表中增加一个标志用户名的列;

        2 建立视图,是用户只能看到标有自己用户名的行;

        3 把视图授权给其他用户。

     

    逻辑数据独立性

        视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,

    应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,

    从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序

    与数据独立:

        1 如果应用建立在数据库表上,当数据库表发生变化时,可以在表

    上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。

        2 如果应用建立在数据库表上,当应用发生变化时,可以在表上建

    立视图,通过视图屏蔽应用的变化,从而使数据库表不动。

        3 如果应用建立在视图上,当数据库表发生变化时,可以在表上修

    改视图,通过视图屏蔽表的变化,从而应用程序可以不动。

        4 如果应用建立在视图上,当应用发生变化时,可以在表上修改视

    图,通过视图屏蔽应用的变化,从而数据库可以不动。

  • 查询经典语句

    2008-07-31 09:28:23

    SQL分类:
    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

    首先,简要介绍基础语句:

    1、说明:创建数据库
    CREATE DATABASE database-name

    2、说明:删除数据库
    drop database dbname

    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'

    --- 开始 备份
    BACKUP DATABASE pubs TO testBack

    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only

    5、说明:删除新表drop table tabname

    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

    7、说明:添加主键: Alter table tabname add primary key(col)
    说明:删除主键: Alter table tabname drop primary key(col)

    8、说明:创建索引:create [unique] index idxname on tabname(col….)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。

    9、说明:创建视图:create view viewname as select statement

       删除视图:drop view viewname

    10、说明:几个简单的基本的sql语句

    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count * as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1

    11、说明:几个高级查询运算词

    A: UNION 运算符

    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

    B: EXCEPT 运算符

    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

    C: INTERSECT 运算符

    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    注:使用运算词的几个查询结果行必须是一致的。

    12、说明:使用外连接
    A、left outer join:

    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
    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

    B:right outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

    C:full outer join:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句

    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1
    法二:select top 0 * into b from a

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

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    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 .....

    12、说明:日程安排提前五分钟提醒
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录
    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1
    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
      
    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
      对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
    Randomize
    RNumber = Int(Rnd*499) +1
     
    While Not objRec.EOF
    If objRec("ID") = RNumber THEN
    ... 这里是执行脚本 ...
    end if
    objRec.MoveNext
    Wend
     
       这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一 个数据库内就包含了成千上万条记录。这时候不就死定了?
      采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
    Randomize
    RNumber = Int(Rnd*499) + 1
     
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
     
    set ōbjRec = ObjConn.Execute(SQL)
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
     
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
    再谈随机数
      现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
      为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3
     
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):
    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

      注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

     
    随机读取若干条记录,测试过
    Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
    Sql server:select top n * from 表名 order by newid()
    mysqlelect * From 表名 Order By rand() Limit n
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
    使用SQL语句 用...代替过长的字符串显示
    语法:
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
     
    Conn.Execute说明
    Execute方法
      该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
        1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
        Set 对象变量名=连接对象.Execute("SQL 查询语言")
       Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

        2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
        连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
          ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
          ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

    ·BeginTrans、RollbackTrans、CommitTrans方法
      这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
      事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
       BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过 连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一 个错误信息。

Open Toolbar