Oracle(2)基础使用,字符串简介,序列使用,删除语句

1.列拼接运算
    --标准SQL的做法
    SELECT CONCAT(CONCAT(CONCAT(CONCAT(A.PNAME,'-'),A.PNUMBER),'-'),A.PMONEY)
      FROM PERSON A;
      
    --Oracle的列拼接
    SELECT A.PNAME || '-' || A.PNUMBER || '-' || A.PMONEY
      FROM PERSON A;

2.逻辑运算
    --条件查询,基于三个关键字的操作NOT(非->否定) AND(与->并且) OR(或->或者)

    --查询工资2000以上且活着的人
    SELECT * 
      FROM PERSON A
     WHERE A.PMONEY>=2000
       AND A.PSTATE='1';
       
    --查询工资5000以下的活着的人,或者女性员工
    SELECT *
      FROM PERSON A
     WHERE (A.PMONEY<5000 AND A.PSTATE='1') OR A.PSEX='2';

3.重复数据的剔除问题:(关键字DISTINCT)
    重复数据:查询结果中所有列的内容,所有列拼接到一个,是同一个字符串,我们人认为两行数据是重复的
    --查询名字中有 老 这个字的员工
    --应用场景:基于集合运算的子查询
    SELECT DISTINCT A.PNAME,A.PSEX,A.PSTATE
      FROM PERSON A
     WHERE A.PNAME LIKE '%老%'
     
4.定长字符串和可变长字符串的区别:
    定长字符串   CHAR(6):
        对于定长字符串,如果定义长度(6)超过了实际字符个数(3),剩余部分,系统自动补充空格。
    可变长字符串 VARCHAR2(6):
        对于可变长字符串,定义长度(6)超过了实际字符个数(3),多余部分自动忽略。
    
5.字符串类型测试:
    (1)表结构
    CREATE TABLE CHARTEST
    (
        CID NUMBER PRIMARY KEY,
        C1 CHAR(10),
        C2 NCHAR(10),
        C3 VARCHAR2(10),
        C4 VARCHAR2(10 CHAR)
        C5 NVARCHAR2(10)
    )
    (2)测试用例
        ①以字符0..9填充各列,此时采用的字符是ISO-8859-1的字符集
        INSERT INTO CHARTEST(CID,C1,C2,C3,C4,C5)
                      VALUES(1,'0123456789','0123456789','0123456789','0123456789','0123456789');
        ②以10个中文填充上述各列
        INSERT INTO CHARTEST(CID,C1,C2,C3,C4,C5)
                      VALUES(2,'一二三','一二三四五六七八九零','一二三','一二三四五六七八九零','一二三四五六七八九零');
        ③数据未被灌满时的长度计算
        INSERT INTO CHARTEST(CID,C1,C2,C3,C4,C5)
                      VALUES(3,'123','123','123','123','123');
    (3)N字头的字符串类型,在客户端显示的时候,经常出现最后一位无法显示的问题,原因在于:数据库编码格式是UTF-8,客户端一般是GBK,在进行字符集转换时,出现的问题。
    (4)字符串类型说明
        总体两大体系,两大分类
        两大体系:N字头(所有类型都是以字符为单位计算长度)
                非N字头(默认以字节为单位计算长度,特殊的是VARCHAR2,既可以一字节为单位计算长度、格式是varchar2(len),又可以以字符为单位计算长度、格式是VARCHAR2(LEN CHAR))
        两大分类:定长字符串和可变长字符串
            当列没有被灌满时,定长字符串按照定义长度补充空格,变长字符串忽略剩余部分
    (5)应用中的建议:
        对于长度可变的列,定义列时候,以VARCHAR2(LEN CHAR)格式,比如人的名字
        对于长度不变的列,同时该列永远不会出现中文,且永远可以灌满,那么用
            CHAR(LEN)速度更快,比如:性别定义时候---CHAR(1),
                         在比如:民族CHAR(2) 01--汉族  02--满族
        N字头体系的字符串类型,没必要用。
    
6.主键值的数据库托管问题:
    (1)自增列 -- MySQL SQLServer DB2
    (2)独立对象管理主键值 --- 序列

7.序列:
    当前主流的大部分数据库对于主键都是采用自增列方式实现,Oracle认为,在大数据量高并发的情况下,自增列性能和安全性不理想,因此没有采用该方法,而是通过一个独立的序列对象,完成主键的自增。
        
8.关于序列的坑:
    (1)序列语法:需要将每个关键字的含义全部记住
        CREATE SEQUENCE S_TABLENAME
        MINVALUE 1        --最小
        MAXVALUE 10000    --最大
        START WITH 1    --开始
        INCREMENT BY 1    --步长
        CACHE 20;        --缓存
        CYCLE;          --循环
    (2)序列的两个属性
        NEXTVAL --- 每执行一次获取一个流水号
        CURRVAL --- 每次获取序列的当前值
    (3)当序列创建完毕,没有调用过NEXTVAL属性,直接调用CURRVAL属性 -- 报错
    (4)Oracle中序列创建完毕以后,是么时候被调入内存。
        当第一次调用该序列的NEXTVAL属性时候,被调入内存
    (5)当NEXTVAL和CURRVAL同时出现在SELECT语句中,会?
        谁在前谁在后?区别?有么有影响?
        答案:当两个同时出现在SELECT子句中,获取的都是NEXTVAL之后的值,谁在前谁在后无影响,因为先调用NEXTVAL后调用CURRVAL
    (6)在一个SELECT语句中,对同一序列,多次调用NEXTVAL,会?
        都是一个值
        在当前值的基础上,增加一个步长,将增加后的值同时传递给本语句中的所有NEXTVAL
    
9.带有序列的INSERT
    (1)表结构
        CREATE TABLE DEPT
        (
            DID NUMBER NOT NULL PRIMARY KEY,
            DNAME VARCHAR2(10 CHAR) NOT NULL,
            DMEMO VARCHAR2(500)
        );
    (2)创建序列
        CREATE SEQUENCE S_DEPT;
    (3)插入语句
        INSERT INTO DEPT(DID,DNAME,DMEMO)
                  VALUES(S_DEPT.NEXTVAL,'软件开发部','赔钱');
        COMMIT;
    (4)注意事项:序列只保证向前递增,不保证从1开始,也不保证不出现断号。在必须连号的业务中不能使用序列。
    (5)序列应用的扩展:现在希望像DEPT表中录入如下数据
        部门名称:软件开发 + 流水号 + 部
        部门备注
        INSERT INTO DEPT(DID,DNAME,DMEMO)
                  VALUES(S_DEPT.NEXTVAL,'软件开发'||(S_DEPT.CURRVAL)||'部','赔钱');
    
10.UPDATE的语法
    (1)UPDATE的语法规律
        UPDATE 表名
           SET 列名1=列值1,列名2=列值2,...,列名N=列值N
         WHERE 条件列表(一般都是主键列=某个指定的值)
    
11.分账户管理专题:
    (1)Oracle对数据,采用逻辑与物理双重隔离方式进行管理.
    (2)数据指定用户所有,每个用户的数据如果不给其他用户授权,其他用户无法访问。
    (3)在物理实现上:系统可以为每个用户配备独立的表空间(就是一个大文件),用户所有数据就存储在表空间中,多个用户之间表空间尽可能的独立,这样一个用户的文件如果损毁,对其他用户没有影响
    
    (4)创建用户科学的方法是如下过程:
        ①创建该用户存储数据用的表空间
        ②创建用户,并为用户指定存储数据用的表空间
    图形界面和命令来操作
    
12.必须记住的问题:
    (1)DROP DELETE TRUNCATE 的区别
        ①DELETE 删除表中的数据,表结构保留
        ②TRUNCATE 删除表中的数据,表结构保留
        ③DROP 将表结构连同表中数据一并删除
    (2)DELETE 与 TRUNCATE 的区别如下:
        ①DELETE对数据是虚拟删除,只是将数据打上一个标记,让数据不可见,因此数据是存在的,表所属用户的表空间没有被回收
        ②TRUNCATE将表中的数据做物理删除,因此原先在数据表空间可以回收利用
        ③DELETE是可以被恢复的,而TRUNCATE不可以被恢复。
        ④DELETE执行完毕,可以通过事务进行回滚;而TRUNCATE绕过事务,自然无法回滚,相应的速度要快于DELETE。
    
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值