您的位置:首页 > 数据库 > Oracle

01-oracle数据库基础

2019-01-16 17:15 239 查看
版权声明:Unruly https://blog.csdn.net/weixin_41660948/article/details/86511259

文章目录

  • PLSQL注意点
  • 一些示例代码
  • Oracle基础知识

    一、Oracle主要的特点如下:

    1.支持多用户、大量的事务处理。

    2.在保持数据安全性和完整性的方面性能优越。

    3.支持分布式处理。

    4.具有可移植性。

    二、安装教程博客地址:打开浏览器查看教程

    三、sqlplus操作oracle数据库

    1. 在命令行输出

      services.msc
      打开系统服务

    2. oracleServletXXXX
      (X代表自己的全局用户名)设置为手动

    3. 启动服务(设置为手动后以后要用的时候再打开)

    4. 进入

      sqlpuls
      操作系统

        system/linux – 用户名/密码
      • scott/12345
    5. 如果

      scott
      账户锁住 ,用
      sys
      账户登录,密码为设置的全局密码。

        alert user scott account unlock
    6. 修改密码

        passw scott
        – 表示修改scott用户的密码

    四、PLSQL Develper的安装使用

    • PLSQL Develper是荷兰的一家公司研发的
    • 收费,常用的Oracle客户端工具
    • PLSQL Develper的安装和使用 使用之前重新配置一下监听
    • 启动监听服务 dad
  • 配置环境变量,解决中文乱码问题⤵️
      [li] NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    [/li]
  • 如果plsql没有安装好 选择点击这里
  • Oracle数据类型

    一、字符数据类型

    1. char
      字节数,定长。

    2. varchar2
      字节数

    3. nchar
      字符数

    4. nvarchar2
      字符数

      官方推荐varchar2,是varchar进阶。同理nvarchar2是nvarchar的进阶

      var和无var的区别,var表示可变长度,自动调节

    一般而言纯英文推荐

    char
    varchar
    ,中文推荐
    nchar
    nvarchar

    二、数值类型

    1. number(p,s)

    p为精度,从左边第一个不为0的数开始算。

    s为范围,表示几位小数。

    • 案例: number(4,2) ➡️ 123.89 –> 报错 (有效数字为5,超过了4为)
    • number(4,2) ➡️ 12.789 –> 12.79
    • number(3,4) ➡️ 1 –> 报错(1.0000)超过了3位有效数
    • number(3,4) ➡️ 0.0001 –> 0.0001
    • number(3,4) ➡️ 0.1 –> 报错(0.1000) 超过了3位有效数

    三、日期类型

    ​ a、date(储存年月日时分秒)

    ​ b、timestamp(精确到毫秒,可以精确的判断两条数据的插入先后)

    ​ c、查看当前系统时间:

    select sys from dual


    四、LOB数据类型(Large Object)

    ​ a、CLOB: 大文本,大量字符数据(常用)

    ​ b、BLOB: 大的二进制对象,图形,视频等等

    ​ c、BFILE: binary lob,储存一个二进制文件应用,文件存在操作系统之中

    ​ d、NCLOB: Unicode格式的CLOB.

    Oracle语言简介

    一、SQL语言基本概念

    • DDL
      数据定义语言:create,alert,truncate(截断),drop 👀 命令
    • DML
      数据操作语言:insert,delete,update,select 👀 命令
    • TCL
      事务控制语言:commit,savepoint(保存点),rollback 👀 命令
    • DCL
      数据控制语言:grant(授予)和remove(移除) 👀 命令

    二、Oracle常用的PLSQL语句

    1. 建表

      create table
      和mysql规则一样。

    2. 增删改查和mysql规则一样。

    3. 去重distinct ,根据查询的列如果全相同。(名字和年龄完全相同)

      例如:select
      distinct
      stuName,stuage from stuinfo
  • 表复制(完全复制)

      create table
      newTable
      as
      select
      列名
      from
      oldTable
  • 表复制(仅表结构)

      create table
      newTable
      as
      select
      列名
      from
      oldTable
      where
      1=2
  • 数据复制(列名和类型相同)

      insert into
      newtable
      select
      *
      from
      oldtable
  • 统计个数技巧

      select count(*) from table;

    1. select count(1) from table; ⬅️ 效率更高推荐使用

  • 事务控制

      commit: ​ ​ ⬅️ oracle默认开启事务需要手动提交事务。

    1. rollback: ​ ⬅️ 用于回滚事务。

    2. savepoint: ⬅️ 设置保存点。

    3. rollback to: ⬅️ 表示回滚到保存点。

      insert into stuinfo values(18,'123',12,10023,15);
      insert into stuinfo values(18,'31',13,10023,15);
      savepoint p1;       --   建立回滚点
      insert into stuinfo values(18,'haha',13,10023,15);
      rollback to p1;     --   回归到指定位置

    三、Oracle中的伪列

    1. 伪列就像表中的某一列,但实际上它并未储存在表中。

    2. 伪列可以从表中查询,但是不能进行增删改

    3. rowId:唯一的标识数据库中的一行,以最快的方式访问表中的一行。

    4. rownum:对于查询的每一行,rownum对返回结果进行编号,从1开始

        查询前几条数据:

        select * from emp where rownum < 5

      • 查询第一条数据:

        select * from emp where rownum = 1

      • 分页查询(根据rowNum实现):

      • select * from (
        select e.*,rownum rownums from emp e
        order by sal desc
        ) a
        where a.rownums between 5 and 9;

    四、PLSQL基础操作符

    1.操作算数符

    +、-、*、/

    2.操作算数符

    =、!=、>、<、>=、<=

    between….and…、in(…)、like、is null

    3.逻辑算数符

    and、or、not

    五、PLSQL集合操作符

    1. union(联合)

    2. union All(联合所有)

      -- union和union all 使用的条件
      --作用:联合查询,是不是同一张表无所谓
      ---1.查询表的列数要相同,数据类型要相同
      ---2.union去重,union all不去重
      select * from stuinfo where stuno in (1,2,3)
      union
      select * from stuinfo where stuno in (1,2,4)

    3. intersect(交集)

    4. minus(减集)

      -- intersect和minus的作用
      -- intersect表示查询共有的条件
      -- minus表示查询不共有的条件
      select * from stuinfo where stuno in (1,2,3)
      intersect
      select * from stuinfo where stuno in (1,2,4)

    六、Oracle常用函数

    1. to_char(): 把日期、是最转换为特定格式的字符串。== toString

      to_char(55)
      ===> 55
    2. to_char(55,‘99.99’)
      ===> 55.00
    3. to_char(sysdate,‘yyyy-MM-dd’)
      ===>
  • to_date(): 把字符串转为日期。

      to_date(‘1999-08-09’,‘yyyy-MM-dd’)
  • to_number(): 转换为数值类型。

      to_number('99')
  • nvl(exp1,exp2):

      等同于
      exp1 == null ? exp2 : exp1
  • nvl2(条件列名,第一个值,第二个值):

      等同于
      条件 == null ? 第二个值 : 第一个值
  • decode(列名,条件1,返回值1,条件2,返回值3,…默认值):

    switch(val){
    case if1:
    return then1;
    case if2:
    return then2;
    default:
    return else;
    }
  • 常用函数API:点击这里打开查看Oracle常用函数

  • *七、分析函数

    1.分析函数的作用和语法

    分析函数名([参数]) over (partition by [根据什么分组] order by [排序名])

    作用: 可实现按指定的字段分组排序,对于相同分组字段的结果集进行排序,其中partition by 为分组字段,order by 指定排序字段

    2.Oracle分析函数与聚合函数的区别

    分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

    3.示例代码

    --- 分析函数(现在简单理解为用于排名的)
    --- 分析函数语法:函数名([参数]) over ([分区子句] [排序子句])
    
    -- row_number():
    -- 对于部门编号进行分组,根据薪水进行从大到小排名。
    select ename,deptno,sal,
    row_number() over(partition by deptno order by sal) "排名"
    from emp;
    
    -- dense_rank():
    -- 对于部门编号进行分组,根据薪水进行从大到小排名。如果薪水相同进行并列排序也就是说可以有两个第一。
    select ename,deptno,sal,
    dense_rank() over(partition by deptno order by sal) "排名"
    from emp;
    
    -- rank():
    -- 对于部门编号进行分组,根据薪水进行从大到小排名。
    -- 如果薪水相同进行并列排序。和dense_rank()的差别是两个第一的话就没有第二。是被顶替为第一的。
    select ename,deptno,sal,
    rank() over(partition by deptno order by sal) "排名"
    from emp;

    PLSQL注意点

    1.delete、truncate、和drop的差别

    相同点:都是删除移除的意思

    delete
    truncate table
    都可以清除表数据。

    drop table
    用于删除表。本身都用于移除。

    不同点:用法不同

    1. delete

      属于DDM语言,可以回退
    2. 可以有删除条件

    delete from 表名 where 条件

  • truncate table✖️

      DDL语言,无法回退
    1. 默认删除所有表内容,速度比delete快
    2. 不删除表结构

    truncate table 表名

  • drop table🗡

      DDL语言,无法回退
    1. 用户删除表(表结构、属性以及索引)

    drop table 表名

    一些示例代码

    -----------------------DDL语句-----------------------
    -----------------------DDL语句-----------------------
    -----------------------DDL语句-----------------------
    --- 1.建立表
    create table employee(
    empno number(4,0) not null primary key,
    ename varchar2(10) ,
    job varchar2(9),
    mgr number(4,0) ,
    hiredate date ,
    sal number(7,2) ,
    comm number(7,2),
    deptno number(2,0)
    );
    
    --- 2.创建注释
    comment on table employee is '员工表';
    
    --- 3.插入复制数据
    insert into employee select * from scott.emp;
    
    --- 4.创建表复制数据结构
    create table newTable
    as
    select * from oldTable;
    
    --- 5.创建表复制表结构
    create table newTable
    as
    select * from oldTable
    where 1=2;
    
    --- 6.修改外键
    alter table employee
    add constraint fk_depno foreign key(deptno)
    references dept(deptno);
    
    --- 7.修改主键
    alter table employee
    add constraint pk_empno primary key(empno)
    
    --- 8.修改col1 由number改为varchar2类型 (不兼容的类型)
    alter table employee modify ( empno varchar2(20))
    
    --- 9.修改表结构添加列
    alter table employee add(empTel_no varchar2(12),empAddress varchar2(20)	);
    
    -----------------------DML语句-----------------------
    -----------------------DML语句-----------------------
    --- 1.分页,主要在于rownum
    select * from (
    select e.*,rownum rownums from employee e
    order by sal desc
    ) a
    where a.rownums between 5 and 9;
    
    -----------------------常用函数-----------------------
    -----------------------常用函数-----------------------
    --- 1.to_char()  == toString
    select to_char(50) from dual;
    select to_char(89.123,'$99.99') from dual;
    select to_char(systimestamp) from dual;
    
    --- 2.to_date()  == 转换为date
    select to_date('19990412','yyyy-MM-dd') from dual;
    
    --- 3.to_number() == 转换为数值
    select to_number('12123.213') from dual;
    
    --- 4.nvl(exp1,exp2) ---> null 读音为nvl
    --- 等同于:exp1 == null ? exp2 : exp1
    select e.*,nvl(comm,0) from emp e;
    
    --- 4.nvl2(exp1,exp2,exp3) ---> nvl进阶
    --- 等同于:exp1 == null ? exp3 : exp2
    select e.*,nvl2(comm,comm,0) from emp e;
    
    --- 5.decode(colunm,if1,then1,if2,then2,...else)
    --- 等同于switch..case
    select e.*,decode(job,'CLERK',500,'MANAGER',1000,0) addSal
    from emp e;
    
    -----------------------后面额外附加-------------------------
    --- 创建序列
    create sequence sequenceName;
    --- 查看序列
    select seq_newsid.nextval from sys.dual;
    --- 查看所有用户序列
    SELECT * FROM user_sequences;
    --- 查看所有序列
    SELECT * FROM all_sequences;
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: