zoukankan      html  css  js  c++  java
  • Oracle数据库的入门之一

    Oracle的介绍:

      Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的 适应高吞吐量的数据库解决方案。

      ORACLE 数据库系统是美国ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S体系结构的数据库之一。比如SilverStream 就是基于数据库的一种中间件。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只要在一种机型上学习了 ORACLE知识,便能在各种类型的机器上使用它。

    Oracle数据结构

       <--这里是引入的别人对数据库的理解-->

    在学习oracle中,体系结构是重中之重,一开始从宏观上掌握它的物理组成、文件组成和各种文件组成。掌握的越深入越好。在实际工作遇到疑难问题,其实都可以归结到体系结构中来解释。体系结构是对一个系统的框架描述。是设计一个系统的宏观工作。这好比建一栋大楼。你首先应该以图纸的方式把整个大楼的体系架构描述出来。然后一点点的往里面填充东西。下面我们先以一个图解的方式对oracle体系结构有一个基本了解

    根据示图,便于我们记忆,示图分三部分组成,左侧User Process、Server Process、PGA可以看做成Clinet端,上面的实例(Instance)和下面的数据库(Database)及参数文件(parameter file)、密码文件(password file)和归档日志文件(archived logfiles)组成Oracle Server,所以整个示图可以理解成一个C/S架构。 Oracle Server由两个实体组成:实例(instance)与数据库(database)。这两个实体是独立的,不过连接在一起。在数据库创建过程中,实例首先被创建,然后才创建数据库。在典型的单实例环境中,实例与数据库的关系是一对一的,一个实例连接一个数据库,实例与数据库也可以是多对一的关系,即不同计算机上的多个实例打开共享磁盘系统上的一个公用数据库。这种多对一关系被称为实际应用群集(Real Application Clusters,RAC)RAC极大提高了数据库的性能、容错与可伸缩性(可能耗费更多的存储空间)并且是oracle网格(grid)概念的必备部分。

    下面我们来详细看一下oracle数据库的体系架构

    Oracle体系架构主要有两大部分组成:数据库实例(Instance)和数据库文件(database)

    数据库实例

    指数据库服务器的内存及相关处理程序,它是Oracle的心脏。与Oracle性能关系最大的是SGA(System Global Area,即系统全局区活共享内存区),SGA包含三个部分:

    1、数据缓冲区,可避免重复读取常用的数据;

    2、日志缓冲区,提升了数据增删改的速度,减少磁盘的读写而加快速度;

    3、共享池,使相同的SQL语句不再编译,提升了SQL的执行速度。

    oracle数据库实例的另一部分就是一些后台进程了,他主要包括:

    1.系统监控进程

    2.进程监控

    3.数据库写进程

    4.日志写进程

    5.检验点进程

    6.其他进程

    这些后台进程合起来完成数据库管理任务

    在访问数据库的时候。器后台先启动实例。启动实例前要先分配内存区。然后在启动后台进程。数据库启动过程中必须启动上面的前五个进程。否则实例无法创建。

    注意:在启动oracle数据库的时候。因为有些进程是在开机启动项中自动启动的。所以占用了很大一部分内存。如果您电脑上还有一些其他占用内存比较大的程序。在启动oracle数据库的时候有可能会因内存不足而启动失败。

    Oracle服务器

    Oracle服务器包括两部分:数据库实例和数据库文件。他们构成了也就是所谓的数据管理系统(DBMS)

    物理结构:oracle的物理结构指的其实就是一些存在硬盘上的各种文件。其最终目的就是存储和获取相关数据。这些存在硬盘上的文件组成了oracle数据库的物理结构

    Oracle中主要包括三种文件:

    1.数据文件

    2.控制文件

    3.重做日志文件

    参数文件和密码文件:

    参数文件:定义了数据库实例的特性,他是正文文件

    密码文件:授予用户启动和关闭数据库的实例。主要有二进制数据组成

    Oracle数据库的内存结构:SGA和PGA

    SGA:数据库实例的一部分。数据库实例的启动会首先分配系统全局区(SGA)

    1.共享池:共享sql和pl/sql代码,即把解析的sql代码在这里缓存,PL/SQL不仅缓存还共享。这样大大提高了直接访问磁盘获得sql的速度。

    1)库高速缓存:存储最近使用过的sql语句。利用LRU(最近最少使用)算法来管理缓存。最近最少使用算法是一种比较常用的算法。在这里当库高速缓存接近满的时候。它会把缓存中最近最少使用的数据清除缓存中。加入新的缓存sql。

    查看共享池的大小使用参数shared_pool_size

    Sql>show parameter shared_pool_size

    设置共享池大小

    Sql>alter system set shared_pool_size=16M

    注:在下面的的内容中。如果提到有关参数。如没有特殊说明。设置和查看参数值都是用以上类似方法。以后就不在重复了。并且这些参数必须是在以系统管理员system登陆时才能查看和修改。用类似scott用户是不能查看和修改的。

    Oracle提供了DB_CACHE_SIZE(数据库大小)和DB_BLOCK_BUFFERS(数据库块个数)设置库高速缓存的大小,即为两者的成绩。

    2)数据字典高速缓存

    存储数据文件、表、索引、列、用户、权限信息和其他一些数据库对象的定义。把相关的数据字典信息放入缓存来提高查询的响应时间。其大小取决于共享池的大小。

    2.数据库高速缓存

    存储了最近从数据文件读入的数据块信息或用户更改后需要写回数据库的数据信息。内存读取比磁盘读取的速度快的多。提高了访问速度。这里的存取也采用了LRU(最近最少使用)算法。

    Oracle数据库引入了缓冲区顾问参数(Buffer cache advisory parameter)用于启动和关闭统计信息。这些信息用于预测不同缓冲区的大小导致的不同行为特性。三种状态:OFF:ON:READY

    设置顾问缓存为开启状态后。可以通过动态性能视图:v$db_cache_advice查看缓冲区的建议信息

    3.重做日志缓存

    在执行insert、update等操作后。数据发生了改变。这些变化的数据在写入数据库高速缓存前会先写入重做日志缓冲区。包括变化之前的数据。可以通过初始化参数log_buffer查看它的大小。此参数为静态参数,不能修改。

    4.大池和java池

    大型池(Large Pool)

    在SGA中大型池是可选的缓冲区。它可以根据需要有管理权进行配置。它可以提供一个大的区以供象数据库的备份与恢复等操作。

    在以下几种情形下会启用:

    一,backup 和 restore 操作的时候

    二,当启动UGA, I/O slaves的时候

    三,设置MTS服务器的时候,用户信息的存放也使用到Large Pool

    可以使用以下命令进行更改Large Pool的大小:

    ALTER SYSTEM SET Large_Pool_Size = 64m;

    Java池用于编译java语言编写的指令。通过java_pool_size查看和修改大小。大小由数据库在SGA自动分配和管理。所以查看的时候值为0;

    Oracle的连接和会话

    连接 (connection)与会话 (session)这两个概念均与用户进程 (user process)紧密相关,但二者又具有不同的含义。

    连接 :用户进程和 Oracle 实例间的通信通道(communication pathway)。这个通信通道是通过进程间的通信机制(interprocess communication mechanisms)(在同一个计算机上运行用户进程和 Oracle 进程)或网络软件(network software)(当数据库应用程序与 Oracle 服务器运行在不同的计算机上时,就需要通过网络来通信)建立的。

    会话 :用户通过用户进程与 Oracle 实例建立的连接[此处连接与上文中的连接含义不同 ,主要指用户和数据库间的联系 ]。例如,当用户启动 SQL*Plus 时必须提供有效的用户名和密码,之后 Oracle 为此用户建立一个会话。从用户开始连接到用户断开连接(或退出数据库应用程序)期间,会话一直持续。

    Oracle 数据库中的同一个用户可以同时创建多个会话。例如,用户名/密码为的SCOTT/TIGER 用户可以多次连接到同一个 Oracle 实例。

    当系统没有运行在共享服务模式下时,Oracle 为每个用户会话创建一个服务进程(server process)。而当系统运行在共享服务模式下时,多个用户会话可以共享同一个服务进程。

    <--本人对数据库的简单理解--->

    数据库结构分为:

    数据库:Oracle数据库是数据的物理存储.这就包括了(数据文件ORA或者DBF,控制文件,联机日志,参数文件),其实Oracle数据库的概念和其他数据库不一样,这里的数据库是一个操作系统就一个数据库,可以看作是Oracle就是一个大数据库.

    实例:一个Oracle(Oracle Instance) 有一系列的后台进行(Background Processes) 和内存结构(Memory Structures)组成,一个数据库可以有n个实例

    用户:在实例下建立的,不同的实例可以建相同名字的用户

    表空间:是Oracle对数据库上相关数据文件(ORA或者DBF文件)的逻辑映射.一个数据库在逻辑上被划分为一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构,每个数据库至少有一个表空间.(称之为system表空间)

    每个表空间由磁盘上的一个或者多个文件组成,这些文件叫做数据文件,一个数据文件只能数据一个表空间

    数据文件: 数据文件是数据库的物理存储单位,数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中,而.一个表空间可以由一个或者多个数据文件组成,一个数据文件只能属于一个表空间.一旦数据文件被加入到某个表空间以后,就不能删除这个文件,如果要删除某个数据文件,只能删除起所属的表空间才行.

    注:表的数据,是由用户放入到某个表空间中的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中.

      由于Oracle数据库不是普通的概念,oracle是有用户和表空间对数据进行管理和存放的,但是表不是有表空间去查询的,而是由用户去查的,因为不用用户可以在同一个表空间建立同一个名字的表,这里区分就是用户了.

    理解::

     在实例下面分为表空间和用户,用户经过授权以后,可以进入表空间进行操作表空间中的表数据.

     

    创建表空间:

            Oracle数据库的逻辑单元是表空间.数据库---表空间.

    一个数据库下面可以创建多个表,

    一个表空间可以和多个数据文件相关联

    一个表空间可以被多个用户进行操作,

    一个用户可以创建多个表

    --创建一个名字为qingmu的表空间
    create tablespace qingmu  --要被创建的表
    datafile 'c:/datafile/qingmu.dbf'  --dbf的位置
    size 200M  --dbf文件的大小
    autoextend on  --自动拓展,开启
    next 20M;  --下次拓展时,为一次20M

    2. 删除的语法
    -- 只能删除逻辑单位,不能删除物理单位
    drop tablespace 表空间名称;
    -- 删除了逻辑和物理单位
    drop tablespace 表空间名称 including contents and datafiles;

    qingmu 为表的名字

    datafile  制定表空间对应的数据文件

    size   定义的表空间初始的大小

    autoextend on 自动增长,当表空间存储都占满时,自动增长

    next 指定的是一次自动增长的大小.

    用户:

    --创建用户,名字为lantian
    create user lantian identified by dadi default tablespace qingmu

    权限:

      Oracle中已经存在的三个重要的角色:connect角色,resource角色,dba角色

      Connect角色---是授予用户的典型的权利,最基本的   

        ALTER SESSION --修改会话
        CREATE CLUSTER --建立聚簇
        CREATE DATABASE LINK --建立数据库链接
        CREATE SEQUENCE --建立序列
        CREATE SESSION --建立会话
        CREATE SYNONYM --建立同义词
        CREATE VIEW --建立视图
      RESOURCE 角色: --是授予开发人员的
        CREATE CLUSTER --建立聚簇
        CREATE PROCEDURE --建立过程
        CREATE SEQUENCE --建立序列
        CREATE TABLE --建表
        CREATE TRIGGER --建立触发器
        CREATE TYPE --建立类型
      DBA角色:拥有全部特权,是系统最高权限,只有 DBA才可以创建数据库结构,并且系统
      权限也需要DBA授出,且 DBA用户可以操作全体用户的任意基表,包括删除

    --赋予权限
    grant connect,resource to lantian

     --回收权限:
      revoke 权限列表 from 用户列表;
      revoke resource from itheima_341;
     -- 查询当前用户的权限
      select * from session_privs;

    
    

     --用户的操作
      解锁/锁定用户
      alter user 用户名 account lock/unlock;
      修改(重置)密码
      alter user 用户名 identified by 密码;

    Oracle中的数据类型

    在oracle中Date  日期类型,上面的图片中写错了,  一种为date 日期类型,一种为datestamp时间戳类型(这种时间更精确,是秒后的9位.).

    关于日期类型,在使用时候,需要对这个类型进行一次转换.

    使用to_Date和to_char

    INSERT INTO FLOOR VALUES ( to_date ( '2007-12-14 14' , 'YYYY-MM-DD HH24' ) );
    查询显示:2007-12-14 14:00:00.0
    -------------------

    to_date(char[fmt[,'nls_param’]]):将字符类型按一定格式转化为日期类型
    具体用法:to_date('2004-11-27','yyyy-mm-dd'),前者为字符串,后者为转换日期格式,注意,前后两者要一一对应。
    当时间为null时的用法:select to_date(null) from dual;
    结果:

    1.2、to_char(date[,fmt,[,nls_param]]):将日期转按一定格式换成字符类型 ,fmt,nls_param为可选项,fmt指定了要转化的格式,nls_param指定了返回日期所使用的语言

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual; 
    结果:
    在使用时分秒的时候,需要注意,oracle中的分是mi
     
        to_date(p1,p2): 把字符串转换为日期
          p1: 字符串
          p2: 解析字符串的格式                          
    select  to_date('2019-03-21 11:45:27 thursday','yyyy-mm-dd hh24:mi:ss day') from dual;      
    to_char(p1,p2):把日期转换为字符串 
          p1: 日期
          p2: 解析日期的格式  
    select sysdate,to_char(sysdate ,'yyyy-mm-dd hh24:mi:ss day') from dual;
    insert into emp(empno,hiredate) values(1005,to_date('2019-03-21','yyyy-mm-dd'));
     
    对于表的管理:
    --创建表
    create table customer(
    cid number primary key not null,
    cname varchar2(20),
    csex char(2) check(csex in('男','女')),
    birthday date,
    cage number default 18
    )
    --删除表
    drop table customer
    --插入数据
    insert into customer values (1,'张三','女',to_date('1997-04-14','yyyy/MM/dd'),19);

      表的修改

    --对于表的修改
    --增加一个列
    alter table customer add address varchar2(30);
    
    
    --修改列的属性
    alter table customer modify  cname varchar2(200);
    
    --修改列的名字
    alter table customer rename column address to addresssssssss
    
    --删除列
    alter table customer drop column addresssssssss;

     约束
      主键
      非空
      唯一
      默认
      外键
      检查(check)

    create table customer(
    id number primary key not null,
    custName varchar2(20) unique,
    age number default 18 check(age between 1 and 150),
    sex char(2) check(sex in('男','女'))
    )

    sql语句的分类
      DDL:数据定义语言:create drop alter
      DCL:数据控制语言:grant revoke
      DML:数据操作语言: insert update delete
      DQL:数据查询语言: select

    序列:实现主键自增的效果

        在很多数据库中都存在一个自动增长的列,如果现在要想在 oracle 中完成自动增长的功能,
        则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。


      语法: create sequence 序列名;


      -- 默认从1开始,步长为1,没有最大值,不会循环,默认缓存20个
      用法:
      属性:nextval: 获取序列的下一个值
      currval: 获取序列的当前值, 在使用currval之前必须先使用一次nextval
      

    --创建序列
    create sequence cust_seq
    insert into customer values(cust_seq.nextval,'maliu2',25,'女')
    select cust_seq.currval from dual;


      了解完整的语法
      create sequence 序列名
      start with 1 -- 初始值(第一个值)
      increment by 1 -- 步长
      maxvalue 10/nomaxvalue/minvalue 1/nominvalue --最大最小值设置
      cycle -- 循环
      cache 20; -- 缓存20个值
     dual : 是一张虚表
      作用是:为了完善语法结构
      select length('abc') from dual;

    scott用户

    在orcal中有一个用户,叫做scott,需要使用system的用户进行解锁,登录密码是tiger

    数据结构是:

     

    单行函数: 一行数据返回一行结果

    字符串函数:

    
    

    --大小写进行转换
    select upper('abc') from dual;

    
    

    select lower('ABC') from dual;

    
    

    select round(5.22222,2) from dual;

    
    

    --长度的获取
    select length('avc') from dual;

     

    日期函数:

    --日期函数
    --天数
    select sysdate-hiredate from emp;
    --周数
    select (sysdate-hiredate)/7 from emp;
    --月数
    select months_between(sysdate,hiredate) from emp;

    数值函数:

    --四舍五入
    --保留三位有效数字 select round(2.55555,3)from dual; --保留一位有效数字 select round(2.55555) from dual; --保留两位有效数字 select round(2.55,2)from dual;

    --截取
    select trunc(3.36) from dual;
    select trunc(3.36,1)from dual;

    --求摸
    select mod(3,10) from dual;

    --空值处理nvl

    select sal * 12 + nvl(comm,0), sal, nvl(comm,0) from emp;

    多行函数:多行数据返回一个结果

    count ,sum ,avg, max,min

    分组统计:

    统计函数: * 效率最低
                   主键                           效率比较高
                   0,1,2,3,4... 常量列  效率比较高
    where 子句在分组之前执行
    having子句在分组之后进一步筛选
    分组后能查询的列
            1: 聚合函数
            2: 在group by中出现的列
    
    select count(1), d.dname
      from emp e, dept d
     where e.deptno = d.deptno
    //这里没有被进行分组的元素,不能够被select出来. group by e.deptno,d.dname having count(
    1) > 5;
    多表查询:
    1. 内连接:查询符合条件的数据
    -- 查询每位员工的领导:显示员工和领导的基本信息
    select e.empno,e.ename ,m.empno,m.ename 
    from emp e ,emp m
    where m.empno = e.mgr;
    -- 在上面的基础上,查询员工的部门名称
    -- 分析:引入部门表
    select e.empno,e.ename ,p.dname,m.empno,m.ename 
    from emp e ,emp m ,dept p
    where m.empno = e.mgr
    and e.deptno = p.deptno;
    -- 在上面的基础上,查询领导的部门名称
    select e.empno,e.ename ,p1.dname,m.empno,m.ename ,p2.dname
    from emp e ,emp m ,dept p1,dept p2
    where m.empno = e.mgr
    and e.deptno = p1.deptno
    and m.deptno = p2.deptno;
    -- 在上面的基础上,查询员工和领导的工资等级
    select e.empno,e.ename ,p1.dname,s1.grade,m.empno,m.ename ,p2.dname,s2.grade
    from emp e ,emp m ,dept p1,dept p2,salgrade s1 ,salgrade s2
    where m.empno = e.mgr
    and e.deptno = p1.deptno
    and m.deptno = p2.deptno
    and e.sal between s1.losal and s1.hisal
    and m.sal between s2.losal and s2.hisal;
    2. 外连接:能显示出基准表中所有的数据
        -- -- 查询每位员工的领导:显示员工和领导的基本信息(没有领导的也要展示)
        左外: left join on
        select e.empno,e.ename ,m.empno,m.ename 
        from emp e left join emp m
        on m.empno = e.mgr;
        右外: right join on
        select e.empno,e.ename ,m.empno,m.ename 
        from emp m right join emp e
        on m.empno = e.mgr;    
        特殊外连接:(+): 以对方表为基准表
            select e.empno,e.ename ,m.empno,m.ename 
        from emp e ,emp m
        where  e.mgr= m.empno(+);
    子查询:
    a. 什么是子查询
        一个查询语句包含另一个查询语句
    b.栗子:查询与7788同一个部门的员工信息
        -- 先查7788 的部门编号,以部门编号为条件查询员工信息
        select * from emp where deptno = (select deptno from emp where empno = 7788);
    c.栗子:查询存在员工的部门
        select * from dept where deptno in(select distinct deptno from emp)
    d.栗子: 查询薪水大于本部门平均薪水的员工信息
     -- 分析:查询每个部门的平均薪水,  大于, 本部门
     select e.empno,e.ename,e.sal,e.deptno,t.avgsal,t.deptno
     from emp e,(select avg(sal) avgsal,deptno from emp group by deptno) t
     where e.sal > t.avgsal and e.deptno = t.deptno
    e. 小结
        返回一行一列:= < > <= >= != <>
        返回一列多行:in not in  =any =some  >any
        返回多行多列:把查询到结果集作为表使用
     
    分页查询:
    1. 伪列
        rownum  行号,从1开始,步长为1,没有上限, 加载数据时生成
    2. 显示行号
        select e.*,rownum from emp e;
    3. 查询前三条数据
        select e.*,rownum from emp e where rownum <= 3;
    4. 查询4-6条
        select e.*,rownum from emp e where rownum between 4 and 6; -- 错误的
        select t.* from (select e.*,rownum rn from emp e) t
        where t.rn between 4 and 6;     --正确的
    5. 查询工资最高的前三名
     -- 思路:先工资降序排序,生成行号,取前三人
     select t.*,rownum from (select * from emp  order by sal desc) t
    where rownum <= 3
    6. 查询工资较高的4-6名
        select m.*
    from (select t.*,rownum rn from (select * from emp  order by sal desc) t) m
    where m.rn between 4 and 6;
     
  • 相关阅读:
    C# TryParse
    C#委托的学习笔记
    C#基础学习C# 8.0 In a Nut Shell
    Everything学习之三
    Everything学习笔记二
    搜索软件everything帮助文档全文翻译
    Git笔记之基础命令
    Git学习笔记
    附加属性
    日期函数
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/10579951.html
Copyright © 2011-2022 走看看