Oracle 学习笔记(一)Oracle的基本介绍与语法
1.1 Oracle基础知识
1.1.1 介绍
Oracle数据库的主要特点:
支持多用户、大事务量的事务处理
在保持数据安全性和完整性方面性能优越
支持分布式数据处理
具有可移植性
1.1.2 Oracle基本概念
系统全局区
程序缓冲区
数据库读写进程
日志读写进程
表空间->段->数据块(大到小)
1.数据库
它是磁盘上存储数据的集合,在物理上表现为数据文件、日志文件和控制文件等,在逻辑上以表空间形式存在。
2.全局数据库名
全局数据库名是用于区分一个数据库的标识,在安装数据库、创建新数据库、创建控制文件、修改数据库结构、利用RMAN备份时都需要使用。它由数据库名称和域名构成,类似网络中的域名,使数据库的命名在整个网络环境中唯一。
3.数据库实例
每个启动的数据库都对应一个数据库实例,由于这个实例来访问数据库中的数据。如果把数据库简单的理解为硬盘上的文件,具有永久性,则数据库实例就是通过内存共享运行状态的一组服务器后台进程。
4.表空间
每个Oracle数据库都是由若干个表空间构成的,用户在数据库中建立的所有内容都被存储到表空间中。一个表空间可以由多个数据文件组成,但一个数据文件只能属于一个表空间。与数据库文件这种物理结构相比,表空间是属于数据库的逻辑结构
5.数据文件
通常数据文件的扩展名是.dbf,是用于存储数据库数据的文件,如存储数据库表中的记录、索引、存储过程、视图、数据字典定义等。
6.控制文件
通常控制文件的扩展名是.ctl,是一个二进制文件。其中包含数据文件和日志文件的名称和位置。Oracle 11g默认包含三个控制文件。每个控制文件内容相同。
7.日志文件
通常日志文件的扩展名是.log,它记录了数据的所有更改信息,并提供了一种数据恢复机制,确保在系统崩溃或其他意外出现后重新恢复数据库。
在Oracle数据库中,日志文件是成组使用的,每个日志文件组可以有一个或多个日志文件。在工作过程中,多个日志文件组之间循环使用,当一个日志文件组写满后,会转向下一个日志文件组。
8.模式和模式对象
模式是数据库对象(如表、索引等,也称模式对象)的集合。Oracle会为每一个数据库用户创建一个模式,此模式为当前用户所拥有,和用户具有相同的名称。
1.1.4 Oracle数据库服务
OracleServiceSID服务是Oracle数据库服务。此服务是对应名为SID(系统标识符)的数据库实例创建的,SID是在安装Oracle11g时输入的数据库名称。
OracleOraDb11g_home1TNSListener服务是监听服务。连接远程服务器时要开启监听服务。
OracleDBConsoleSID服务是数据库控制台服务,EMC(企业管理控制台)的服务程序
1.1.6连接数据库
·1.SQL*Plus工具
- 找到sqlPlus
- 直接在dos中输入sqlplus
- 一次输入账号、密码或者直接在提示输入用户名时输入username/pwd
2.PL/SQL Developer工具
使用:
(1) 用户名:输入用户名
(2) 口令:密码
(3) 数据库:输入已经配置好的网络服务名,如orclDB
(4) 连接为:输入Normal。Normal为普通用户;sysOper为数据库操作员,主要包括打开数据服务器,关闭数据服务器,备份数据库,恢复数据库等;sysDBA为数据库管理员,主要包括打开数据库服务器,关闭数据库服务器,备份数据库,恢复数据库,日志归档,管理功能,创建数据库等。
1.2 Oracle数据类型
1.字符数据类型
CHAR数据类型
当需要固定长度的字符串时,使用CHAR数据类型。这种数据类型的列长度可以是1~2000字节。如果在定义时未指明大小,则默认其占用1字节。
VARCHAR2数据类型
支持可变长度的字符串。该数据类型的大小为1~4000字节。在定义时应指定其大小。
NCHAR数据类型
国家字符集,使用方法和CHAR相同。区别在于NCHAR用来存储Unicode字符集类型,NCHAR每个字符占用两字节。
NVARCHAR2存储变长字符串
声明方法:VARCHAR(10 CHAR) --存储10个字符
2.数值数据类型
NUMBER数据类型可以存储正数、负数、零、定点数和精度为38位的浮点数。语法:
NUMBER(p,s)
其中,p为精度,表示数字的有效位数,在1~38之间。有效位数:从左边第一个不为0 的数算起,小数点和负号不计入有效位数。S为范围,表示小数点右边数字的位数,它在-84~+127之间。
规则:首先精确到小数点右边s位,并四舍五入。如果精确后值的有效位数<=p,则正确;否则报错。
3.日期时间数据类型
1.DATA数据类型
DATA数据类型用于存储表中的日期和时间数据。Oracle数据库使用自己的格式存储日期,使用7字节固定长度,每个字节分别存储世纪、年、月、日、小时、分和秒。日期时间数据类型的值为4712年1月1日到9999年12月31日。SYSDATE函数的功能是返回当前的日期和时间
2.TIMESTAMP数据类型
用于存储日期的年、月、日及时间的小时、分、秒。其中秒值精确到小数点后6位。SYSTIMESTAMP函数的功能是返回当前日期、时间和时区。
4. LOB数据类型
LOB又称为“大对象”数据类型。可以存储4GB的非结构化信息
- CLOB(Character LOB,字符串LOB)存储大量字符数据
- BLOB(Binary LOB,二进制LOB)可以存储较大的二进制对象,如图形、视频。
- BFILE(Binary File,二进制文件)能够将二进制文件存储在数据库外部的操作系统文件中。
- NCLOB存储大的NCHAR字符数据。NCLOB数据类型同时支持固定宽度字符和可变宽度字符(Unicode字符数据)
Oracle中的表可以有多个LOB列。
5. 伪列
伪列就像一个表列,但是它没有存储在表中
1.ROWID 数据库中的每一行都有一个行地址,ROWID伪列返回该行地址。
伪列的用途:
能以最快的方式访问表中的一行
能显示表的行是如何存储的
可以作为表中行的唯一标识
使用SELECT语句查看ROWID值:
SELECT ROWID,eName FROM SCOTT.emp where eName=’SMITH’
2.ROWNUM对于一个查询返回的每一行,ROWNUM伪列返回一个数值代表行的次序。返回的第一行的ROWNUM值为1,以此递增
SQL示例:
SELECT emp.*,ROWNUM FROM SCOTT.emp WHERE ROWNUM<11
注意:rownum条件查询时能查找>0 =1 <n的条件
1.3 SQL语言
Sql语言的分类:
数据定义语言(DDL):CREATE(创建)、ALTER(更改)、TRUNCATE(截断)和DROP(删除)
数据操纵语言(DML):INSTER(插入)、SELECT(选择)、DELETE(删除)和UPDATE(更新)
事务控制语言(TCL):COMMIT(提交)、SAVEPOINT(保存点)和ROLLBACK(回滚)
数据控制语言(DCL):GRANT(授予)和REVOKE(回收)
1.3.1
1.CREATE TABLE命令
语法:
CREATE TABLE [schema.]table
(column datatype[,column datatype[,……]]);
Schema表示对象的所有者,即模式的名称。
Table 表示表的名称
Column表示列的名称
Datatype表示该列的数据类型及其宽度
创建表时,需要指定唯一的表名称、表内唯一的列名称、列的数据类型及其宽度
示例:
CREATE TABLE stuInfo
(
stuNo CHAR(6) NOT NULL,
stuName VARCHAR2(20) NOT NULL,
stuAge NUMBER(3,0) NOT NULL
);
表名规范:
表名首字符应该为字母
不能使用Oracle保留字来为表命名
表名的最大长度为30个字符
同一用户模式下的不同表不能具有相同的名称
可以使用下划线、数字和字母,但不能使用空格和单引号
2.TRUNCATE TABLE 命令
语法:
TRUNCATE TABLE <tablename>;
1.3.2 数据操纵语言
1.选择无重复的行:
SELECT DISTINCT stuName,stuAge FROM stuInfo;
2.带条件和排序的SELECT
按照姓名升序,如果姓名相同,则按照年龄降序排序
SELECT stuNo,stuName,stuAge FROM stuInfo WHERE stuAge>17
ORDER BY stuName ASC,stuAge DESC;
3.使用列别名
SELECT stuName as “姓名”,stuAge as “年龄” from stuInfo;
别名有空格时要加双引号
4.利用现有的表创建新表
CREATE TABLE <newtable>
AS
SELECT {*|column(s)}
FROM <oldtable> [WHERE <condition>];
示例:
CREATE TABLE newsStuInfo1
AS
SELECT * FROM stuInfo;
仅仅复制表的结构,而不复制记录:
CREATE TABLE newStudentInfo3
AS
SELECT * FROM stuInfo WHERE 1=2;
5.查看表中行数
SELECT COUNT(*) FROM TABLE;--效率较低
SELECT COUNT(1) FROM TABLE;--效率较高
- 取出stuName,stuAge列不存在重复数据的记录
SELECT stuName,stuAge
FROM stuInfo
GROUP BY stuName,stuAge
HAVING(COUNT(stuName|| stuAge)<2);
- 删除stuName,stuAge列重复的行(保留一行)
DELETE FROM stuInfo
WHERE ROWID NOT IN(
SELECT MAX(ROWID) FROM stuInfo
GROUP BY stuName,stuAge
HAVING (COUNT(stuAge||stuAge)>1)
UNION
SELECT MAX(ROWID)
FROM stuInfo
GROUP BY stuName,stuAge
HAVING(COUNT(stuAge||stuAge)=1)
);
1.3.3 事务控制语言
在Oracle数据库中事务控制语句(TCL)主要由以下部分组成:
(1) COMMIT:提交事务,即把事务中对数据库的修改进行永久保存
(2) ROLLBACK:回滚事务,即取消对数据库所做的任何修改
(3) SAVEPOINT:在事务中创建存储点。
(4) ROLLBACK TO <SavePoint_Name>:将事务回滚到存储点
1.4.4 集合操作符
1.UNION操作符返回两个查询选定的所有不重复的行。
示例1:
SELECT empno FROM employee
UNION
SELECT rempno FROM retireEmp;
示例2:使用ORDER BY子句,必须将它放在最后一个SELECT之后
SELECT empno FROM employee
UNION
SELECT rempno FROM retireEmp;
ORDER BY empno;
2.UNION ALL 合并两个查询选定的所有行,包括重复的行
3.INTERSECT(交集)返回两个查询都有的行
示例:
SELECT empno FROM employee
INTERSECT
SELECT rempno FROM retireEmp;
4.MINUS(减集)只返回由第一个查询选定而未被第二个查询选定的行,即在第一个查询结果中排除第二个查询结果中的行
示例:
SELECT empno FROM employee
MINUS
SELECT rempno FROM retireEmp;
1.4.5 连接操作符
示例:输出岗位和员工姓名组合在一起的信息
SELECT job||’_’||ename FROM employee;
1.5.1 SQL函数
1.转换函数
函数 |
功能 |
实例 |
结果 |
TO_CHAR() |
转换成字符串类型 |
TO_CHAR(1234.5,’$9999.9’) |
$1234.5 |
TO_DATE() |
转换成日期类型 |
TO_DATE(‘1980-01-01’,’yyyy-mm-dd’) |
01-1月-80 |
TO_NUMBER |
转换成数值类型 |
TO_NUMBER(‘1234.5’) |
1234.5 |
其他函数:
NVL(exp1,exp2) 如果exp1的值为null,则返回exp2的值,否则返回exp1的值
NVL2(exp1,exp2,exp3)如果exp1的值为null,则返回exp2的值,否则返回exp3的值
DECODE(value,if1,then1,if2,then2,…,else) 如果value的值为if1,则返回then1,依次类推,否则返回else的值,像 if(){}else if(){}else{}
2.分析函数:分析函数是对一组查询结果进行计算,然后获得结果,与聚合函数的区别在于分析函数每个组返回多行,聚合函数每组返回一行
语法:
函数名([参数]) OVER ([分区子句][排序子句])
在语法中:
函数名表示分析函数的名称
参数表示函数需要传入的参数
分区子句(PARTITION BY)表示将查询结果分为不同的组,功能类似于GROUP BY语句,是分析函数工作的基础。默认将所有结果作为一个分组
排序子句(ORDER BY)表示将每个分区进行排序
1.ROW_NUMBER 函数返回一个唯一的值,当遇到相同数据时,排名按照记录集中记录的顺序依次递增
2.DENSE_RANK 函数返回一个唯一的值,当遇到相同数据时,所有相同数据的排名都是一样的
3.RANK 函数返回一个唯一的值,当遇到相同的数据时,所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。
这三个函数的唯一区别是每组数据遇到相同数据时的排名策略
select ename,sal,deptno,
rank() over(partition by deptno order by sal desc) "rank",
dense_rank() over(partition by deptno order by sal desc) "dense_rank",
row_number() over(partition by deptno order by sal desc) "row_number"
from emp
【来自 乐智的菜园子:www.cnblogs.com/AIThink 亲们,码字不容易,转载请注明出处。】