1、初始Oracle
简介
Oracle是一个数据库管理系统,是Oracle公司的核心产品。Oracle在信息管理系统、企业数据处理、Internet及电子商务等领域的应用非常广泛,其在数据安全性与完整性控制方面的优越性能,以及跨操作系统、跨硬件平台的数据互操作能力,使得越来越多的用户将Oracle作为其应用数据的处理系统。
特点
(1)支持多用户、大事务量的事务处理。
(2)在保证数据安全性和完整性方面性能优越。
(3)支持分布式数据处理:将分布在不同物理位置的数据库用通信网络连接起 来,在分布式数据库管理系统的控制下,组成一个逻辑上统一的数据库,共同完成数据处理任务。
(4)具有可移植性:Oracle可以在Windows、Linux等多个操作系统平台上使用。
2、Oracle体系结构
(1)数据库
这里的数据库指的是磁盘上存储的数据的集合,在物理上表现为数据文件、 日志文件和控制文件等;在逻辑上则以表空间形式存在。
注: 对于Oracle来说,数据库、表空间都属于逻辑概念,用以描述数据的组织方式;数据文件、日志文件等为物理概念,是操作系统中物理存在的实体。
(2)全局数据库名
全局数据库名是用于区分一个数据库的标识,在安装数据库、创建新数据库、
创建控制文件、修改数据库结构、利用RMAN备份时都需要使用。它由数据库名称和域名构成,类似网络中的域名,使数据库的命名在整个网络环境中是唯一的。
例如在同一网络环境中有两个数据库,数据库名都是orcl,若要在这两个数据库之间建立连接,则必须使用不同的域名加以区分,例orcl.prd.com
,prd.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窗口
执行
1、常用数据类型
(1)字符类型
(2)数值类型
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
1、sql类别命令
2、使用DDL操作数据表
命令:
(1)create table 命令
语法:
create table[schema.]table
(column datatype [,column datatype[,...]]);
注:
创建表,表命名规则:
(2)truncate table命令
若存储在表中的数据不再使用,可以只删除表中的记录而不删除表结构。
truncate table命令将删除表中的所有行且不记录日志,因此与delete命令
删除表中全部记录相比,既节省资源,执行速度也较快
语法:
truncate table
(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
:将事务回滚到存储点
例:
说明:
(1)回滚到保存点 “a”,表示保存点以后的所有数据操作取消,故只插入了两个部门。
(2)事务没有结束,必须再执行commit或rollback命令来结束事务。
注意:
(1)执行了3个INSERT语句,如果要提交,则只能提交所有的sql语句,不能部分提交。
(2)如果要回滚,则可以利用 “事务保存点” 来做局部回滚,此时事务并没有结束。
5、使用DCL控制权限
数据控制语言为用户提供权限控制命令。数据库对象(如表)的所有者对这些
对象拥有控制权限。所有者可以根据自己的意愿决定其他用户如何访问对象,授予其他用户权限(insert、select、update),使得他们可以在其权限范围内执行操作。授予的权限还可以由所有者随时撤销。(此处先做了解,Oracle-02进行讲解)
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
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
查询结果:
3、分析函数
分析函数是对一组查询结果进行运算,然后获得结果的函数。分析函数很类似于聚合函数,区别在于分析函数对每个组返回多行,聚合函数对每个组只返回一行。
分析函数语法: 函数名([参数]) OVER ([分区子句] [排序子句])
说明:
(1)ROW_NUMBER
ROW_NUMBER函数返回一个唯一的值,当遇到相同数据时,排名按照记录集中记录的顺序依次递增。
(2)DENSE_RANK
DENSE_RANK函数返回一个唯一的值,当遇到相同数据时,所有相同数据的排名都是一样的,不空出排名
(3)RANK
RANK函数返回一个唯一的值,当遇到相同数据时,所有相同数据的排名都是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。