第一部分,数据处理基础

  

<强>第一章SQL基础回顾

,,插入语在句中省略字段名的做法,非常少见,也有很大的风险,除非有什么特殊的理由,不然就别这么做,别把你的SQL语句搞得太脆弱,因为无法预知在何时表的结构会发生变化。举例来说,如果将来有人重建表,而且表中的字段排序顺序发生变化,碰巧你的插入语句通过字段类型和其他约束性检查,你就在没有错误提示的情况下,把数据写入了表中错误的字段,那将是长灾难,所以,,

,,查看表的表述:

desc 表名;


,,如果用删除语句来删除所有行,则Oracle会完整地把删除行为记入日志,以便如果是误操作,我们还有机会将数据回滚,但正应为要记日志,所以需要花一定的时间,有时达不到我们希望的速度。

,,作为补充,甲骨文提供了一个截断(截断)语句来删除表中的所有数据。可以用下面的语句来截断HR.EMPLOYEES表:

,,

,truncate  table  hr.employee;


截断语句不带,子句或其他限制条件.TRUNCATE语句的处理是按DDL(数据定义语言,数据定义语言)的方式,因此同时也隐含了数据库的一些操作,如隐式地提交其他打开事务。

<强> Oracel对空字符串的非标准处理

,,SQL标准做法是用空或零长度的字符串来代表零值,而甲骨文并非如此。其中历史的,地域的原因我们无需深究,但一定要记住,甲骨文对NULL的规定和用法。对于几乎所有的其他数据库,SQL都把空字符串当做一个独立的,已知的值。

,,有编程背景的人会发现一些类似的规定,一个0长度的字符串只有一个字符串终结符(\ 0)作为其内容。相反,一个加密的字符串没有确定的状态……即使是一个终结符。我们不能把0长度和未知状态的字符串进行互换,这类似于Oracle如何对待NULL。

,,在SQL中涉及零值的使用诀窍,也是每天必须面对的功课,这经常让人不知所措。每个SQL表达式的结果都是三个值选一:“真”,“假”或“空”,在各种比较,逻辑操作和判断中都是如此。但为避免偶尔的遗忘,我们还是要一再强调:零不跟任何值相等,任何值不跟零相等,零不等于零。

,,,

,,Oracel默认用二进制的排序方法。

,,有时候,我们希望看见两个字段值相同的排在一起,忽略大小写。用这个NLS环境变量可以达到目的:

,,,

alert  session  set  NLS_SORT =, BINARY_CI,


,,,

,,甲骨文支持区分大小写和不区分大小写两种排序方式。有个环境变量NLS_SORT进行区分大小写和不区分大小写的控制。默认的排序操作区分大小写,即NLS_SORT=二进制。如果我们希望排序不区分大小写的方式,则需把环境变量NLS_SORT设置为BINARY_CI。

,,顾名思义,NLS_SORT仅仅影响排序结果,并不对其他大小写操作构成影响。即使把NLS_SORT设置为BINARY_CI,以不区分大小写的方式比较数据的操作仍然延续了Oracle默认的方式。

,,小技巧:比较传统的方式不是使用NLS环境变量,而是用上部和下部函数把要比较的字段名,文字都转换成大写或小写后再比较。这种方式的不足之处在于,使用函数后,标准的索引就不能使用了,优化器无法工作,应对的方式是使用基于功能的索引(基于函数的索引)。

,,,

,,通过对会话的环境变量的设置,引导甲骨文用自然语言的方式进行比较,虽然表中都是这种形式的Simth而非全小写,但NLS_COMP环境变量可以控制甲骨文对字符的比较方式,设置为语言,可以用自然语言的方式比较,符合人类的思维习惯。

,,,

alert  session  set  NLS_COMP =,“语言”;   ,,,select  first_name、last_name 得到hr.employee  where  last_name =, simth,


- - - - - - - - - - - - - - - - - - - - - - - & lt;,,查询结果在- - - - - - - - - - - - - - - - - - - - - - - - -

威廉,,,,,,,,,史密斯,

林赛,,,,,,,,,史密斯,

- - - - - - - - - - - - - - - - - - - - - - - & lt;/查询结果在- - - - - - - - - - - - - - - - - - - - - - - - - - - -

,,合并语句的功能是将新数据插入一个表中。记录是否存在,由主(主要),键进行判断。如果主键不存在于表中,则插入该行。如果主键匹配表中已有的行,则通过匹配键的其他详细信息更新该行。

,,在示例中,假设要把NEW_COUNTRIES表中一些国家的信息添加到HR.COUNTIES表中:

,,

,merge  into  hr.countries  c   ,才能使用   ,,,(select  country_id country_name   ,,,,,,,得到hr.new_countries),数控   ,,,,(c.country_id=nc.country_id)   ,,,when  matched 然后   ,,,,,,,update  set  c.country_name =nc.country_name   ,,,when  not  matched 然后   ,,,,,,,insert  (c.country_id c.country_name)   ,,,,,,,values  (nc.country_id nc.country_name);

第一部分,数据处理基础