发布新日志

  • SQL Server字符串处理函数大全

    2008-04-14 13:00:12

    select 字段1 from 表1 where 字段1.IndexOf("云")=1;
            这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。
    left()是sql函数。
            select 字段1 from 表1 where charindex('云',字段1)=1; 字符串函数对二进制数据、字符串和表达式执行不同的运算。此类函数作用于CHAR、VARCHAR、 BINARY、 和VARBINARY 数据类型以及可以隐式转换为CHAR 或VARCHAR的数据类型。可以在SELECT 语句的SELECT 和WHERE 子句以及表达式中使用字符串函数。
            常用的字符串函数有:

    一、字符转换函数
    1、ASCII()
            返回字符表达式最左端字符的ASCII 码值。在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。
    2、CHAR()
            将ASCII 码转换为字符。如果没有输入0 ~ 255 之间的ASCII 码值,CHAR() 返回NULL 。
    3、LOWER()和UPPER()
            LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写。
    4、STR()
            把数值型数据转换为字符型数据。
    STR (<float_expression>[,length[, <decimal>]])
            length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的length 值为10, decimal 缺省值为0。
            当length 或者decimal 为负值时,返回NULL;
            当length 小于小数点左边(包括符号位)的位数时,返回length 个*;
            先服从length ,再取decimal ;
            当返回的字符串位数小于length ,左边补足空格。
    二、去空格函数
    1、LTRIM() 把字符串头部的空格去掉。

    2、RTRIM() 把字符串尾部的空格去掉。

    三、取子串函数
    1、left()
    LEFT (<character_expression>, <integer_expression>)
    返回character_expression 左起 integer_expression 个字符。

    2、RIGHT()
    RIGHT (<character_expression>, <integer_expression>)
    返回character_expression 右起 integer_expression 个字符。

    3、SUBSTRING()
    SUBSTRING (<expression>, <starting_ position>, length)
    返回从字符串左边第starting_ position 个字符起length个字符的部分。

    四、字符串比较函数
    1、CHARINDEX()
            返回字符串中某个指定的子串出现的开始位置。
    CHARINDEX (<’substring_expression’>, <expression>)
            其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。
            此函数不能用于TEXT 和IMAGE 数据类型。
    2、PATINDEX()
            返回字符串中某个指定的子串出现的开始位置。
            PATINDEX (<’%substring _expression%’>, <column_ name>)其中子串表达式前后必须有百分号“%”否则返回值为0。
            与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于CHAR、 VARCHAR 和TEXT 数据类型。

    五、字符串操作函数
    1、QUOTENAME()
            返回被特定字符括起来的字符串。
    QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character 标明括字符串所用的字符,缺省值为“[]”。
    2、REPLICATE()
            返回一个重复character_expression 指定次数的字符串。
    REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值,则返回NULL 。

    3、REVERSE()
            将指定的字符串的字符排列顺序颠倒。
    REVERSE (<character_expression>) 其中character_expression 可以是字符串、常数或一个列的值。

    4、REPLACE()
            返回被替换了指定子串的字符串。
    REPLACE (<string_expression1>, <string_expression2>, <string_expression3>) 用string_expression3 替换在string_expression1 中的子串string_expression2。

    4、SPACE()
    返回一个有指定长度的空白字符串。
    SPACE (<integer_expression>) 如果integer_expression 值为负值,则返回NULL 。

    5、STUFF()
            用另一子串替换字符串指定位置、长度的子串。
    STUFF (<character_expression1>, <start_ position>, <length>,<character_expression2>)
            如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回NULL 值。
            如果length 长度大于character_expression1 中 start_ position 以右的长度,则character_expression1 只保留首字符。


    六、数据类型转换函数
    1、CAST()
    CAST (<expression> AS <data_ type>[ length ])

    2、CONVERT()
    CONVERT (<data_ type>[ length ], <expression> [, style])

            1)data_type为SQL Server系统定义的数据类型,用户自定义的数据类型不能在此使用。
            2)length用于指定数据的长度,缺省值为30。
            3)把CHAR或VARCHAR类型转换为诸如INT或SAMLLINT这样的INTEGER类型、结果必须是带正号或负号的数值。
            4)TEXT类型到CHAR或VARCHAR类型转换最多为8000个字符,即CHAR或VARCHAR数据类型是最大长度。
            5)IMAGE类型存储的数据转换到BINARY或VARBINARY类型,最多为8000个字符。
            6)把整数值转换为MONEY或SMALLMONEY类型,按定义的国家的货币单位来处理,如人民币、美元、英镑等。
            7)BIT类型的转换把非零值转换为1,并仍以BIT类型存储。
            8)试图转换到不同长度的数据类型,会截短转换值并在转换值后显示“+”,以标识发生了这种截断。
            9)用CONVERT()函数的style 选项能以不同的格式显示日期和时间。style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式。
    七、日期函数
    1、day(date_expression) 
            返回date_expression中的日期值

    2、month(date_expression)
            返回date_expression中的月份值

    3、year(date_expression)
            返回date_expression中的年份值

    4、DATEADD()
    DATEADD (<datepart>, <number>, <date>)
            返回指定日期date 加上指定的额外日期间隔number 产生的新日期。
    5、DATEDIFF()
    DATEDIFF (<datepart>, <date1>, <date2>)
            返回两个指定日期在datepart 方面的不同之处,即date2 超过date1的差距值,其结果值是一个带有正负号的整数值。

    6、DATENAME()
    DATENAME (<datepart>, <date>)
            以字符串的形式返回日期的指定部分此部分。由datepart 来指定。

    7、DATEPART()
    DATEPART (<datepart>, <date>)
            以整数值的形式返回日期的指定部分。此部分由datepart 来指定。
    DATEPART (dd, date) 等同于DAY (date)
    DATEPART (mm, date) 等同于MONTH (date)
    DATEPART (yy, date) 等同于YEAR (date)

    8、GETDATE()
            以DATETIME 的缺省格式返回系统当前的日期和时间。

  • Oracle面试题目及解答

    2008-04-08 19:14:47

    从网上转来的,可能面试DBA的时候会有帮助吧。

            这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对oracle概念的熟悉程度。

    1. 解释冷备份和热备份的不同点以及各自的优点

            解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘)

    2. 你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?

            解答:重建控制文件,用带backup control file 子句的recover 命令恢复数据库。

    3. 如何转换init.ora到spfile?

            解答:使用create spfile from pfile 命令。

    4. 解释data block , extent 和 segment的区别(这里建议用英文术语)

            解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一个数据库对象拥有的所有extents被称为该对象的segment.

    5. 给出两个检查表结构的方法

            解答:1.describe命令
            2.dbms_metadata.get_ddl 包

    6. 怎样查看数据库引擎的报错

            解答:alert log.

    7. 比较truncate和delete 命令

            解答:两者都可以用来删除表中所有的记录。区别在于:truncate是ddl操作,它移动hwk,不需要 rollback segment .而delete是dml操作, 需要rollback segment 且花费较长时间。

    8. 使用索引的理由

            解答:快速访问表中的data block

    9. 给出在star schema中的两种表及它们分别含有的数据

            解答:fact tables 和dimension tables. fact table 包含大量的主要的信息而 dimension tables 存放对fact table 某些属性描述的信息

    10. fact table上需要建立何种索引?

            解答:位图索引(bitmap index)

    11. 给出两种相关约束?

            解答:主键和外键

    12. 如何在不影响子表的前提下,重建一个母表

            解答:子表的外键强制实效,重建母表,激活外键

    13. 解释归档和非归档模式之间的不同和它们各自的优缺点

            解答:归档模式是指你可以备份所有的数据库 transactions并恢复到任意一个时间点。非归档模式则相反,不能恢复到任意一个时间点。但是非归档模式可以带来数据库性能上的少许提高。

    14. 如何建立一个备份控制文件?

            解答:alter database backup control file to trace.

    15. 给出数据库正常启动所经历的几种状态 ?

            解答:startup nomount 数据库实例启动 startup mount 数据库装载 startup open 数据库打开

    16. 哪个column可以用来区别v$视图和gv$视图?

            解答: inst_id 指明集群环境中具体的某个instance .

    17. 如何生成explain plan?

            解答:运行utlxplan.sql. 建立plan 表针对特定sql语句,使用 explain plan set statement_id = ’tst1’ into plan_table 运行utlxplp.sql 或 utlxpls.sql察看explain plan

    18. 如何增加buffer cache的命中率?

            解答:在数据库较繁忙时,适用buffer cache advisory 工具,查询v$db_cache_advice . 如果有必要更改,可以使用 alter system set db_cache_size 命令

    19. ora-01555的应对方法?

            解答:具体的出错信息是snapshot too old within rollback seg , 通常可以通过增大rollback seg来解决问题。当然也需要察看一下具体造成错误的sql文本

    20. 解释$oracle_home和$oracle_base的区别?

            解答:oracle_base是oracle的根目录,oracle_home是oracle产品的目录。

  • 在SQL Server中快速删除重复记录

    2008-04-08 19:12:12

    聂霞 发布于 2007-08-29 15:00:52

    在SQL Server中快速删除重复记录(多图)


    文/夏翔   

            开发人员的噩梦——删除重复记录

      想必每一位开发人员都有过类似的经历,在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而导致查询和统计结果不准确。解决该问题的办法就是将这些重复的记录删除,只保留其中的一条。

      在SQL Server中除了对拥有十几条记录的表进行人工删除外,实现删除重复记录一般都是写一段代码,用游标的方法一行一行检查,删除重复的记录。因为这种方法需要对整个表进行遍历,所以对于表中的记录数不是很大的时候还是可行的,如果一张表的数据达到上百万条,用游标的方法来删除简直是个噩梦,因为它会执行相当长的一段时间。

      四板斧——轻松消除重复记录

      殊不知在SQL Server中有一种更为简单的方法,它不需要用游标,只要写一句简单插入语句就能实现删除重复记录的功能。为了能清楚地表述,我们首先假设存在一个产品信息表Products,其表结构如下:

    CREATE TABLE Products (
    ProductID int,
    ProductName nvarchar (40),
    Unit char(2),
    UnitPrice money
    )

      表中的数据如图1:

    在SQLServer中快速删除重复记录(多图)
    图表

      图1中可以看出,产品Chang和Tofu的记录在产品信息表中存在重复。现在要删除这些重复的记录,只保留其中的一条。步骤如下:

      第一板斧——建立一张具有相同结构的临时表

    CREATE TABLE Products_temp (
    ProductID int,
    ProductName nvarchar (40),
    Unit char(2),
    UnitPrice money
    )

      第二板斧——为该表加上索引,并使其忽略重复的值

      方法是在企业管理器中找到上面建立的临时表Products _temp,单击鼠标右键,选择所有任务,选择管理索引,选择新建。如图2所示。

      按照图2中圈出来的地方设置索引选项。

    在SQLServer中快速删除重复记录(多图)
    图2

      第三板斧——拷贝产品信息到临时表

    insert into Products_temp Select * from Products

      此时SQL Server会返回如下提示:

      服务器: 消息 3604,级别 16,状态 1,行 1

      已忽略重复的键。

      它表明在产品信息临时表Products_temp中不会有重复的行出现。

      第四板斧——将新的数据导入原表

      将原产品信息表Products清空,并将临时表Products_temp中数据导入,最后删除临时表Products_temp。

    delete Products
    insert into Products select * from Products_temp
    drop table Products_temp


      这样就完成了对表中重复记录的删除。无论表有多大,它的执行速度都是相当快的,而且因为几乎不用写语句,所以它也是很安全的。

      小提示:上述方法中删除重复记录取决于创建唯一索引时选择的字段,在实际的操作过程中读者务必首先确认创建的唯一索引字段是否正确,以免将有用的数据删除。

  • Oracle SQL 性能优化技巧

    2008-04-08 19:10:08

    1.选用适合的ORACLE优化器
             ORACLE的优化器共有3种 
             A、RULE (基于规则) b、COST (基于成本) c、CHOOSE (选择性)
            设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。 你当然也在SQL句级或是会话(session)级对其进行覆盖。
            为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。 
            如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。
            在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。
    2.访问Table的方式
            ORACLE 采用两种访问表中记录的方式: 
            A、 全表扫描 全表扫描就是顺序地访问表中每条记录。ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描。
            B、 通过ROWID访问表
            你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息。ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。
    3.共享SQL语句
            为了不重复解析相同的SQL语句,在第一次解析之后,ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。
            可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering),这个功能并不适用于多表连接查询。
            数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。
            当你向ORACLE提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。
            数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。
            共享的语句必须满足三个条件: 
            A、 字符级的比较: 当前被执行的语句和共享池中的语句必须完全相同。  
            B、 两个语句所指的对象必须完全相同。
            C、 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)。
    4.选择最有效率的表名顺序(只在基于规则的优化器中有效)
         ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。 如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。
    5.WHERE子句中的连接顺序
         ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
    6.SELECT子句中避免使用 ' * '
         当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 '*' 是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
    7.减少访问数据库的次数
         当执行每条SQL语句时,ORACLE在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等等。由此可见,减少访问数据库的次数,就能实际上减少ORACLE的工作量。
    8.使用DECODE函数来减少处理时间
         使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
    9.整合简单,无关联的数据库访问
         如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)
    10.删除重复记录
    11.用TRUNCATE替代DELETE

         当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息。 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)。 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复。因此很少的资源被调用,执行时间也会很短。
    12.尽量多使用COMMIT
           只要有可能,在程序中尽量多使用COMMIT,这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少
           COMMIT所释放的资源: 
           A、回滚段上用于恢复数据的信息。
           B、被程序语句获得的锁。 
           C、redo log buffer 中的空间。
           D、ORACLE为管理上述3种资源中的内部花费。
    13.计算记录条数
         和一般的观点相反,count(*) 比count(1)稍快,当然如果可以通过索引检索,对索引列的计数仍旧是最快的。例如 COUNT(EMPNO)
    14.用Where子句替换HAVING子句
         避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤。 这个处理需要排序,总计等操作。如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。
    15.减少对表的查询
         在含有子查询的SQL语句中,要特别注意减少对表的查询。
    16.通过内部函数提高SQL效率
    17.使用表的别名(Alias)
         当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
    18.用EXISTS替代IN
         在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用EXISTS(或NOT EXISTS)通常将提高查询的效率。
    19.用NOT EXISTS替代NOT IN
         在子查询中,NOT IN子句将执行一个内部的排序和合并。 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。
    20.用表连接替换EXISTS
         通常来说 , 采用表连接的方式比EXISTS更有效率
    21.用EXISTS替换DISTINCT
         当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。 一般可以考虑用EXIST替换

  • 在SQL中删除重复记录(多种方法)

    2008-04-08 19:08:08

    文章出处:http://www.pconline.com.cn/pcjob/other/data/others/0508/693592_1.html

    学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录。后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录;还可以建临时表来实现...这个只提到其中的几种简单实用的方法,希望可以和大家分享(以表employee为例)。

    SQL> desc employee

     Name                                      Null?    Type
     ----------------------------------------- -------- ------------------

    emp_id                                                NUMBER(10)
    emp_name                                           VARCHAR2(20)

    salary                                                  NUMBER(10,2)

     

    可以通过下面的语句查询重复的记录:

    SQL> select * from employee;

        EMP_ID EMP_NAME                                  SALARY

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

             1 sunshine                                      10000

             1 sunshine                                      10000

             2 semon                                         20000

             2 semon                                         20000

             3 xyz                                           30000

             2 semon                                         20000


    SQL>
    select distinct * from employee;

        EMP_ID EMP_NAME                                     SALARY

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

             1 sunshine                                      10000

             2 semon                                         20000

             3 xyz                                             30000

    SQL>  select * from employee group by emp_id,emp_name,salary having count (*)>1

        EMP_ID EMP_NAME                                     SALARY

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

             1 sunshine                                      10000

             2 semon                                          20000


    SQL>
    select * from employee e1

    where rowid in (select max(rowid) from employe e2
     
    where e1.emp_id=e2.emp_id and

      e1.emp_name=e2.emp_name and e1.salary=e2.salary);

     

        EMP_ID EMP_NAME                                     SALARY

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

             1 sunshine                                      10000

             3 xyz                                             30000

             2 semon                                         20000

    2. 删除的几种方法:

    1)通过建立临时表来实现

    SQL>create table temp_emp as (select distinct * from employee) 

    SQL> truncate table employee; (清空employee表的数据)

    SQL> insert into employee select * from temp_emp;  (再将临时表里的内容插回来)

    ( 2)通过唯一rowid实现删除重复记录.Oracle中,每一条记录都有一个rowidrowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。

    SQL>delete from employee e2 where rowid not in (
           
    select max(e1.rowid) from employee e1 where

            e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(rowid)也可以。

    SQL>delete from employee e2 where rowid <(
           
    select max(e1.rowid) from employee e1 where
            e1.emp_id
    =e2.emp_id and e1.emp_name=e2.emp_name and

                      e1.salary=e2.salary);

    3)也是通过rowid,但效率更高。

    SQL>delete from employee where rowid not in (
           
    select max(t1.rowid) from employee t1 group by

             t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。

        EMP_ID EMP_NAME                                     SALARY

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

             1 sunshine                                      10000

             3 xyz                                             30000

             2 semon                                         20000

     

    SQL> desc employee

     Name                                      Null?    Type
     ----------------------------------------- -------- ------------------

    emp_id                                                NUMBER(10)
    emp_name                                           VARCHAR2(20)

    salary                                                  NUMBER(10,2)

  • SQL Server仍占据数据库市场主导地位

    2008-04-08 10:15:55

    BZ Research的2007年度数据库与数据存取、综合研究报告表明,微软SQL Server仍然是数据库市场上遥遥领先的No.1,截至今年6月底有74.7%的企业都在使用它。虽然这一数据比2006年7月的76.4%略有下滑,但依然远远高于竞争对手。

      BZ Research是在6月下半月对686名软件开发主管进行调查后得出上述结论的。

      除了SQL Server,Oracle的使用率从51.3%升至54.5%、Access从56.1%降至54.4%、MySQL从38.5%升至43.4%、IBM DB2从20.4%升至23.5%、PostgreSQL从11.6%降至11.4%,除此之外的其他数据库软件均不足10%。

      另外,主管们还被问到了最近完成的项目使用的是何种数据库软件的问题,结果有51.0%的使用了SQL Server,接下来分别是Orale占37.1%、MySQL占20.7%、Access占14.9%、DB2占12.5%、PostgreSQL占4.2%,其余均不足3%。与使用率统计基本一致。

      至于为什么如此选择,有45.9%的人给出的理由是“很熟悉这种数据库”,其他原因还有“功能较多且运行稳定”(21.3%)、“开发成本最低”(20.1%)、“部署成本最低”(18.6%)、“授权许可要求”(17.1%)、“特定应用需要”(15.3%)。

      一名微软用户评论说:“有了ADO.NET,SQL Server现在要比Oracle好用得多。如果Oracle也能做到这一点,也许我们会在未来考虑更多地使用它。”

      也有人认为:“Oracle在配置和运行方面都很麻烦,而SQL Server只是另一个工具,而且与Visual Studio紧密集成。”

      还有的被调查者表示:“SQL Server完全能够满足我们的需要,对管理员来说很容易使用,与Visual Studio的配合很好,在x86服务器上运行顺利。这是我们(企业)内部部署的普遍标准。我们的很多第三方合作厂商也在用它。”

      当然也不是每个人都很欣赏SQL Server:“我们是一家大型企业,而Oracle事实上就是用于企业计算的标准,还有IBM DB2。微软的SQL Server我们也在用,但它不是工业标准。”

      有时候要看具体情况了:“我们开发J2EE和.NET程序。在中小型客户里,SQL Server到处都是,但大型客户选择了Oracle。在卖软件的时候,我们需要根据客户需求部署数据库。”

      “MySQL也已经开始作为Oracle的实验性替代品了。”

      Sybase也没有被忘记。有说好的:“Sybase仍然是华尔街上的现行标准。”也有批评的:“希望Sybase能尽快增加类似于MySQL的功能,扩展T-SQL,并尽快加入其他数据库普遍提供的功能,不然我们可能就会抛弃它。”

  • Oracle 数据库的备份与恢复

    2008-04-08 10:07:29

    文章出处:http://www.pconline.com.cn/pcedu/empolder/db/oracle/0409/461459_1.html

    Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP)、热备份和冷备份。导出备件是一种逻辑备份,冷备份和热备份是物理备份。

      一、 导出/导入(Export/Import)

      利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。

      1、 简单导出数据(Export)和导入数据(Import)

      Oracle支持三种方式类型的输出:

      (1)、表方式(T方式),将指定表的数据导出。
      (2)、用户方式(U方式),将指定用户的所有对象及数据导出。
      (3)、全库方式(Full方式),瘵数据库中的所有对象导出。

      数据导入(Import)的过程是数据导出(Export)的逆过程,分别将数据文件导入数据库和将数据库数据导出到数据文件。

      2、 增量导出/导入

      增量导出是一种常用的数据备份方法,它只能对整个数据库来实施,并且必须作为SYSTEM来导出。在进行此种导出时,系统不要求回答任何问题。导出文件名缺省为export.dmp,如果不希望自己的输出文件定名为export.dmp,必须在命令行中指出要用的文件名。

      增量导出包括三种类型:

      (1)、“完全”增量导出(Complete)
      即备份三个数据库,比如:
      exp system/manager inctype=complete file=040731.dmp
      (2)、“增量型”增量导出
      备份上一次备份后改变的数据,比如:
      exp system/manager inctype=incremental file=040731.dmp
      (3)、“累积型”增量导出
      累计型导出方式是导出自上次“完全”导出之后数据库中变化了的信息。比如:
      exp system/manager inctype=cumulative file=040731.dmp
      数据库管理员可以排定一个备份日程表,用数据导出的三个不同方式合理高效的完成。
      比如数据库的被封任务可以做如下安排:

      星期一:完全备份(A)
      星期二:增量导出(B)
      星期三:增量导出(C)
      星期四:增量导出(D)
      星期五:累计导出(E)
      星期六:增量导出(F)
      星期日:增量导出(G)

    如果在星期日,数据库遭到意外破坏,数据库管理员可按一下步骤来回复数据库:

      第一步:用命令CREATE DATABASE重新生成数据库结构;
      第二步:创建一个足够大的附加回滚。
      第三步:完全增量导入A:
      imp system/manager inctype=RESTORE FULL=y FILE=A
      第四步:累计增量导入E:
      imp system/manager inctype=RESTORE FULL=Y FILE=E
      第五步:最近增量导入F:
      imp system/manager inctype=RESTORE FULL=Y FILE=F

      二、 冷备份

      冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份时将关键性文件拷贝到另外的位置的一种说法。对于备份Oracle信息而言,冷备份时最快和最安全的方法。冷备份的优点是:

      1、 是非常快速的备份方法(只需拷文件)
      2、 容易归档(简单拷贝即可)
      3、 容易恢复到某个时间点上(只需将文件再拷贝回去)
      4、 能与归档方法相结合,做数据库“最佳状态”的恢复。
      5、 低度维护,高度安全。

      但冷备份也有如下不足:

      1、 单独使用时,只能提供到“某一时间点上”的恢复。
      2、 再实施备份的全过程中,数据库必须要作备份而不能作其他工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
      3、 若磁盘空间有限,只能拷贝到磁带等其他外部存储设备上,速度会很慢。
      4、 不能按表或按用户恢复。

      如果可能的话(主要看效率),应将信息备份到磁盘上,然后启动数据库(使用户可以工作)并将备份的信息拷贝到磁带上(拷贝的同时,数据库也可以工作)。冷备份中必须拷贝的文件包括:

      1、 所有数据文件
      2、 所有控制文件
      3、所有联机REDO LOG文件
      4、 Init.ora文件(可选)

      值得注意的使冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的。

    下面是作冷备份的完整例子。

      (1) 关闭数据库
      sqlplus /nolog
      sql>connect /as sysdba
      sql>shutdown normal;
      (2) 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件
      sql>cp
      (3) 重启Oracle数据库
      sql>startup

      三、 热备份

      热备份是在数据库运行的情况下,采用archivelog mode方式备份数据库的方法。所以,如果你有昨天夜里的一个冷备份而且又有今天的热备份文件,在发生问题时,就可以利用这些资料恢复更多的信息。热备份要求数据库在Archivelog方式下操作,并需要大量的档案空间。一旦数据库运行在archivelog状态下,就可以做备份了。热备份的命令文件由三部分组成:

      1. 数据文件一个表空间一个表空间的备份。

      (1) 设置表空间为备份状态
      (2) 备份表空间的数据文件
      (3) 回复表空间为正常状态

      2. 备份归档log文件

      (1) 临时停止归档进程
      (2) log下那些在archive rede log目标目录中的文件
      (3) 重新启动archive进程
      (4) 备份归档的redo log文件

      3. 用alter database bachup controlfile命令来备份控制文件
      热备份的优点是:

      1. 可在表空间或数据库文件级备份,备份的时间短。
      2. 备份时数据库仍可使用。
      3. 可达到秒级恢复(恢复到某一时间点上)。
      4. 可对几乎所有数据库实体做恢复
      5. 恢复是快速的,在大多数情况下爱数据库仍工作时恢复。

      热备份的不足是:

      1. 不能出错,否则后果严重
      2. 若热备份不成功,所得结果不可用于时间点的恢复
      3. 因难于维护,所以要特别仔细小心,不允许“以失败告终”。

  • SQL Server字符串处理函数大全

    2008-04-08 10:01:07

    select 字段1 from 表1 where 字段1.IndexOf("云")=1;
            这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。
    left()是sql函数。
            select 字段1 from 表1 where charindex('云',字段1)=1; 字符串函数对二进制数据、字符串和表达式执行不同的运算。此类函数作用于CHAR、VARCHAR、 BINARY、 和VARBINARY 数据类型以及可以隐式转换为CHAR 或VARCHAR的数据类型。可以在SELECT 语句的SELECT 和WHERE 子句以及表达式中使用字符串函数。
            常用的字符串函数有:

    一、字符转换函数
    1、ASCII()
            返回字符表达式最左端字符的ASCII 码值。在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。
    2、CHAR()
            将ASCII 码转换为字符。如果没有输入0 ~ 255 之间的ASCII 码值,CHAR() 返回NULL 。
    3、LOWER()和UPPER()
            LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写。
    4、STR()
            把数值型数据转换为字符型数据。
    STR (<float_expression>[,length[, <decimal>]])
            length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的length 值为10, decimal 缺省值为0。
            当length 或者decimal 为负值时,返回NULL;
            当length 小于小数点左边(包括符号位)的位数时,返回length 个*;
            先服从length ,再取decimal ;
            当返回的字符串位数小于length ,左边补足空格。
    二、去空格函数
    1、LTRIM() 把字符串头部的空格去掉。

    2、RTRIM() 把字符串尾部的空格去掉。

    三、取子串函数
    1、left()
    LEFT (<character_expression>, <integer_expression>)
    返回character_expression 左起 integer_expression 个字符。

    2、RIGHT()
    RIGHT (<character_expression>, <integer_expression>)
    返回character_expression 右起 integer_expression 个字符。

    3、SUBSTRING()
    SUBSTRING (<expression>, <starting_ position>, length)
    返回从字符串左边第starting_ position 个字符起length个字符的部分。

    四、字符串比较函数
    1、CHARINDEX()
            返回字符串中某个指定的子串出现的开始位置。
    CHARINDEX (<’substring_expression’>, <expression>)
            其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。
            此函数不能用于TEXT 和IMAGE 数据类型。
    2、PATINDEX()
            返回字符串中某个指定的子串出现的开始位置。
            PATINDEX (<’%substring _expression%’>, <column_ name>)其中子串表达式前后必须有百分号“%”否则返回值为0。
            与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于CHAR、 VARCHAR 和TEXT 数据类型。

    五、字符串操作函数
    1、QUOTENAME()
            返回被特定字符括起来的字符串。
    QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character 标明括字符串所用的字符,缺省值为“[]”。
    2、REPLICATE()
            返回一个重复character_expression 指定次数的字符串。
    REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值,则返回NULL 。

    3、REVERSE()
            将指定的字符串的字符排列顺序颠倒。
    REVERSE (<character_expression>) 其中character_expression 可以是字符串、常数或一个列的值。

    4、REPLACE()
            返回被替换了指定子串的字符串。
    REPLACE (<string_expression1>, <string_expression2>, <string_expression3>) 用string_expression3 替换在string_expression1 中的子串string_expression2。

    4、SPACE()
    返回一个有指定长度的空白字符串。
    SPACE (<integer_expression>) 如果integer_expression 值为负值,则返回NULL 。

    5、STUFF()
            用另一子串替换字符串指定位置、长度的子串。
    STUFF (<character_expression1>, <start_ position>, <length>,<character_expression2>)
            如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回NULL 值。
            如果length 长度大于character_expression1 中 start_ position 以右的长度,则character_expression1 只保留首字符。

  • 很全的sql用法

    2008-04-08 09:52:42

    一、基础

    1、说明:创建数据库
    CREATE DATABASE database-name
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_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:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
  • 每天进步一点点~

    2008-04-07 22:28:16

        这几天在学习Oracel,每天争取把学到的总结一下。一些是简单的,不过还是要总结练习一下;还有的理解不深,有待慢慢充实;兴许有的还停留在理解的误区,有待发现。

    各种数据库比较:(若理解有误的希望高手指点)

    Oracle(甲骨文):性能好,对硬件要求不苛刻(反例:DB2),不同平台间的可遗址性,(服务器比例,
    unix>60%, NT<40%)只要不用于商业活动,可以无限期使用。
    Sql Server(Microsoft):只能在windows下运行,没有开放性,只适用中小企业,不像unix下可以运行大型数据库。
    Sybase:似乎有好多版本,有点麻烦。
    BD2(IBM):适用海量数据。

    sqlpuls 操作:
    sqlpuls :oracle自带的dos下的sql操作环境
    sqlpuls 用户名@SID_主机名  OR   用户名/密码@SID_主机名(这种情况密码是以明码显示的,而前者输入密码是没有屏显的)
    SID_主机名,网络服务端
    roll back  OR  rollback;   //回滚,撤消所有没有提交的操作,
    commit;                //提交,提交后DML语言才会生效

    DDL数据定义语言:
    表的建立和删除:
    create table 表名 (id number,name varchar2(20),age number); //number 回自动调节长度
    drop table 表名;
    表结构的操作:
    desc 表名;//查看表结构
    alter table 表名 modify(name varchar2(30));
    alter table 表名 add(address varchar2(40));
    alter table 表名 drop column address;
    rename 表名 to 表名1;

    DML数据操作语言:
    insert into 表名 (id,name,age) values (11,'a01',23);
    insert into 表名 values (11,'a01',23);
    insert into 表名 (id,name,age) values (11,null,23);
    update 表名 set age = 21 (where id = 1);
    delete from 表名;
    delete from 表名 where age < 18;

    带运算+、-、*、/, as, ||, distinct, is null, is not null, between ...and ..., in(list), not in(list),
    like '%', like'_', max(), min(), sum(), avg(), count(), order by , group by
    select * from tab(tables)         //选取所有的表
    select name,age+35 from 表名;//如果属性有要对null进行计算的,目前我认为没什么结果,似乎还是空。
    select name (as) xingming from 表名;//别名的用处有待学习、发现,eg:自联接
    select name ||'shi'||age||'sui' from 表名;??????用处
    select distinct age from 表名;//去重
    select * from 表名 where age is not null;
    select * from 表名 where age between 18 and 35;//包含边界值
    select * from 表名 where age in (12,13,14,16);
    select * from 表名 where age not in (12,13);
    select * from 表名 where name like '%a' or name like 'a%' or name like '%a%';  
    // '%' 代表0个或多个字符;'_' 代表单个字符
    select * from 表名 where name like '_a' or name like 'a_' or name like '_a_'; 
    //like 一般比较慢 
    select max(age) from 表名 ;//min(),sum(),avg(),count(),
    select * from 表名 order by age (asc)/desc;

    DCL数据控制语言:主要用于设置和修改权限:
    grant 操作 on 对象 to 角色;

    优先级:算术运算符(+、-、*、/),NOT,AND,OR

    遗留:Oracle 与 Sql Server 语法完全一致吗?
         alter into 可以添加记录吗?//我记得sql server 里是可以用alter into 批量加数据的。

     

数据统计

  • 访问量: 8510
  • 日志数: 14
  • 书签数: 2
  • 建立时间: 2008-03-13
  • 更新时间: 2008-11-28

RSS订阅

Open Toolbar