zoukankan      html  css  js  c++  java
  • Oracle数据库与MySQL的不同点

    Oracle笔记

    一、   Oracle的启动和登录:

       1、启动:通过启动Oracle的服务启动。

        OracleServiceORCL:核心服务,必须启动。

        OracleOraDb11g_home1TNSListener:监听服务,是否有客户端连接,启动后客户端程序(sqldeveloper.exe)才能连接上。

      2、 登录:

        1)  字符界面:使用Oracle提供的Sql Plus登录。Exit退出

        2)  图形界面:使用客户端程序(sqldeveloper.exe)登录。

    二、   Oracle中权限和角色:

      1、  权限:系统权限、对象权限。(700余种权限)

        1)  系统权限:针对某项操作的权限,而不是针对某个或某些数据库对象的权限,如:CREATE SESSION(创建会话,登录权限)、CREATE TABLE

        2)  对象权限:针对某个或某些数据库的权限,如:针对某个数据的添加、删除、修改、查询。

      2、  角色:预定义角色、自定义角色

        权限太多不方便管理,可以将多种权限包装为一个角色,当给用户授权时,只需要授予某个角色就相当于授予这个角色下面的所有权限。

      3、  Oracle种常用的3个预定义角色:

        1)  CONNECT:
    
          CREATE SESSION(创建会话,登录权限)
    
        2)  RESOURCE:
    
          CREATE TRIGGER:创建触发器
    
          CREATE SEQUENCE:创建序列
    
          CREATE TYPE:创建类型
    
          CREATE PROCEDURE:创建存储过程
    
          CREATE CLUSTER:创建簇
    
          CREATE OPERATOR:创建操作符
    
          CREATE INDEXTYPE:创建索引类型
    
          CREATE TABLE:创建表
    
        3)  DBA:拥有所有的对象权限和大部分的系统权限,system用户默认拥有的就是DBA角色。
    
            注:权限放置在dba_sys_privs表中,查询该表可以看到权限和角色。

    三、   管理用户:

    /*三、    管理用户:
    1.    创建表空间:
    MySQL在一个实例中可以创建多个数据库,但Oracle在一个实例中就只有一个数据库(orcl),
    为了将来为每个项目具体一个独立的存储容器,所有需要创建表空间,类似于MySQL中的数据库。
    
    语法:
    CREATE TABLESPACE <表空间名称> 
    DATAFILE ‘数据文件路径数据文件名.dbf’ 
    [SIZE <表空间初始容量>] 
    [AUTOEXTEND {OFF|ON} NEXT <每次扩展的容量> MAXSIZE {表空间最大值 
    |UNLIMITED}]
    说明:
    1)    容量的单位:K M G
    2)    AUTOEXTEND设置为OFF表示不能自动扩展,ON表示能自动扩展,同时还可以设置每次增长多少的容量。
    3)    MAXSIZE设置最大值:具体的最大值。UNLIMITED:没有最大值
    */
    -- 创建一个名为TS_USER39的表空间
    CREATE TABLESPACE ts_user39 
    DATAFILE 'g:oracle_data	ablespace	s_user39.dbf' 
    SIZE 200M /*表空间初始容量*/
    AUTOEXTEND ON NEXT 20M /*可以扩展,每次扩展20M*/
    MAXSIZE UNLIMITED; /*没有最大值的限制*/

       2、  创建用户:user39


    /*
    2. 创建用户:user39 语法: CREATE USER <用户名称> [IDENTIFIED BY <密码>] [DEFAULT TABLESPACE <表空间名称>] 说明: 1) 密码不需要单引号,否则他认为密码包含单引号 2) 在创建用户时最好给每个用户指定一个默认的表空间 */ -- 创建用户 CREATE USER user39 IDENTIFIED BY 123456 DEFAULT TABLESPACE ts_user39;

      3、  给用户授权:

    /*3.    给用户授权:
    语法:
    GRANT {系统权限|角色权限}TO <用户名> 
    [WITH ADMIN OPTION]
    GRANT {对象权限列表} ON <数据库对象列表> TO 
    <用户名> [WITH GRANT OPTION]
    
    举例:
    GRANT DBA TO user39 WITH ADMIN OPTION;
    */
    GRANT DBA TO user39 WITH ADMIN OPTION;
    
    

       4、 回收用户权限:

    -- 回收权限
    REVOKE DBA FROM user39;

    四、   创建序列:

    /*四、    创建序列:
    语法:
    CREATE SEQUENCE <序列名称> 
    [MINVALUE <最小值>] ――默认值为1
    [START WITH <初始值>] ――默认值为1,若初始值小于默认值的1,就需要同时设置最小值
    [INCREMENT BY <步长>] ――设置递增(正数)或递减的值,默认值为1
    {MAXVALUE <最大值>|NOMAXVALUE} –设置最大值或没有最大值(默认)
    */
    CREATE SEQUENCE seq_type 
    MINVALUE 0 
    START WITH 0 
    INCREMENT BY 10 
    MAXVALUE 99999;
    
    /*查看序列的值:当前值、下一列值;
    dual时Oracle中的虚拟临时表,在查看变量、函数、序列等没有表名或视图时使用*/
    SELECT seq_type.NEXTVAL FROM dual;
    SELECT seq_type.CURRVAL FROM dual;

     

    五、   创建数据表:

      1、  Oracle中的数据类型:

           1)  字符型:CHAR、VARCHAR2
    
        2)  数值型:NUMBER(既可以表示整数,也可以表示小数)、INTFLOATDOUBLE。
    
        3)  日期时间:DATE、TIME、DATETIME、TIMESTEAMP       

      2、  创建数据表时Oracle与MySQL的不同点:

        1)  MySQL的默认主键生成策略使用自动增长(AUTO_INCREMENT),Oracle的默认主键生成策略使用序列,需要单独创建序列完成增长。
    
        2)  MySQL没有check约束(检查约束),但Oracle有检查性约束:
    
        约束区间值:student_score NUMBER) check (BETWEEN  AND 100)
    
        约束枚举值:sex CHAR(3) check('','')
    
        3)  MySQL可以在字段上直接使用comment关键字编写注释,但Oracle要使用comment语句来完成。
          给表添加注释:COMMENT ON TABLE <表名> IS '注释的内容'
    
          给表添加注释:COMMENT ON TABLE  tb_grade IS '年级表'
    
          给表字段添加注释:
    
          Comment ON COLUMN <表名.字段名> IS '注释内容'
    
          Comment ON COLUMN  tb_grade.grade_id IS '年级编号'

     

    六、   插入记录:

        、 在使用INSERT INTO 插入数据时,MySQL可以一次插入多条记录,而Oracle只能一行。
    
        、 日期:使用“日—月-年”,如“20-8月-2018”,也可以使用转换函数来操作。
    
          将字符串转为日期:TO_DATE('2018-06-21','yyyy-mm-dd')    用于插入数据时
    
          将日期转化为字符串:TO_CHAR(HIREDATE,'yyyy-mm-dd')    用于查询数据时
    
        、 MySQL默认采用自动提交模式,当执行完增、删、改语句后会自动完成提交,
    
          但Oracle默认采用手动提交,所以执行完增、删、改后还需要执行COMMIT语句才会提交。

    七、   Oracle中的系统函数

    1. 与字符相关的函数:
    2. 与数值相关的函数:
    3. 与日期相关的函数:
    4. 转换函数:
    5. 其他函数
    6. 随机生成:字符串、小数、整数、日期、枚举值、范围值。
    7. 在Oracle中批量插入记录。
    /*七、    Oracle中的系统函数*/
    
    -- 1.    与字符相关的函数:
    SELECT UPPER('javascript') FROM dual;
    SELECT LOWER('javascript') FROM dual;
    SELECT LENGTH('javascript') FROM dual;
    SELECT LENGTH('中国') FROM dual;
    SELECT INITCAP('java script') FROM dual; /*首字母大写*/
    /*CONCAT()在Oracle中只能添加两个参数
    Oracle中的字符连接使用通道符"||"完成连接多个字符,类似于Java中的"+"。
    */
    SELECT CONCAT('aa','bb') FROM dual;
    SELECT 'aa'||'bb'||'dd' FROM dual;
    -- 字符串替换函数,将原始字符串中的a替换为A
    SELECT REPLACE('javascript','a','A') FROM dual;
    -- 字符串截取函数:原始字符串,截取索引(1开始),截取的长度
    SELECT SUBSTR('javascript',5,6) FROM dual;
    
    -- 2.    与数值相关的函数:
    SELECT ROUND(65.66944,2) FROM dual; /*四舍五入,截取两位小数*/
    SELECT TRUNC(65.66944,2) FROM dual; /*截断函数,截取两位小数*/
    SELECT CEIL(65.66944) FROM dual; /*向上取整,多用于分页*/
    SELECT MOD(156) FROM dual; /*取模*/
    
    -- 3.    与日期相关的函数:
    SELECT TO_CHAR(sysdate, 'YYYY-mm-dd') FROM dual; /*获取当前系统日期*/
    SELECT TO_CHAR(sysdate, 'YYYY-mm-dd'),add_months(sysdate,3) FROM dual; /*月份递增(向将来推)3个月或递减函数(负数向过去推)*/
    SELECT TO_CHAR(last_day(sysdate), 'YYYY-mm-dd') FROM dual;/*获取指定日期所在的最后一天*/
    SELECT MONTHS_BETWEEN(TO_DATE('02-02-1995','MM-DD-YYYY'),TO_DATE('01-01-1995','MM-DD-YYYY') ) FROM dual;/*获取两个日期的月份差*/
    SELECT MONTHS_BETWEEN(sysdate,BIRTHDAY) from tb_student;
    
    -- 4.    转换函数:
    -- 日期转字符串
    SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss') FROM dual; /*获取当前日期的时间(到秒)转换为字符串,如果用于订单号去掉中间的连接符*/
    -- 指定日期和Oracle基准日之间的差值
    SELECT TO_CHAR(sysdate,'J') FROM dual; /*朱利安日期公元前4713年1月1日0:0:0。返回的是天数差值*/
    -- 字符串转换为日期
    SELECT TO_DATE('2019-11-13','yyyy-mm-dd hh24:mi:ss') FROM dual; /*只显示到天*/
    -- 获取指定与基准日之间天数差对应的日期
    SELECT TO_DATE(2458801,'J') FROM dual; 
    
    -- 5.    判断函数
    SELECT sal,comm,(sal + comm) * 12 年薪 FROM scott.emp; /*第二个参数为空时,整体为空*/
    /*NVL(paraml1,paraml2):
    若paraml1不为空时取paraml1的值;
    如果paraml1为空,取paraml2的值*/
    
    SELECT sal,comm,(sal + NVL(comm,0)) * 12 年薪 FROM scott.emp;
    /*NVL2(paraml1,paraml2,paraml3):
    若paraml1不为空时取paraml2的值;
    如果paraml1为空,取paraml3的值*/
    /*相当于三元运算*/
    SELECT sal,comm,(sal + NVL2(comm,comm,0)) * 12 年薪 FROM scott.emp;
    
    /*DECODE(value,if,if的值,else if,else if的值,...,else的值),当value与哪个判断条件相等就取他的值。相当于switch case*/
    SELECt grade_id,DECODE(grade_id,'1','一年级','2','二年级','不知道') FROM TB_STUDENT;
    
    -- 6.    随机生成:字符串、小数、整数、日期、枚举值、范围值。
    SELECT dbms_random.string('',20) FROM dual;   /*大写字母,长度20*/
    SELECT dbms_random.string('U',20) FROM dual;   /*大写字母,长度*/
    
    SELECT dbms_random.string('L',20) FROM dual;   /*小写字母,长度*/
    SELECT dbms_random.string('A',20) FROM dual;   /*大小写字母混合,长度*/
    SELECT dbms_random.string('X',20) FROM dual;   /*大写字母和数字,长度*/
    SELECT dbms_random.string('P',20) FROM dual;   /*所有可打印的字符串,长度*/
    
    
    -- 7.    在Oracle中批量插入记录。
    /*批量插入记录:字段值采用随机生成
    以tb_student为例,完成批量插入记录
    */
    CREATE OR REPLACE PROCEDURE proc_batchinsertstudent(recordNums IN NUMBER)
    AS
    BEGIN
      DECLARE 
        nos NUMBER(10) := 11;
        mobile CHAR(11);
      BEGIN
        FOR nums IN 1..recordNums
        LOOP 
          mobile := '1' || substr(dbms_random.value(),3,10);
          INSERT INTO TB_STUDENT VALUES(
            's' || nos, /*STUDENT_NO*/
            dbms_random.string('A',6), /*LOGIN_PWD*/
            sys_guid(), /*STUDENT_NAME*/
            substr('男女',CEIL(dbms_random.value(0,2)),1), /*SEX*/
            CEIL(dbms_random.value(0,5)), /*GRADE_ID*/
            mobile , /*PHONE*/
            substr('批量插入记录字段值这里面的值采用随机截取',CEIL(dbms_random.value(1,84)),ROUND(dbms_random.value(5,10))), /*ADDRESS*/ 
            to_date(to_char(to_date('1990-01-01','yyyy-mm-dd'),'J') + TRUNC(dbms_random.value(0,366)),'J'), /*日期*/
            mobile || '@qq.com' /*电子邮箱*/
          );
          nos := nos + 1;
        END LOOP;
      END;
    END;
    
    
    -- 调用
    EXECUTE proc_batchinsertstudent(1000);
    
    select * from tb_student ORDER BY STUDENT_NO;
    
    DELETE FROM tb_student where STUDENT_NO > 's10';

       八、Oracle中常用的管理语句

    1. 查看实例名称:
    2. 查看数据库名称:
    3. 查看数据文件、控制文件、日志文件
    4. 接触Oracle默认180需要修改密码的规定
    5. 解除用户的锁定
    6. 修改用户的密码

    */
    select * from v$instance;
    select * from v$database;
    select * from dba_data_files;
    select * from v$controlfile;
    select * from v$logfile;
    
    -- 修改密码生存时间为无限制(永久不过期)
    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
    -- 解除用户贴锁定(当用户被锁定,可用别的用户进行更改) ALTER USER user39 ACCOUNT UNLOCK;
    -- 修改用户密码 ALTER USER user39 IDENTIFIED BY 654321;

    九、 索引的创建、查看、删除

    Oracle中有两类索引,唯一索引(unique)、位图索引(bitmap),
    当字段的值时有限的某几个值时,比较适合创建位图索引,它是采用二进制进行存储,查询时效率非常高。

    /*九、    索引的创建、查看、删除
    Oracle中有两类索引,唯一索引(unique)、位图索引(bitmap),
    当字段的值时有限的某几个值时,比较适合创建位图索引,它是采用二进制进行存储,查询时效率非常高。
    */
    -- 给student_name 添加唯一索引,
    CREATE UNIQUE INDEX idx_studentname_u ON tb_student (student_name);
    
    -- 给sex添加位图索引
    CREATE BITMAP INDEX idx_sex_b ON tb_student (sex);
    
    -- 查看索引:user_indexes表
    select * from user_indexes;
    -- 删除索引 DROP INDEX idx_sex_b;

    十、 创建同义词

    /*十、    创建同义词
    语法:
    CREATE [PUBLIC] SYNONYM <同义词> FOR <数据库对象名>
    说明:若没有添加public表示创建的同义词使用范围为当前用户,
    反之就是所有用户
    举例:
    */
    select * from emp;
    CREATE PUBLIC SYNONYM emp FOR SCOTT.emp;
    -- 查看同义词All_SYNONYMS,私有的条件指定为大写用户名,公共的用public, select * from All_SYNONYMS where owner = 'PUBLIC' and TABLE_OWNER = 'SCOTT';
    -- 删除同义词,若同义词是公共的需要添加public drop public synonym emp;
  • 相关阅读:
    POJ1258——Prim——Agri-Net
    POJ2485——Prim——Highways
    POJ1789——Prim——Truck History
    POJ1125——Floyed——Stockbroker Grapevine
    POJ2253——Floyed——Frogger
    字符串处理 Codeforces Round #297 (Div. 2) B. Pasha and String
    模拟 Codeforces Round #297 (Div. 2) A. Vitaliy and Pie
    DP+埃氏筛法 Codeforces Round #304 (Div. 2) D. Soldier and Number Game
    queue+模拟 Codeforces Round #304 (Div. 2) C. Soldier and Cards
    贪心 Codeforces Round #304 (Div. 2) B. Soldier and Badges
  • 原文地址:https://www.cnblogs.com/zhangzimuzjq/p/11820775.html
Copyright © 2011-2022 走看看