zoukankan      html  css  js  c++  java
  • Oracle数据库

    一、Oracle客户端工具

      SQL Plus工具

        1. 打开

          该工具是 Oracle 系统默认安装的自带的一个客户端工具。在 Windows cmd 命令行中输入“sqlplus”命令,就能够启动该工具了。

        2. 登录

          输入账户:system 和密码即可登录到本地数据库

        3. 连接远程数据库

          在cmd命令行中输入“sqlplus /nolog ”启动工具;

          输入命令:conn 用户名/密码@服务器连接字符串(数据库IP地址)as 连接身份

            *连接身份达标者用户连接数据库后拥有的权限,有如下三种身份

              sysdba:数据库管理员身份。权限:打开(关闭)数据库服务器、备份(恢复)数据库、日志功能、会话限制、数据库管理功能等。

                例如:sys用户必须用sysdba才能登录,system用户用普通用户就可以登录。

              sysoper:数据库操作员身份。权限:打开(关闭)数据库服务器、备份(恢复)数据库、日志功能、会话限制。

              normal:普通用户。权限:操作该用户下的数据对象和数据查询,默认身份是normal用户。

    二、Oracle服务

      (一)

        1、OraleServer+服务器名(ORCL)

          该服务是Oracle数据库的基础,只有启动该服务才能正常使用Oracle数据库。

        2、OracleOraDb11g_home1TNSlistenter

          在使用第三方客户端连接Oracle数据库时,该服务必须启动,才能连接到远程数据库!

          该服务为Oracle客户端提供监听程序的服务,只有启动该服务,本地的客户端程序才能通过监听连接到数据库,和数据库进行交互。

        3、Oracle ORCL VSS Wrier Service:

          Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(比如磁盘,阵列等)创建高保真的时间点映像,即映射拷贝(shadow copy)。它可以在多卷或者单个卷上创建映射拷贝,同时不会影响到系统的性能。(非必须启动)

        4、OracleMTSRecoveryService:

          服务端控制。该服务允许数据库充当一个微软事务服务器MTS、COM/COM+对象和分布式环境下的事务的资源管理器。(非必须启动)

        5、OracleOraDb11g_home1ClrAgent:

          Oracle数据库 .NET扩展服务的一部分。 (非必须启动)

        6、OracleJobSchedulerORCL:

          Oracle作业调度(定时器)服务,ORCL是Oracle实例标识。(非必须启动)

      (二)数据库的启动和关闭

        1、启动:conn 用户名/密码@数据库连接字符(IP地址) as 身份

        2、关闭:shutdown 数据库名

        3、重启:startup open

    三、Oracle用户

      (一)用户的创建

        create user student--用户名

        identified by "123456"--密码

        default tablespace USERS--表空间名
        temporary tablespace temp --临时表空间名
        profile DEFAULT    --数据文件(默认数据文件)
        account unlock-- 账户是否解锁(lock:锁定、unlock解锁)
        
        *通过上面语句,可以创建一个student用户,但是该用户现在还不能登录数据库,因为它没有登录数据库权限,最少他需要一个create session系统权限才能登录数据库。
     
      (二)用户权限
        Oracle数据库的权限分为:
          系统权限create session可以和数据库进行连接的权限;
               create table、create view等具有创建数据库对象的权限。
          对象权限:比如:对表中数据进行增删改查操作,拥有数据库对象权限的用户可以对所拥有的对象进行相应的操作。
     
      (三)数据库角色
        1、oracle数据库角色是若干系统权限的集合,给Oracle用户进行授数据库角色,就是等于赋予该用户若干数据库系统权限。常用的数据库角色如下:
          CONNECT角色:connect角色是Oracle用户的基本角色,connect权限代表着用户可以和Oracle服务器进行连接,建立session(会 话)。

          RESOURCE角色:resouce角色是开发过程中常用的角色。 RESOURCE给用户提供了可以创建自己的对象,包括:表、视图、序列、过程、触发器、索引、包、类型等。

          DBA角色:DBA角色是管理数据库管理员该有的角色。它拥有系统的所有权限,和给其他用户授权的权限。SYSTEM用户就具有DBA权限。

          *系统权限只能通过DBA用户授权,对象权限有拥有该对象权限的对象授权!(不一定是本身对象)用户不能自己给自己授权!

        2、语法:授权

    --GRANT 对象权限 on 对象 TO 用户    
    grant select, insert, update, delete on JSQUSER to STUDENT;
     
    --GRANT 系统权限 to 用户
    grant select any table to STUDENT;
     
    --GRANT 角色 TO 用户
    grant connect to STUDENT;--授权connect角色
    grant resource to STUDENT;--授予resource角色

        3、语法:取消用户权限

    -- Revoke 对象权限 on 对象 from 用户 
    revoke select, insert, update, delete on JSQUSER from STUDENT;
     
    -- Revoke 系统权限  from 用户
    revoke SELECT ANY TABLE from STUDENT;
     
    -- Revoke 角色(role) from 用户
    revoke RESOURCE from STUDENT;

        4、语法:Oracle用户的其他操作

    --修改用户信息
    alter user STUDENT
      identified by ******  --修改密码
      account lock;--修改用户处于锁定状态或者解锁状态 (LOCK|UNLOCK )

    四、SQL语句介绍

      在 Oracle 开发中,客户端把 SQL 语句发送给服务器,服务器对 SQL 语句进行编译、执行,把执行的结果返回给客户端。常用的SQL语句大致可以分为五类:

        1、数据定义语言(DDL),包括 CREATE(创建)命令、 ALTER(修改)命令、 DROP(删除)命令等。

        2、数据操纵语言(DML),包括 INSERT(插入)命令、 UPDATE(更新)命令、 DELETE(删除)命令、 SELECT … FOR UPDATE(查询)等。

        3、数据查询语言(DQL),包括基本查询语句、 Order By 子句、 Group By 子句等。

        4、事务控制语言(TCL),包括 COMMIT(提交)命令、 SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。 

        5、数据控制语言(DCL), GRANT(授权)命令、 REVOKE(撤销)命令。

    五、Oracle建表(create table)

      列代表着Oracle字段(column),行代表着一行数据(即一条数据记录)。

      1、Oracle 字段数据类型

    数据类型

    类型解释

    varchar2(length)

    字符串类型:存储可变长度的字符串,

    length:是字符串的最大长度,默认不填的时候是1,最长长度不超过4000

    char(length)

    字符串类型:存储固定长度的字符串,

    length:字符串的固定的最大长度,默认是1,最大长度不超过2000

    number(a, b)

    数值类型:存储数据的类型,可以存整数,也可以存浮点数。

    a 代表数值的最大位数:包含小数位和小数点,b 代表小数的位数。

    例:number(6, 2), 输入123.12345,实际存入:123.12

    data

    时间类型:存储的是日期和时间,包括年、月、日、时、分、秒。

    例:内置函数 sysdata 获取的就是 data 类型

    timestamp

    时间类型:存储的不仅是时间和日期,还包括了时区。

    例:内置函数 systimestamp 获取的就是 timestamp 类型

    clob

    大字段类型:存储的是大的文本。

    例:非结构化的txt文本,字段大于4000长度的字符串。

    blob

    二进制类型:存储的是二进制对象

    例:图片、视频、声音等转换过来的二进制对象

     
      2、create table语句
        案例1:创建stuinfo(学生信息表)
    -- Create table
    create table STUDENT.stuinfo
    (
      stuid      varchar2(11) not null,--学号:'S'+班号(7位数)+学生序号(3位数)(1)
      stuname    varchar2(50) not null,--学生姓名
      sex        char(1) not null,--性别
      age        number(2) not null,--年龄
      classno    varchar2(7) not null,--班号:'C'+年级(4位数)+班级序号(2位数)
      stuaddress varchar2(100) default '地址未录入',--地址 (2)
      grade      char(4) not null,--年级
      enroldate  date,--入学时间
      idnumber   varchar2(18) default '身份证未采集' not null--身份证
    )
    tablespace USERS --(3)
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
    -- Add comments to the table 
    comment on table STUDENT.stuinfo --(4)
      is '学生信息表';
    -- Add comments to the columns 
    comment on column STUDENT.stuinfo.stuid -- (5)
      is '学号';
    comment on column STUDENT.stuinfo.stuname
      is '学生姓名';
    comment on column STUDENT.stuinfo.sex
      is '学生性别';
    comment on column STUDENT.stuinfo.age
      is '学生年龄';
    comment on column STUDENT.stuinfo.classno
      is '学生班级号';
    comment on column STUDENT.stuinfo.stuaddress
      is '学生住址';
    comment on column STUDENT.stuinfo.grade
      is '年级';
    comment on column STUDENT.stuinfo.enroldate
      is '入学时间';
    comment on column STUDENT.stuinfo.idnumber
      is '身份证号';

        代码解析:

        (1)处: not null 表示学号字段(stuid)不能为空。

        (2)处:default 表示字段stuaddress不填时候会默认填入‘地址未录入’值。

        (3)处:表示表stuinfo存储的表空间是users,storage表示存储参数:区段(extent)一次扩展64k,最小区段数为1,最大的区段数不限制。

        (4)处:comment on table 是给表名进行注释。

        (5)处:comment on column 是给表字段进行注释。

        通过上面crate table命令创建了stuinfo学生信息表后,还可以给表添加相应的约束来保证表数据的准确性。比如:学生的年龄不能存在大龄的岁数,可能是错误数据、性别不能填入不是1(男)、2(女)之外的数据等。

        案例2:stuinfo(学生信息表)添加约束

    -- Create/Recreate primary, unique and foreign key constraints 
    alter table STUDENT.STUINFO
      add constraint pk_stuinfo_stuid primary key (STUID);
      --把stuid当做主键,主键字段的数据必须是唯一性的(学号是唯一的)
       
    -- Create/Recreate check constraints 
    alter table STUDENT.STUINFO
      add constraint ch_stuinfo_age
      check (age>0 and age<=50);--给字段年龄age添加约束,学生的年龄只能0-50岁之内的
       
    alter table STUDENT.STUINFO
      add constraint ch_stuinfo_sex
      check (sex='1' or sex='2');
       
    alter table STUDENT.STUINFO
      add constraint ch_stuinfo_GRADE
      check (grade>='1900' and grade<='2999');

    六、Oracle查询(select)

      1、select 命令结构

    select *|列名|表达式 from 表名 where 条件 order by 列名

        例1:查询学生信息表(stuinfo)中“李四”同学的基本信息:

    select t.* from STUDENT.STUINFO t where t.stuname = "李四"

        例2:查询“李四”同学的学号、班级、年级和地址:

    select t.stuid, t.classno, t.stuaddress, t.grade from STUDENT .STUINFO t where t.stuname = "李四"

        例3:查询班级“C201801”所有同学信息,按年龄进行升序展示:

    select t.*  from STUDENT.STUINFO t where t.classno = 'C201801' ORDER BY T.AGE ASC 

        语法解析:

        1、“t”代表stuinfo的别名。

        2、  "*"  代表所有字段。

        3、表达式可以是函数(列名)、常数、连接词“||”等组成的表达式。

        4、where子语句是查询语句的条件。

        5、order by :查询结果按某个字段进行排序,默认是升序,desc是降序。

      

      2、备份查询数据

        Oracle进行表数据备份时,可以利用create table(建表)的方式对select查询的结果进行快速备份。

        备份查询数据的命令结构:

    create table  表名  as  select  语句

        例:备份学生信息表(stuinfo)的数据

    create  table student.stuinfo_2018  as select  * from  student.stuinfo;
    
    select * from student.stuinfo_2018;

    七、Oracle插入(insert into)

      1、insert 命令结构:

    insert into 表名(列名1,列名2......)value (值1,值2......);

      语法解析:

        1、列名可以省略,当列名不填时,默认的是表中的所有列,列的顺序是按照建表的顺序进行排列的。 

        2、列名的数量和值的数量要一致,并且值的类型要和列的类型一一对应。

        3、当表当中某些字段设置了某些约束的情况下,必须按照字段的约束来进行该值的插入,例如:学生信息表(STUINFO)当中设置有主键(主键字段是STUID),因此该字段必须具有唯一性,不能和原有的数据重复。age、stuname、calassno等字段是必填字段,因此是必须有值的。

      例1:向学生信息表(stuinfo)插入一条数据:

    insert into STUDENT.STUINFO(STUID, STUNAME, SEX, AGE, CLASSNO, STUADDRESS, GRADE, ENROLDATE, IDNUNBER) value ('SC201801005', '龙七', '1', 26, 'C201801', '福建省厦门市XXX号', '2018', to_date('01-09-2018', 'dd-mm-yyyy'),
    '3503021992XXXXXXXX'); select * from student.stuinfo t where t.stuid='SC201801005';

      例2:向学生信息表(stuinfo)插入重复数据:

    insert into STUDENT.STUINFO (STUID, STUNAME, SEX, AGE, CLASSNO, STUADDRESS, GRADE, ENROLDATE, IDNUMBER)
    values ('SC201801005', '龙七', '1', 26, 'C201801', '福建省厦门市XXX号', '2018', to_date('01-09-2018', 'dd-mm-yyyy'),
     '3503021992XXXXXXXX');

      

      2、insert 插入一个 select 的结果集

      命令结构

    insert intoselect 子句

      例3:把上一章节利用 Oracle 查询(select)语句备份的表 stuinfo_2018 的数据一次插入表stuinfo 当中:

    delete from student.stuinfo t where t.stuid in (select b.stuid from student.stuinfo_2018 b );
     
    insert into student.stuinfo select * from student.stuinfo_2018;
     
    select * from student.stuinfo;

      *数据操纵语言(DML)包括 INSERT(插入)命令、 UPDATE(更新)命令、 DELETE(删除)命令、 SELECT … FOR UPDATE(查询)等。只有提交(commit)后才能持久化到数据。库。

    八、更新(update)

      1、update 命令结构

    update 表名 set 列名1=值1,列名2=值2,列名3=值3..... where 条件

        例1:更新学生“张三”的年龄和身份证信息:

    update student.stuinfo t
       set t.age = '24', t.idnumber = '3503021994XXXXXXXX'
     where t.stuname = '张三';
    commit;
    select * from student.stuinfo t where t.stuname='张三';

      

      2、update 利用另外一张表关联更新本表数据的命令结构如下:

    update student.stuinfo t
       set (age, idnumber) =
           (select age, idnumber from student.stuinfo_2018 b where b.stuid = t.stuid)
     where exists (select 1
              from student.stuinfo_2018 b
             where b.stuid = t.stuid
               and b.stuname = '张三');
                
    select *from student.stuinfo t where t.stuname='张三';

    九、删除(delete)

      1、delete 命令结构

    delete from 表名 where 条件

      命令解析:

      (1)当 delete from 不加 where 条件时,表示是把表中的数据全部删除。

        例1:删除学生信息表(stuinfo)中学生“张三”的数据:   

    delete from stuinfo t where t.stuname="张三"

      

      2、truncate命令

        truncate命令也是数据删除命令,他是直接把Oracle表数据一次删除的命令,truncate命令是一个DDL命令,不同于delete是DML命令。

        truncate 命令结构:

    truncate table 表名

        例1:删除学生信息备份表(stuinfo_2018):

    truncate table stuinfo_2018

      

      3、delete 与  truncate 的区别

        (1)truncate 是 DDL 命令,命令执行完就提交,删除的数据不能恢复; DELETE 命令是 DML 命令,命令执行完需提交后才能生效,删除后的数据可以通过日志文件恢复。

        (2)如果表中的数据量较大,TRUNCATE的速度比DELETE速度快很多。

        (3)truncate删除将重新设置表索引的初始大小,而delete不能。

        (4)delete能够触发表上相关的delete触发器,而truncate则不会触发。

        (5)delete删除的原理是一次一条从表中删除数据,并将删除操作当做事物记录在数据库的日志当中,以便进行数据回滚。而truncate是一次性进行数据页的删除,因此执行速度快,但是不能回滚。

        总结:truncate命令是属于DDL命令,一次性删除表中所有数据,并且数据不能恢复,在实际开发过程当中truncate命令慎用。

      

    十、Oracle 运算符

      1、算术运算符(+、-、*、/【/获得的结果是浮点数】)

      2、关系运算符【常用于where条件语句中】

    符号 解释
    = 等于
    > 大于
    < 小于
    <> 或者 != 不等于
    >= 大于等于
    <= 小于等于

      3、逻辑运算符:AND、OR、 NOT

    十一、字符串连接符 ||

      例:

    select '姓名:' || c.stuname || ', 课程:' || b.coursename || ', 成绩:' || a.score || '分。' as sxcj
      from score a, course b, stuinfo c
     where a.courseid = b.courseid
       and a.stuid = c.stuid

      结果:

    十二、Oracle DISTINCT

      Oracle DISTINCT关键字的作用可以对Oracle查询结果进行重复数据的消除。

      1、语法

    select distinct 列1, lie2, 列3... from 表名;

      当关键字DISTINCT后面只有一个列1时,表示的是单个字段查询结果的不重复数据,当后面跟着多个列值时,表示的是多个字段组成的查询结果的所有唯一值,进行的是多个字段的分组消除。

  • 相关阅读:
    redis方法中文解释
    简单redis队列实现
    PHP中常用的字符串操作【转】
    SQL循环语句
    crontable 实例
    自动以当前时间命名文件
    tar命令详解
    PHP 数据类型验证和获取
    Nginx 配置文件nginx.conf的完整配置说明
    sql server DateFormat(转)
  • 原文地址:https://www.cnblogs.com/moyu557/p/11773876.html
Copyright © 2011-2022 走看看