初学Oracle

Oracle数据库

Oracle简介

  • Oracle(甲骨文)公司
    • 1977年,三人合伙创办( Software Development Laboratories ,SDL)
    • 1979年,更名为Relational Software Inc. ,RSI
    • 1983年,为了突出核心产品,RSI更名为Oracle
    • 2002年04月26日,启用“甲骨文”作为中文注册商标
  • Oracle数据库管理系统
    • Oracle公司的核心产品
    • 目前最流行的数据库
    • 主要版本Oracle8i/9i(internet)、Oracle10g/11g(grid)
    • 基于C/S系统结构

Oracle主要组件

在这里插入图片描述

Oracle基本概念

  • 表空间
    在这里插入图片描述

  • 全局数据库名

    • 用于区分一个数据库的内部标识
    • 全局数据库名=数据库名+域名
    • 使数据库的取名在整个网络环境在唯一
  • 模式和模式对象

    • 模式为模式对象的集合
    • 每一个用户对应一个模式
    • 模式对象是用户拥有的对象
    • 非模式对象与用户无关,如表空间

安装Oracle

安装注意事项

  1. 选择安装目录最好是非系统磁盘
  2. 安装时可以直接创建数据库,也可以选择不创建
  3. 服务器的主机名不能有特殊字符
  4. 如果在创建数据库阶段提示错误,继续安装

PS:输入的数据库口令最好记录在记事本中,以免使用时忘记

启动、配置和链接数据库

  • 启动数据库服务

    • 通过选择打开“服务”窗口,可以看到Oracle服务
      在这里插入图片描述
      • OracleService< SID> :数据库服务
      • OracleOraDb11g_home1TNSListener :数据库监听服务
      • OracleDBConsole< SID> :企业管理器服务
  • 配置客户端网络服务

    • 服务器端配置监听器

    • 客户端配置网络服务名在这里插入图片描述

    • 注意:

      • 在安装服务器软件时自动配置一个监听器
      • Oracle中的 Net Manager 工具和Net Configuration Assistant都能用来配置监听器和网络服务名(建议使用Net Manager工具)
  • 每个数据库都有SYS和SYSTEM两个默认用户,都具有创建用户权限(连接数据库)

    • SYS和SYSTEM用户、

      • SYS和SYSTEM用户都是Oracle的系统用户,都使用SYSTEM表空间,SYS拥有更大的权限

        SYS用户SYSTEM用户
        地位Oracle的一个超级用户Oracle默认的系统管理员,拥有DBA权限
        作用主要用来维护系统信息和管理实例通常用来管理Oracle数据库的用户、权限和存储等
        登录身份只能以SYSDBA或SYSOPER角色登录只能以Normal方式登录
    • 通过SQL*Plus方式连接

    • 通过PL/SQL Develop而方式连接

  • 使用SYSTEM用户登录ORCL数据库

数据类型

数据类型描述
字符数据类型CHAR存储固定长度的字符串
VARCHAR2存储可变长度的字符串
NCHAR和NVARCHAR2存储Unicode字符集类型
数值数据类型NUMBER存储整数和浮点数,格式为NUMBER(p,s)
日期时间数据类型DATE存储日期和时间数据
TIMESTAMP秒值精确到小数点后6位
LOB数据类型BLOB存储二进制对象
CLOB存储字符格式的大型对象
BFILE将二进制数据存储操作系统文件中

PS:不建议使用VARCHAR、INTEGER、FLOAT、DOUBLE等类型

  • Oracle中伪列就像一个表列,但是它并没有存储在表中

  • 伪列可以从表中查询,但不能插入、更新和删除它们的值

  • 常用的伪列有ROWID和ROWNUM

    • ROWID时表中行的存储地址,该地址可以唯一地标识数据库中一行,可以使用ROWID伪列快速地定位表中的一行

      • ROWID格式
        ​ AAAR3s(数据对象编号)   AAE(文件编号)   AAAACX(块编号)   AAA(行编号)
    • ROWNUM是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数

      /*使用ROWNUM从EMP表中提取10条记录并显示序号*/
      SELECT emp.*,rownum
      FROM Scott.emp
      WHERE ROWNUM < 11;

SQL简介

在这里插入图片描述

  • 数据定义语言

    /*创建stuInfo表*/
    CREATE TABLE stuInfo(
    	stuNo NUMBER(8),
        stuName VARCHAR2(100),
        stuAge NUMBER(4)
    )
    
    /*添加字段*/
    ALTER TABLE stuInfo ADD(stuSex bit);
    
    /*添加字段*/
    ALTER TABLE stuInfo DROP(stuSex bit);
    
    /*添加字段*/
    ALTER TABLE stuInfo MODIFY(stuName VARCHAR2(20));
    
    /*删除stuInfo表*/
    DROP TABLE stuInfo;
    
    /*删除stuInfo表,保留表结构*/
    TRUNCATE TABLE stuInfo;
  • 数据操纵语言

    /*不重复显示所有学员姓名和年龄*/
    SELECT IDSTINCT stuName,stuAge FROM stuInfo;
    
    /*按照姓名升序(ASC),如果姓名相同按照年龄降序(DESC)排序*/
    SELECT stuNo,stuName,stuAge
    FROM stuInfo
    WHERE stuAge > 17
    ORDER BY stuName ASC,stuAge DESC;
    
    /*使用别名显示姓 名、年 龄(含有特殊字符【如空格】加双引号)和身份证号列*/
    SELECT stuName as "姓 名",stuAge as "年 龄",stuID as 身份证号
    FROM StuInfo;
    
    /*利用现有表创建新表*/
    /*选择所有数据*/
    CREATE TABLE newStuInfo1
    AS
    SELECT * FROM stuInfo;
    /*选择指定的列所有数据*/
    CREATE TABLE newStuInfo2
    AS
    SELECT stuName,stuNo,stuAge FROM stuInfo;
    /*只留表结构,不留数据*/
    CREATE TABLE newStuInfo3
    AS
    SELECT stuName,stuNo,stuAge FROM stuInfo
    WHERE 1=2;
    
    /*查看表中行数*/
    SELECT COUNT(*) FROM stuInfo;/*执行效率低*/
    SELECT COUNT(1) FORM stuInfo;/*执行效率高*/
    
    /*取出stuName,stuAge列不存在重复数据的记录*/
    SELECT stuName,stuAge
    FROM stuInfo
    GROUP BY stuName,stuAge
    HAVING(COUNT(stuName||stuAge) < 2);
    
    /*删除stuName、stuAge列重复的行(保留一行)*/
    DELETE FROM stuInfo
    /*获取所有重复记录的ROWID*/
    WHERE ROWID NOT IN(
        /*查找重复的记录,只保留一条*/
    	SELECT MAX(ROWID)
        FROM stuInfo
        GROUP BY stuName,stuAge
        HAVING(COUNT(stuName||stuAge) > 1)
        /*合并结果集,货地所有符合条件且不重复的记录*/
        UNION
        /*查找不重复的记录*/
        SELECT MAX(ROWID)
        FROM stuInfo
        GROUP BY stuName,stuAge
        HAVING(COUNT(stuName||stuAge) = 1)
    );
  • 事务控制语言

    • 用于事务控制的语句

      • COMMIT

      • ROLLBACK

      • SAVEPOINT

      • ROLLBACK TO < SavePoint_Name>

        INSETR INTO dept VALUES(50,'a',null);
        INSETR INTO dept VALUES(60,'b',null);
        SAVEPOINT a;
        INSETR INTO dept VALUES(70,'c',null);
        ROLLBACK TO SAVEPOINT a;
        COMMIT;
        SELECT * FROM dept;
        /*结果为包含 50、60的记录*/
  • 数据控制语言

    /*直接给用户赋予权限*/
    GRENT create table,create session,create sequence,create view TO SCOTT;
    
    /*赋予全部的权限:dba它具有管理员全部权限*/
    GRENT dba to SCOTT;
    
    /*创建一个角色,然后为角色赋予权限*/
    CREATE ROLE user;
    GRENT create table,create session,create sequence,create view TO user;
    
    /*将角色赋予用户*/
    GRENT user to SCOTT;
    
    /*分配表的查询权限*/
    GRENT select ON stuInfo TO scott;
    /*如果想多加权限那么就用逗号,隔开,也可以分配所有的权限(所有All)*/
    GRENT select,insert ON stuInfo TO SCOTT;
    GRENT all ON stuInfo TO SCOTT;
    /*with grant option使用户同样具有分配权限的权利*/
    GRENT select,insert ON stuInfo TO SCOTT WITH GRENT OPTION;
    
    /*向数据库中所有用户分配权限*/
    GRENT select ON stuInfo TO public;
    
    /*使用revoke撤销对象权限,也会撤销使用with grant option分配的权限*/
    REVOKE select,insert ON stuInfo FROM SCOTT;

SQL操作符

  • Oracle支持的SQL操作符分类

在这里插入图片描述

  • 集合操作符

    • UNION(联合)
    • UNION ALL(联合所有)
    • INTERSECT(交集)
    • MINUS(减集)

SQL函数

在这里插入图片描述

  • 转换函数

    • 转换函数将值从一种数据类型转换为另一种数据类型

    • 常用的转换函数

      • TO_CHAR()

      • TO_DATE()

      • TO_NUMBER()

        SELECT TO_CHAR(sysdate,'YYYY"年"fmMM"月"fmDD"日" HH24:MI:SS')
        FROM dual;
        
        SELECT TO_CHAR(1210.7,'$9,999.00')
        FROM dual;
        
        SELECT TO_DATE('2005-12-16','yyyy-mm-dd')
        FROM dual;
        
        SELECT TO_NUMBER('100')
        FROM dual;
  • 其他函数

    • 转换空值函数

      • NVL

      • NVL2

      • DECODE

        SELECT ename,
        	sal+NVL(comm,0) sal1,
        	NVL2(comm,sal+comm,sal) sal2,
        	DECODE(to_char(hiredate,'MM'),
                  '01','一月','02','二月',
                  '03','三月','04','四月',
                  '05','五月','06','六月',
                  '下半年') mon
        FROM employee;
    • 分析函数

      • 分析函数根据一组行类计算聚合值

      • 分析函数为每组记录返回多个行

      • 以下三个分析函数用于计算一个行在一组有序行中的排位,序号从1开始

        • RANK:返回连续的排位,不论值是否相等
        • DENSE_RANK:具有相等值的行排位相同,序数随后跳跃
        • ROW_NUMBER:具有相等值的行排位相同,序号是连续的
      • 语法

        函数名([参数]) OVER([分区子句] [排序子句])

        • 函数名:分析函数名字
        • 参数:函数需要传入的参数
        • 分区子句(PARTITION BY):将查询结果分为不同的组,功能类似于GROUP BY语句
        • 排序子句(ORDER BY):将每个分区进行排序
        RANK() OVER (PARTITION BY deptno ORDER BY sal DESC)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值