Oracle数据库-01 入门

一、安装并配置Oracle数据库服务器

1、初始Oracle

  • 简介
    Oracle是一个数据库管理系统,是Oracle公司的核心产品。Oracle在信息管理系统、企业数据处理、Internet及电子商务等领域的应用非常广泛,其在数据安全性与完整性控制方面的优越性能,以及跨操作系统、跨硬件平台的数据互操作能力,使得越来越多的用户将Oracle作为其应用数据的处理系统。

  • 特点
    (1)支持多用户、大事务量的事务处理。
    (2)在保证数据安全性和完整性方面性能优越。
    (3)支持分布式数据处理:将分布在不同物理位置的数据库用通信网络连接起 来,在分布式数据库管理系统的控制下,组成一个逻辑上统一的数据库,共同完成数据处理任务。
    (4)具有可移植性:Oracle可以在Windows、Linux等多个操作系统平台上使用。

2、Oracle体系结构

(1)数据库
这里的数据库指的是磁盘上存储的数据的集合,在物理上表现为数据文件、 日志文件和控制文件等;在逻辑上则以表空间形式存在。

注: 对于Oracle来说,数据库、表空间都属于逻辑概念,用以描述数据的组织方式;数据文件、日志文件等为物理概念,是操作系统中物理存在的实体。

(2)全局数据库名
全局数据库名是用于区分一个数据库的标识,在安装数据库、创建新数据库、
创建控制文件、修改数据库结构、利用RMAN备份时都需要使用。它由数据库名称和域名构成,类似网络中的域名,使数据库的命名在整个网络环境中是唯一的。
例如在同一网络环境中有两个数据库,数据库名都是orcl,若要在这两个数据库之间建立连接,则必须使用不同的域名加以区分,例orcl.prd.comprd.com即为域名。

(3)数据库实例
每个启动的数据库都对应一个数据库实例,由这个实例来访问数据库中的数据。
如果把数据库简单的理解为硬盘上的文件,具有永久性,则数据库实例就是通过内存共享运行状态的一组服务器后台进程。

(4)表空间
每个Oracle数据库都是由若干个表空间构成的,用户在数据库中建立的所有内
容都被存储到表空间中。一个表空间可以由多个数据文件组成,但一个数据文件只能属于一个表空间。与数据文件这种物理结构相比,表空间属于数据库的逻辑结构。

(5)数据文件
通常数据文件的扩展名是.dbf,是用于存储数据库数据的文件,如存储数据库
表中的记录、索引、存储过程、视图、数据字典定义等。对于数据库操作中产生的一些临时数据,以保证事务重做所必须的数据,也有专门的数据文件负责存储。
一个数据文件中可能存储很多个表的数据,而一个表的数据也可能存放在多个
数据文件中,即数据库表和数据文件不存在一一对应的关系。

(6)控制文件
通常控制文件的扩展名是.ctl,是一个二进制文件。控制文件中存储的信息很多,包括数据文件和日志文件的名称和位置。控制文件是数据库启动及运行所必须的文件。当Oracle读写数据时,要根据控制文件中的信息查找数据文件。由于控制文件的重要性,一个数据库至少要有一个以上的控制文件,Oracle 11g 默认包含3个控制文件。各个控制文件内容相同,以避免因为一个控制文件的损坏而无法启动数据库。

(7)日志文件
通常日志文件的扩展名是.log,它记录了数据的所有更改信息,并提供了一种数据恢复机制,确保在系统崩溃或其他意外出现后能重新恢复数据库。在Oracle数据库中,日志文件是成组使用的,每个日志文件组可以有一个或多个日志文件。在工作过程中,多个日志文件组之间循环使用,当一个日志文件组写满后,会转向下一个日志文件组。

(8)模式和模式对象
模式: 是数据库对象(如表、索引等,也称模式对象)的集合。
Oracle会为每一个数据库用户创建一个模式,此模式为当前用户所拥有,和用户具有相同的名称。

(9)数据字典
数据库是数据的集合,数据库负责维护和管理用户的数据,那么用户的这些
数据是如何存储的,存储这些用户数据的路径在哪里?这些信息虽然不属于用户的数据,却是数据库维护和管理用户数据的核心,这些信息就是使用数据库的数据字典来维护的。
数据库的数据字典汇集了数据库运行需要的所有基础信息。
简而言之,数据字典就是Oracle存放有关数据库信息的地方,其用途就是描述
数据,如表的创建者信息,创建时间、所属表空间信息及用户访问权限信息等。

Oracle的数据字典主要分为以下两种:

  • 静态数据字典:主要是指在用户访问数据字典时不会发生改变的信息。

    dba_***:包含了数据库拥有的所有对象信息(注:当前用户必须具有管理员权限)
    all_***:包含了当前用户可以访问的全部对象信息
    (注:当前用户只需具有访问对象的权限)
    user_***:包含了当前用户拥有的对象信息(即所有在该用户模式下的对象)

  • 动态数据字典:
    v$为前缀,用来记录与数据库活动相关的动态性能统计信息。
    v$sqlarea:记录sql区的sql基本信息
    v$session:记录当前会话信息
    v$database:记录数据库的基本信息
    v$instance:记录实例的基本信息

3、安装Oracle

这里使用的版本是Oracle 11g,安装要求如图:

Oracle 11g服务器详细安装步骤

4、Windows环境下启动Oracle数据库

Windows操作系统下Oracle服务的启动与关闭时以后台服务的方式来管理的。通过后台服务管理界面,可以进行Oracle实例的启动与关闭、Oracle监听的启动与关闭及其他服务(如OracleDBCosole等)的启动与关闭。

Oracle常用的3个服务:

  • (1)OracleServiceSID服务是Oracle数据库服务。
    此服务是对应名为SID(系统标识符)的数据库实例创建的,其中SID是在安装Oracle 11g时数据的数据库名称,该服务默认自启动,可自动启动数据库。如果此服务未启动,则数据库客户端应用程序,如SQL PLUS连接数据库服务器时就会出现错误,因此该服务必须启动。

  • (2)OracleOraDb11g_home1TNSListener服务是监听器服务。此服务是Oracle服务器端的监听程序。客户端要远程连接数据库服务器,必须先连接驻留在数据库服务器上的监听进程。监听器接收从客户端发出的请求,然后将请求传递给数据库服务。一旦建立了连接,客户端与数据库服务就能直接通信。监听器监听并接收来自客户端应用程序的连接请求,该服务只有在数据库进行远程访问的时候才需要。

  • (3)OracleDBConsoleSID服务是数据库控制台服务,EMC(企业管理控制台)的服务程序(SID随安装的数据库而不同)是采用浏览器方式打开的,用户使用Oracle企业管理器的程序。

分别使用场合:

  • (1)如果数据库安装在本地,并且使用自带的SQL Plus进行访问,只需要启动OracleServiceSID服务即可,并且使用SQL Plus连接时不能使用“@”。这种连接被视为本地连接,Oracle中存在一个默认的数据库服务名,本地连接时会自动连接该默认的数据库服务。

  • (2)如果使用PL/SQL Developer 等第三方工具来访问数据库,那么不管数据库是否安装在本地,都必须启动OracleOraDb11g_home1TNSListener服务,因为Oracle会将第三方工具的访问形式视为远程连接。

  • (3)如果进入基于Web形式的企业管理(EM)控制平台,则必须启动OracleDBConsoleSID服务。

5、修改Oracle数据库的配置文件

在Oracle产品安装完成后,客户端为了与数据库服务器连接进行数据访问,必须
进行网络连接配置,包括服务器端配置和客户端配置。Oracle为服务器端和客户端配置提供了Net Manager工具。当一个数据库用户连接到一台数据库服务器时,就成为该数据库的一个客户端。客户端和服务器可以在同一台机器上,也可以通过网络 连接不同操作系统、不同硬件平台前的机器。

配置步骤如下:

  • (1)在Oracle服务器端配置监听器(Listener)。监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求。既然是基于服务器端的服务,那么它只存在于数据库服务器端,监听器的设置也只在数据库服务器端完成。

  • (2)客户端需要配置一个本地网络服务名(TNSNAME)。Oracle常用的客户端配置就是采用本地网络服务名,另外还有Oracle名称服务器(Oracle Names Server)等。

  • (3)Oracle客户端与服务器端的连接是通过客户端发出连接请求,由服务器端监听器对客户端的连接请求进行合法检查,如果连接请求有效,则进行连接;否则拒绝该连接。

注: 服务器端和客户端的配置,可以打开对应的配置文件查看两者的关系。配置信息已记录在LISTENER.ora和TNSNAMES.ora两个配置文件中。

6、使用Client 工具连接数据库

  • 第一种方式:SQL Plus工具
    启动工具进入Dos命令界面
    输入用户名密码:System/123456@orclDB
    测试是否连接成功:SQL>select ename from Scott.emp;
    注:
    (01)System为数据库已有的用户名
    (02)123456为此用户对应的密码,安装Oracle软件时密码统一orcl
    (03)@只是一个统一的符号,用于分隔用户名、密码和后面的网络服务名
    (若本地连接则不需要写@与后面的网络服务名【即本地网络服务名】)

  • 第二种方式:PL/SQL Developer工具
    登录
    sql窗口
    执行

二、了解Oracle数据类型及使用伪列实现分页查询

1、常用数据类型

(1)字符类型

  • char 需要使用固定长度的字符串时,未指明大小,默认占用1字节
  • varchar2 支持可变长度的字符串(必须制定大小),相对char类型更为节省空间。
  • nchar 国家字符集,使用方式与char相同;相比char区别在于,nchar用来存储Unicode字符集类型,即双字节字符数据。
  • nvarchar 用于存储需要国际化的可变长度字符串

(2)数值类型

  • NUMBER:可以存储正数、负数、零、定点数和精度为38位的浮点数
    格式:NUMBER(p,s)
    用法如下:
	column_name NUMBER{p=38,s=0}
	column_name NUMBER(p){定点数}
	column_name NUMBER(p,s){浮点数}

其中,p为精度,表示数字有效位数,取值为1–38。有效位数是从数字左侧第一个不为0的数算起的总位数,小数点和负号不计入有效位数;s为范围,表示小数点右边数字的位数,取值为-84~+127;

规则:首先精确到小数点右边s位,并四舍五入。如果精确后的值的有效位数不大于p,则正确;否则报错。

(3)日期时间类型

  • DATE数据类型:用于存储表中的日期和时间数据。
    Oracle数据库使用自己的格式存储日期,为7字节固定长度,每个字节分别存储世纪、年、月、日、小时、分和秒。
    SYSDATE函数:返回当前的日期和时间

  • TIMESTAMP数据类型
    TIMESTAMP类型用于存储日期的年月日以及时间的小时、分和秒,
    其中秒值要精确到小数点后6位。该数据类型同时包含时区信息。
    SYSTIMESTAMP函数:返回当前日期、时间和时区

注:日期格式显示问题
解决方案1:更新会话(只对当前窗口有效)
ALTER session SET nls_date_format=‘YYYY-MM-DD HH24:MI:SS’;

解决方案2:配置用户环境变量
变量名:nls_date_format
变量值:YYYY-MM-DD HH24:MI:SS

(4)LOB类型

LOB又称为“大对象”数据类型。该数据类型可以存储多达4GB的非结构化信息,
如声音剪辑和视频剪辑等。LOB允许对数据进行高效、随机、分段的访问。LOB可以是外部的,也可以是内部的,这取决于它相对于数据库的位置。一个表中可以有多个列被定义为LOB数据类型。

  • CLOB 【Character LOB, 字符LOB】
    能够存储大量字符数据,该数据类型可以存储单字节字符数据和多字节字符数据,主要用于存储费非结构化的xml文档,如新闻、内容介绍等大量文字内容的文档。

  • BLOB【Binary LOB , 二进制LOB】
    可以存储较大的二进制对,如图形、视频剪辑和声音剪辑等。

  • BFILE【Binary File, 二进制文件】
    能够将二进制文件存储在数据库外部的操作系统文件中。
    BFile列存储一个BFILE定位器,指向位于服务器文件系统上的二进制文件。
    支持文件最大4G。

  • NCLOB
    用于存储大的NCAHR字符数据,同时支持固定宽度字符和可变宽度字符(Unicode)。字符对象的大小不大于4GB,使用方法与CLOB类似。

  • 注:Oracle中的表可以有多个LOB列,每个LOB列可以是不同的LOB类型。

2、使用伪列实现分页查询

伪列: 指的是在物理上这个列并不存在,只有在查询时才构造出来。伪列通常是自由分配的,用户无法执行修改等操作。

(1)ROWID
数据库中的每一行都有一个行地址,ROWID伪列用于返回该行地址,可以
使用ROWID值来定位表中的一行。通常情况下,ROWID值可以唯一的标识数据库中的一行。

用途:

  • 能以最快的方式访问表中的一行
  • 能显示表的行是如何存储的
  • 可以作为表中行的唯一标识

(2)ROWRUN
对于一个查询返回的每一行,ROWNUM伪列返回一个数值代表该行的次序。
返回的第一行的ROWNUM值为1,返回的第二行的ROWNUM值为2,以此类推。

例如:

	select emp.*,ROWNUM from SCOTT.emp where ROWNUM<11

结果返回前10条数据
注: 若需要查询第一条数据则条件为 ROWNUM=1
若查询1条以上的数据(例如5条)则条件为 ROWNUM<6
此时不能用>符号,原因是ROWNUM是一个从1开始的伪列,条件不成立

3、分页查询
从emp表中查询出薪水从高到低排序的第5~9条记录

	select * from (select e.*,rownum rn from
           (select * from SCOTT.emp order by sal desc)e)
    where rn>=5 and rn<=9	

三、使用SQL语句操作数据表

1、sql类别命令

  • 数据定义语言(DDL):create创建、alter更改、truncate截断、drop删除
  • 数据操纵语言(DML):insert插入 、select选择、delete删除、update更新
  • 事务控制语言(TCL):commit提交、savepoint保存点、rollback回滚
  • 数据控制语句(DCL):grant授予、revoke回收

2、使用DDL操作数据表
命令:

  • create table 创建表
  • alter table 修改表结构
  • truncate table 删除表中所有记录
  • drop table 删除表

(1)create table 命令

语法:

	create table[schema.]table
	(column datatype [,column datatype[,...]]);

注:

  • schema:表示对象的所有者,即模式的名称,如果用户在自己的模式中创建表,可不指定。
  • table:表示表的名称
  • column:表示列的名称
  • datatype:表示该列的数据类型及其宽度

创建表,表命名规则:

  • 首字符应该为字母
  • 不能使用Oracle保留字来为表命名
  • 表名的最大长度为30个字符
  • 统一用户模式下的不同表不能具有相同名称
  • 可以使用下划线、数字和字母,但不能使用空格和单引号

(2)truncate table命令
若存储在表中的数据不再使用,可以只删除表中的记录而不删除表结构。
truncate table命令将删除表中的所有行且不记录日志,因此与delete命令
删除表中全部记录相比,既节省资源,执行速度也较快

语法:

truncate table 

3、使用DML操作数据表
创建数据表进行测试:
Oracle数据库-01 入门_第1张图片

(1)查询无重复的行

	select distinct stuName,stuAge from stuInfo

注:使用distinct子句后,对筛选结果集中内容全部相同的行仅保留一行

(2)带条件和排序的select命令

	select stuNo,stuName,stuAge from stuInfo
	where stuAge>17 
	order by stuName asc,stuAge desc;

(3)使用as操作符起别名

select stuName as "姓名",stuAge as "年龄",stuId as "身份证号" from stuInfo

(04)利用现有的表创建新表

语法:

	create table 
		as
	select {*|column (s)}
	from  [where ];

此命令可以把现有表中的所有记录复制到新表中,也可以仅复制选定的列或只复制结构不复制记录。

例:复制现有表结构及所有记录

	create table newStuInfo1
       		as 
	select * from stuInfo;

例:复制指定列

	create table newStuInfo2
       		as 
	select stuName,StuNo,stuAge from stuInfo;
	

例:复制表结构,而不复制记录

	create table newStuInfo3
       		as 
	select * from stuInfo where 1=2;

(5)查看表中的行数

	select count(1) from stuInfo

注:此处避免用*,会降低效率

(6)取出stuName、stuAge列不存在重复数据的记录

	select stuName,stuAge
	from stuInfo
	group by stuName,stuAge
	having(count(stuName||stuAge)<2)

(7)删除stuName、stuAge列重复的行(保留一行)

	delete from stuInfo
	where rowid not in
	(select max(rowid) from stuInfo group by stuName,stuAge)

(8)查看当前所有数据量>100万的用户表的信息

	select table_name
	from user_all_tables a
	where a.num_rows>1000000;

4、使用TCL管理事务

(1)commit:提交事务,即永久保存事务中对数据库的修改
(2)rollback:回滚事务,即取消对数据库所做的任何修改
(3)savepoint:在事务中创建存储点
(4)rollback to :将事务回滚到存储点

例:
Oracle数据库-01 入门_第2张图片
说明:
(1)回滚到保存点 “a”,表示保存点以后的所有数据操作取消,故只插入了两个部门。
(2)事务没有结束,必须再执行commit或rollback命令来结束事务。

注意:
(1)执行了3个INSERT语句,如果要提交,则只能提交所有的sql语句,不能部分提交。
(2)如果要回滚,则可以利用 “事务保存点” 来做局部回滚,此时事务并没有结束。

5、使用DCL控制权限

数据控制语言为用户提供权限控制命令。数据库对象(如表)的所有者对这些
对象拥有控制权限。所有者可以根据自己的意愿决定其他用户如何访问对象,授予其他用户权限(insert、select、update),使得他们可以在其权限范围内执行操作。授予的权限还可以由所有者随时撤销。(此处先做了解,Oracle-02进行讲解)

四、使用SQL操作符操作数据表

1、使用算术操作符编写sql语句

查询语句中要执行基于数值的计算,可以在sql命令中使用算术表达式。
算术表单式由number数据类型的列名、数值常量和连接他们的算术操作符组成。
算术操作符包括+加、-减、*乘、/除

2、使用比较操作符编写sql语句

比较操作符用于比较两个表达式的值。
包括=、!=、<、>、<=、>=、between…and、in、like、is null

3、使用逻辑操作符编写sql语句

逻辑操作符用于组合多个比较运算的结果以生成一个真或假的结果。
逻辑操作符包括and、or、not

4、使用集合操作符编写sql语句
集合操作符用于将两个查询的结果组合成一个结果集。
用集合操作符连接起来的select 语句中的列需遵循以下规则:

通过集合操作符连接的各个查询具有相同的列数,并且对应列的类型必须兼容。
不应含有long类型的列。列标题来自第一个select语句

(1)UNION 联合: union操作符返回两个查询选定的所有不重复的行。

例: 使用UNION操作符获得所有在公司工作过的员工编号

	select empno from employee
	union
	select rempno from retireEmp

对联合查询的结果进行排序,当使用order by子句时,必须将它放在最后一个select语句之后

	select empno from employee
	union
	select rempno from retireEmp
	order by empno desc;

注:UNION操作符返回employee和retireEmp表中所有不重复的列值。

(2)UNION ALL 联合所有
UNION ALL:合并两个查询选定的所有行,包括重复的行。

(3)INTERSECT 交集
INTERSECT :只返回两个查询都有的行,包括重复的行。

	select empno from employee
		INTERSECT 
	select rempno from retireEmp

注:重复记录只展示一行结果。

(4)MINUS 减集

MINUS操作符只返回由第一个查询选定而未被第二个查询选定的行,
即在第一个查询结果中排除在第二个查询结果中出现的行。

例:

	/* 查找没有退休的员工编号*/
	select empno from employee
	MINUS
	select rempno from retireEmp

查询结果: 从第一个select语句选定的所有行中减去第二个select语句所选定的公共行的内容。

5、使用连接操作符编写sql语句

连接操作符 " || “用于将两个或多个字符串合并成一个字符串,
或者将一个字符串与一个数值合并在一起。
例:输出岗位和员工姓名组合在一起的信息,格式为"job_ename”

select job||'_'||ename from emp

查询结果:
Oracle数据库-01 入门_第3张图片

五、使用SQL函数操作数据表

  • Oracle提供了用于执行特定操作的专用函数。
  • Oracle将函数大致划分为单行函数、聚合函数、分析函数
  • 单行函数划分为:
    字符函数、日期函数、数字函数、转换函数 等
  • 聚合函数:也称为分组函数,是基于数据库表的多行进行运算,返回一个结果,如对多行记录的某个字段进行求和、求最大值运算。
  • 分析函数:是对一个查询结果中的每个分组进行运算,但每个分组对应的结果可以有多个。

1、数据类型转换
(1)TO_CHAR() 转换成字符串类型
例:TO_CHAR(1234.5,'$9999.9') 结果:$1234.5

语法: TO_CHAR(d |n [ , fmt])
其中d是日期,n是数字,fmt是指定日期或数字的格式。
如果省略了fmt,那么日期将以默认的日期格式转换为VARHCAR2数据类型

例:根据格式模型的指定的格式来显示日期

select TO_CHAR(SYSDATE,'YYYY "年"fmMM"月 "fmDD" 日"HH24:MI:SS')
from dual;

输出结果:

2019年3月14日 19:20:55

注:在以上语句中,使用了填充模式“fm”格式掩码来避免空格填充和数字零,若不使用,则会自动补零:2019年03月14日 19:20:55

TO_CHAR()也可以用于格式化数值,如
select TO_CHAR(1210.7,'$9999.00')from dual;结果输出$1210.7

(2)TO_DATE() 转换成日期类型
例:TO_DATE('1998-01-01','yyyy-mm-dd') --结果:01-1月-80

语法: TO_DATE(CHAR[,fmt])

例:

select TO_DATE('2013-07-13','yyyy-mm-dd') from dual;

(3)TO_NUMBER() :转换为数值类型

将包含数字的字符串转换为NUMBER数据类型,从而可以对该数据类型执行算术运算。
例: TO_NUMBER('1234.5') 结果:1234.5

Oracle可以对数字字符串进行隐式转换

	select SQRT(TO_NUMBER('100'))from dual;  --转换结果:10

2、滤空函数

  • NVL(exp1,exp2)
    如果exp1的值为NULL,则返回exp2的值;否则返回exp1的值。

  • NVL(exp1,exp2,exp3)
    如果exp1的值为NULL,则返回exp3的值;否则返回exp2的值

  • DECODE(value,if1,then1,if2,then2,…else)

    如果value的值为if1,则返回then1的值;
    如果value的值为if2,则返回then2的值;
    否则返回else的值

例: 查询员工的所有收入和入职月份

select ename,sal+NVL(comm,0)sal1,	--若福利为null,则收入=薪资+0
NVL2(comm,sal+Comm,sal)sal2,	--若福利为null,则返回薪资,否则薪资+福利
DECODE(TO_CHAR(hiredate,'MM'),'01','一月','02','二月',
                                  '03','三月','04','四月',
                                  '05','五月','06','六月','下半年')mon
 from Scott.emp

查询结果:
Oracle数据库-01 入门_第4张图片
3、分析函数
分析函数是对一组查询结果进行运算,然后获得结果的函数。分析函数很类似于聚合函数,区别在于分析函数对每个组返回多行,聚合函数对每个组只返回一行。

分析函数语法: 函数名([参数]) OVER ([分区子句] [排序子句])
说明:

  • 函数名:表示分析函数的名称
  • 参数:表示函数需要传入的参数
  • 分区子句(PARTITION BY):表示将查询结果分为不同的组,功能类似于group by子句,是分析函数工作的基础。默认将所有结果作为一个分组。
  • 排序子句(order by):表示对每个分区进行排序

(1)ROW_NUMBER
ROW_NUMBER函数返回一个唯一的值,当遇到相同数据时,排名按照记录集中记录的顺序依次递增。

(2)DENSE_RANK
DENSE_RANK函数返回一个唯一的值,当遇到相同数据时,所有相同数据的排名都是一样的,不空出排名

(3)RANK
RANK函数返回一个唯一的值,当遇到相同数据时,所有相同数据的排名都是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。

你可能感兴趣的:(Oracle,Oracle)