温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

第一部分   数据处理基础

发布时间:2020-07-20 21:42:02 来源:网络 阅读:243 作者:宋晨光 栏目:关系型数据库

 第一章 SQL基础回顾

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

    查看表的表述: 

desc 表名;


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

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

   

 truncate table hr.employee;


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

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

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

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

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

    

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

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

    

alert session set NLS_SORT = 'BINARY_CI';


    

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

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

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

    

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

    

alert session set NLS_COMP = 'LINGUISTIC';
    select first_name,last_name from hr.employee where last_name = 'simth';


-----------------------<  查询结果>-------------------------

William                    SMITH

Lindsey                    Smith

-----------------------</查询结果>--------------------------

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

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

   

 merge into hr.countries c
    using
    (select country_id,country_name
        from hr.new_countries) nc
    on (c.country_id=nc.country_id)
    when matched then
        update set c.country_name = nc.country_name
    when not matched then
        insert (c.country_id,c.country_name)
        values (nc.country_id,nc.country_name);


    

    ON子句后面跟着另两个子句,当键值相匹配时,执行“WHEN MATCHED CLAUSE”子句内容,当键值不匹配时,执行“WHEN NOT MATCHED”子句,会把新的记录插入目标表中。

    match和not-match子句都可以包含更多的筛选条件,当满足删除条件时,也可以删除记录:

    

merge into hr.countries c 
    using
        (select country_id,country_name,region_id
        from hr.new_countries) nc
    on(c.country_id = nc.country_id)
    when matched then
        update set c.country_name = nc.country_name,
            c.region_id = nc.region_id
        delete where nc.region_id = 4
    when not matched then
        insert (c.country_id,c.country_name,c.region_id)
        values (nc.country_id,nc.country_name,nc.region_id)
        where (nc.region_id !=4);


    在这个修改后的版本中,除了REGION_ID的新值是4的行,其他根据COUNTRY_ID匹配的HR.CONTRIES的行都会修改COUNTR_NAME的值,而REGION_ID是4的行最终会删除。没有匹配上的行,除了REGION_ID的值是4的行,其他行都会被插入HR.COUNTRIES中,而REGION_ID的值是4的行会被忽略。

 看完记得点赞哦O(∩_∩)O!   

                                          2015-03-17 23:40


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI