基础Oracle学习
第一章 走进Oracle
1. Oracle简介
Oracle数据库是Oracle公司的核心产品,Oracle数据库是一个适合于大中型企业的数据库管理系统。Oracle的主要涉及面非常广,产品是免费的,另一方面Oracle服务是收费的。
Oracle公司成立以来,从最初的数据库版本到Oracle7、Oracle8i、Oracle9i,Oracle10g到Oracle11g,虽然每个版本之间的操作都存在差别,但是Oracle对数据的操作基本上都遵循SQL标准。因此对Oracle开发来说版本之间的差别不大。
2. Oracle安装
Oracle 数据库产品是免费的,我们可以从 Oracle 的官方网站(http://www.oracle.com)下 载到程序安装包,Oracle 在 Windows 下的安装非常方便,安装开始后,一直点击安装程序 的“下一步”即可。
1.下载Oracle10g后,解压到一个文件夹下,单击“setup.exe”文件即可启动安装界面
Oracle主目录位置就是Oracle准备安装的位置,称为“Oracle_Home”,一般Oracle会根据当前计算机的硬盘大小给出一个合适的位置。Oracle安装是可以只安装Oracle软件,然后 单独创建数据库,也可以以在图中选中“创建启动数据库”复选框,在安装Oracle产品时,同时创建一个数据库。填写全局数据库名,以及管理员的密码。全局数据库名时数据库在服务器网路中的唯一标识。
2.点击“下一步”,就会出现如下图内容,开始对 Oracle 服务器进行环境检查,主要 查看服务器是否符合 Oracle 安装的条件,比如操作系统是否支持、系统内存是否符 合 Oracle 安装的最低要求等。
3.Oracle 检查通过后,单击“下一步”,就会列出所有安装 Oracle 过程中的默认选项。
4.单击“安装”按钮,进入安装界面,这一过程经历时间比较长,根据计算机的性能不同有很大差别。
5.完成后,进入了各种 Oracle 工具的安装阶段,包括网络配置向导,iSQL*plus 等(后面课程中讲解)。如下图所示:
6.接下来自动启动 DBCA(Database Configuration Assistant)进入创建默认数据库阶段。
数据库创建后有一系列为数据库提供服务的内存空间和后台进程,称为该数据库的实例。每一个数据库至少会有一个实例为其服务。实例中的内存结构称为系统全局区(SGA),系统会根据当前计算机系统的性能给SGA分配非常可观的内存空间。
Oracle 创建数据库不能像SQL Server那样一个简单的CREATE DATABASE命令就能完成,在创建数据库的过程中还需要配置各种参数。虽然会有DBCA工具向导,但是任然需要进行比较麻烦的配配置。
小提示:虽然一个Oracle 数据库服务器中可以安装多个数据库,但是一个数据库会占用非常大的内存空间,因此一般一个服务器只安装一个数据库。每一个数据库可以有很多的用户,不同的用户拥有不同的数据库对象,必须由对方用户授予一定的权限。不同的用户创建的表,只能被当前的用户访问。因此在Oracle 中的开发中,不同的应用程序只需要使用不同的用户访问即可。
7.数据库创建完成后,需要设置数据库的默认用户。Oracle 中为管理员预置了两个用户,分别为SYS和SYSTEM。同时Oracle 为程序测试提供了一个普通用户scott,口令管理中,可以对数据库用户设置密码,设置是否锁定。Oracle 客户端使用用户名和密码登录Oracle 系统后才能对数据库操作。
默认的用户中,SYS和SYSTEM用户是没有锁定的,安装完成后可以直接使用,SCOTT用户默认为锁定状态,因此不能直接使用,需要把SCOTT用户设定为非锁定状态才能正常使用。这一步完成后,Oracle系统安装成功。
3. Oracle客户端工具
1.SQL*Plus工具
该工具是Oracle 系统默认安装下,自带的一个客户端工具。在windows命令行中输入“sqlplusw”命令,就能够启动该工具了。
输入用户名和密码后,如果SQL*Plus与数据库服务器在同一台计算机上,并且当前服务器下只有一个数据库实例,那么“主机字符串”可以不用填写。
小提示:SQL*Plus工具虽然是Oracle 自带的工具,但是在现实的开发中,基于该环境对开发不方便,因此很少使用。
SQL*Plus连接成功后就如图所示:
2.SQL*Plus命令行工具
该命令行工具,提供了与数据库交互的能力和维护数据库的能力,包括了Oracle自带的SQL*Plus工具的全部功能,在Oracle管理中经常使用。在命令行中输入:“sql/nolog”即可启动该工具。
输入“sqlplus/nolog”命令后,只是启动了一个客户端进程,并没有与服务器连接,连接到oracle的服务器命令是:
conn用户名/密码 as 连接身份@服务器连接字符串。
说明:
1.连接身份:不傲视该用户连接后拥有的权限
>sysdba:数据库管理员,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、回话 限制、管理功能、创建数据库。sys用户必须用sysdba身份才能登陆,system用户可以用普通身份登陆。
>sysoper:数据库操作员,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制。
>normal:普通用户,权限只有查询某些数据表的数据。默认的身份是normal用户。
2.客户端工具可以根据“服务器连接字符串”对服务器进行连接,有了连接字符串后客户端就可以像操作本机一样操作远程数据库,因此“服务器连接字符串”的配置也叫本地网络服务配置,如果SQL*Plus工具启动在服务器上,并且服务器上只有一个数据库实例的情况下,连接字符串可以省略,在连接字符串中包含连接服务器的协议,服务器的地址,服务器的端口等设置,Oracle服务名等,该配置文件在Oracle安装目录下的:network/ADMIN/tnsnames.ora。该文件是一个文本文件,用记事本打开后如下所示:
3.配置本地网络服务名
本地网络服务名,即客户端与服务器的连接字符串,本地网络服务名是客户端的配置, Oracle 客户端安装后,可以使用客户端自带的网络配置向导(Net Configuration Assistant)进 行配置:
1.启动 Net Configuration Assistant。选择“本地 Net 服务名配置”选项。如下图所示:
2.选择“下一步”,本步骤可以对本地网络服务名进行添加,删除,测试是否正常连 接等操作,选择“添加”选项。
3. 点击“下一步”,填写服务名,为数据库取的 全局数据库名。
4.点击“下一步”,选择服务需要的协议,默认是 TCP 协议。推荐使用默认的 TCP 协 议。
5.点击“下一步”,输入主机名,主机名可以是计算机名称,也可以是一个 IP 地址, 主机如果是本机,可以使用本机计算机名称、“localhost”、“127.0.0.1”、或者本机 的 IP 地址。
6.单击“下一步”,选择“是,进行测试”选项。进入下图界面。
在测试时,默认采用的用户名和密码是 system/manager 进行测试,如果用户 system 的 密码不是“manager”,有可能测试通不过,更改登录后,输入正确的用户名和密码后再进 行测试即可。
7. 测试成功后,单击“下一步”,出现如下界面,这一步是为本地网络服务命名。
点击下一步,配置就完成了。
4.PL/SQL Developer工具
在实际的Oracle开发中,经常使用一个功能强大的第三方工具:“PL/SQL Developer”工具。基本上可以实现Oracle开发中的任何操作。它运行在客户端时必须先安装Oracle客户端,并且听过网络配置向导配置网络服务名后才能与服务器连接。
4. Oracle服务
Oracle在windows中安装完成后,会安装很多服务,下面介绍几个主要的服务:1. OracleService+服务名,该服务是数据库启动的基础,只有该服务启动了,Oracle数据库才能正常启动。这是必须启动的任务。
2. OracleOraDb10g_home1TNSListener,该服务是服务器为客户端提供的监听任务,只有该服务在服务器上正常启动,客户端才能连接到服务器。该监听服务接收客户端发出的请求,然后将请求传递给数据库服务器,一旦建立了连接,客户端额数据库服务器就能直接通信了。
3. OracleOraDb10g_home1iSQL*Plus,该服务提供了用浏览器对数据库中数据操作的方式。该服务启动后,就可以使用浏览器进行远程登录并进行数据库操作了。如图所示:
5. Oracle启动和关闭
OracleService启动后,就可以对数据库进行管理了,Oracle的启动和关闭是最基本的命令,在SQL*Plus中,启动Oracle必须是sys用户,命令格式是:startup open;Oracle服务关闭用命令:shutdown immediate
6. Oracle用户和权限
Oracle中,一般不会轻易在一个服务器上创建多个数据库,在一个数据库中,不同的项目由不同的用户访问,每一个用户都拥有自己创建的数据库对象,因此用户的概念在Oracle中非常重要。Oracle的用户可以用CREATE USER命令来创建。其语法是:
》语法结构:创建用户
CREATE USER 用户名IDENTIFIED 口令[ACCOUNT LOCK|UNLOCK]
》语法解析:
LOCK|UNLOCK创建用户时是否锁定,默认我锁定状态。锁定的用户无法正常的登录进行数据库操作。
》代码演示:创建用户
SQL>CREATE USER jerry
IDENTIFIED BY tom
ACCOUNT UNLOCK;
小提示:Oracle在SQL*Plus中的命令是以分号(;)结尾,代表命令完毕斌执行,系统同时会把该命令保存到缓存中,缓存纵只保存最近执行过的命令,如果重新执行缓存中命令,直接使用做斜杠(/)符号。如果命令不以分号结尾,该命令只是写入缓存保存起来,但并不执行。
尽管用户创建成功,但是还不能正常的登录Oracle数据库,因为该用户还没有任何权限。如果用户能够正常登录,至少需要CREATE SESSION系统权限。
Oracle用户对数据库管理或对象操作的权利,分为系统权限和数据库对象权限。系统权限比如:CREATE SESSION,CREATE TABLE等,拥有系统权限的用户,允许拥有相应的系统操作。数据库对象权限,比如对表中的数据进行增删改操作等,拥有数据库对象权限的用户可以对所拥有的对象进行相应的操作。
还有一个概念就是数据库角色(role),数据库角色就是若干个心权限的集合。下面介绍几个常用的角色:
》CONNECT角色,主要应用在临时用户,特别是那些不需要创建表的用户,通常只赋予他们CONNECT role。CONNECT是使用Oracle的简单权限拥有CONNECT角色的用户,可以与服务器建立连接会话(session,客户端对服务器连接,称为会话)。
》RESOURSE角色,更可靠和正式的数据库用户可以授予RESOURSE role。RESOURSE提供给用户另外的权限以创建他们自己的表、序列、过程、触发器、索引等。
》DBA角色,DBA role拥有所有的系统权限——包括无限制的空间限额和给其他用户授予各种权限的能力。用户SYSTEM拥有DBA角色。
一般情况下,一个普通的用户(如SCOTT),拥有CONNECT和RESOURSE两个角色即可进行常规的数据库开发工作。
可以把某个权限授予某个角色,可以把权限、角色授予某个用户。系统权限只能由DBA用户授权,对象权限由拥有该对象的 用户授权,授权语法是:
》语法结构:授权
GRANT角色|权限 TO用户(角色)
代码演示:授权
SQL>GRANT CONNECT TO jerry;授权成功
SQL>GRANT RESOURSE TO jerry;授权成功
》语法结构:其他操作
//回收权限
REVOKE 角色|权限 FROM 用户(角色)
//修改用户的密码
ALERT USER 用户名 IDENTIFIED BY 新密码
//修改用户处于锁定(非锁定)状态
ALERT USER 用户名 ACCOUNT LOCK|UNLOCK
7. 本章总结
1.Oracle是基于对象的关系型数据库,产品免费,服务收费
2.Oracle安装后默认有两个管理员用户(system,sys)和一个普通用户Soctt。
3.Sql*plus是oracle管理和数据操作的客户端工具。
4.客户端链接服务器前,服务器要启动监听服务,并且客户端工具要安装Oracle客户端,并且在客户端要建立本地网络服务名。
5.Oracle服务和监听启动后才能对数据库进行操作
6.用startup命令启动数据库,用shutdown命令关闭数据库
7.Oracle的角色包括一系列系统权限和普通对象权限,可以授权给角色,把权限或者角色授权给用户。
第二章 数据操作和查询
1. SQL简介
SQL是结构化查询语言,专门用于数据存取、数据更新及数据库管理等操作。
在Oracle开发中,客户端把SQL语句发送给服务器,服务器对SQL语句进行编译、执行,把执行后结果返回给客户端。
Oracle SQL语句由如下的命令组成:
》数据定义语言(DDL),包括CREATE(创建)命令、ALERT(修改)命令、DROP(删除)命令等。
》数据操纵语言(DML),包括INSERT(插入)命令,UPDATE(更新)命令,DELETE(删除)命令,SELECT...FOR UPDATE(查询)等
》数据查询语言(DQL),包括基本查询语句、Order By子句、Group By子句等。
》事物控制语言(TCL),包括COMMIT(提交)命令,SAVEPOINT(保存点)命令,ROLLBACK(回滚)命令
》数据控制语言(DCL),包括GRANT(授权)命令,REVOKE(撤销)命令。
目前主流的数据库产品都支持标准的sql语句。
2. Oracle数据类型
Oracle数据库的核心是表,表中的列使用到的常见的数据类型如下:
对应的NUMBER类型的示例:
对于日期类型,可以使用 sysdate 内置函数可以获取当前的系统日期和时间,返回 DATE 类型,用 systimestamp 函数可以 返回当前日期、时间和时区。
SELECT SYSDATE,SYSTIMESTAMP FROM DUAL
Oracle的查询中,必须使用“select 列...from 表”的完整语法,当查询单行函数的时候,from后面使用DUAL表,短路表在系统中只有一行一列,该表在输出单行函数时为了select...from的语法完整性而使用。
3.创建表和约束
Oracle创建表同SQL Server一样,使用CREATE TABLE命令来完成。创建约束则使用如下的命令:
ALERT TABLE 表名ADD CONSTRAINT 约束名 约束内容。
不论创建一个表还是约束,与SQL Server基本相同。但值得注意的是:Oracle中default是一个值,而SQL Server中default是一个约束,因此Oracle的default设置可以在建表的时候创建。
案例:创建一个学生信息(INFOS)表和约束
代码演示:Oracle创建表和约束
CREATE TABLE INFOS
(
STUID VARCHAR2(7) NOT NULL, --学号 学号=‘S’+班号+2位序号
STUNAME VARCHAR2(10) NOT NULL, --姓名
GENDER VARCHAR2(2) NOT NULL, --性别
AGE NUMBER(2) NOT NULL, --年龄
SEAT NUMBER(2) NOT NULL, --座号
ENROLLDATE DATE, --入学时间
STUADDRESS VARCHAR2(50) DEFAULT '地址不详', --住址
CLASSNO VARCHAR2(4) NOT NULL --班号 班号=学期序号+班级序号
)
/ ①
ALTER TABLE INFOS ADD CONSTRAINT PK_INFOS PRIMARY KEY(STUID) ②
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_GENDER
CHECK(GENDER = '男' OR GENDER = '女') ③
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_SEAT
CHECK(SEAT >=0 AND SEAT <=50) ④
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_AGE
CHECK(AGE >=0 AND AGE<=100) ⑤
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_CLASSNO
CHECK((CLASSNO >='1001' AND CLASSNO<='1999') OR
(CLASSNO >='2001' AND CLASSNO<='2999')) ⑥
/
ALTER TABLE INFOS ADD CONSTRAINTS UN_STUNAME UNIQUE(STUNAME) ⑦
/
代码解析:
① 在 Oracle 代码中,“/”执行缓存区中的语句,由于缓冲区中只存储一条刚刚保存过
语句,由于每条语句没有用分号结尾,只是保存在缓冲区,因此每条语句后面都有
单独一行“/”。
② 创建一个主键约束。
③ 与 ④ ⑤ ⑥ ⑦一起创建各种 check 约束。其中⑦是唯一约束,表示该列值是唯一
的,列中的值不能重复。
4.数据操纵语言(DML)
数据操纵语言用于对数据库中的表中的数据进行添加、修改、删除和SELECT...For UPDATE操作。
1.简单查询
数据查询使用SELECT命令从数据库的表中提取信息。
> 语法结构:简单查询
SELECT *|列名|表达式 FROM 表名 WHERE 条件 ORDER BY 列名
> 语法结构:根据结果集创建表
CREATE TABLE 表名 AS SELECT 语句
代码演示: SQL> CREATE TABLE INFOS1 AS SELECT * FROM INFOS;
使用上面命令创建的新表中,不存在任何约束,并且把查询的数据一起插入到新表中。如果只复制表结构,只需使查询的条件不成立(比如where 1=2),就不会查询出任何数据,从而复制一个表结构。
2.数据插入(INSERT)
语法结构:根据结果集创建表
INSERT INTO 表名(列名1,列名2....)VALUES(值1,值2.....)
语法解析:列名可以省略,当省略列名时,默认是表中所有的列名。
3.更新数据(UPDATE)
语法结构:UPDATE操作
UPDATE 表名 SET 列名1=值,列名2=值.....WHERE 条件
4.删除数据(DELETE)
语法结构:DELETE操作
DELETE FROM 表名 WHERE 条件
5.TRUNCATE
在数据库操作中,TRUNCATE命令(是一个DDL命令)可以把表中所有的数据一次性全部删除。
语法结构:TRUNCATE
TRUNCATE TABLE 表名
TRUNCATE和DELETE都能把表总的数据全部删除,他们的区别是:
1.TRUNCATE删除的数据不能恢复,DELETE删除的数据可以通过日志文件恢复
2.如果 一个表中的数据记录很多,TRUNCATE相对DELETE速度快。
由于TRUNCATE命令比较危险,因此在实际的开发中慎用。
5.操作符
Oracle开发中,依然存在算数运算、关系运算和逻辑运算。
1.算数运算
Oracle中的算数运算符,只有+、-、*、/四个,其中除号的结果是浮点数。
求余运算只能借助函数:MOD(x,y):返回x除以y的余数
2.关系运算和逻辑运算
Oracle中where子句经常见到关系运算和逻辑运算,常见的关系运算有:
逻辑运算符有:AND、OR、NOT
3.字符串连接操作符(||)
在Oracle中,字符串的连接用双竖线(||)表示。
案例:查询工资在2000元以上的员工的姓名和工作。
SQL:SELECT(ENAME|| 'is a'||JOB) AS "Employee Details"
FROM EMP
WHERE SAL>2000;
结果显示:
代码解析:Oracle中字符串可以使用单引号,也可以使用双引号,在别名中存在空格时,必须使用双引号。在表名和列名时用双引号。
6.高级查询
1.消除重复行
在Oracle的查询结果中,可能出现若干行相同的情况,就可以使用DISTINCT消除重复行。
代码演示:SQL> SELECT DISTINCT DEPTNO FROM EMP;
2.NULL操作
如果某条记录中有缺少的数据值,就是空值(NULL值)。空值不等于0或者空格,空值是指未赋值、未知或不可用的值。任何数据类型的列都可以包括NULL值,除非该列被定义为非空或者主键。
代码演示:NULL值查询:SQL> SELECT ENAME,JOB,SAL,COMM FROM EMP WHERE SAL<2000 AND COMM IS NULL;
在查询条件中NULL用IS NULL 作条件,非NULL用 IS NOT NULL做条件。
3.IN 操作
在where子句中可以使用IN操作符来查询其列值在指定的列表中的行。例如:查询出工作职责在SALESMAN、PRESIDENT或者ANALYST的员工。
代码演示:SQL> SELECT ENAME,JOB,SAL FROM EMP WHERE job IN ('SALESMAN', 'PRESIDENT', 'ANALYST');
对应IN操作的还有NOT IN,用法一样,结果相反。
4.BETWEEN...AND...
在WHERE子句中,可以使用BETWEEN操作符来查询列值包含在指定区间内的行。
代码演示:1.SELECT ename,job,sal FROM EMP WHERE sal >1000 AND sal<2000;
2.SELECT ename,job,sal FROM EMP WHERE sal BETWEEN 1000 AND 2000;
5.LIKE模糊查询
在一些查询时,可能把握不准需要查询的确切值,比如在搜索引擎中输入关键字即可查询相关结果。这种查询称为查询模糊查询。模糊查询使用LIKE关键字通过字符匹配检索出所需要的数据行。字符匹配操作可以使用通配符“%”和“_”:
%:表示零个或者多个任意字符。
_:表示任意一个字符。
语法是:LIKE '字符串'[ESCAPE '字符']。匹配的字符串中,ESCAPE后面的“字符”作为转义字符。
代码演示:SQL> SELECT ENAME,JOB,SAL FROM EMP WHERE ENAME LIKE 'J%S';
结果显示:
6. 集合运算
集合运算就是讲两个或者多个结果集组合成一个结果集。集合运算包括:
。INTERSECT(交集),返回两个查询共有的记录。
。UNION ALL(并集),返回各个查询的所有记录,包括重复记录。
。UNION(并集),返回各个查询的所有记录,不包含重复记录。
。MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。
小提示:当使用集合操作的时候,查询所返回的列数以及列的类型必须匹配,列名可以不同。
7.连接查询
在SQL Sever中已经学习过内联接(inner join)、外联接(outer join),外联接有分为左外联接(left outer join)和右外联接(right outer join)。Oracle中对两个或者若干个表之间的外联接用(+)表示。
案例:请查出工资大于2000元的,员工姓名,部门,工作,工资(由于部门名称在dept中,其他信息在emp表中,需要内联接才能完成。)
代码演示:
SQL> SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
2 FROM emp e,dept d
3 WHERE e.deptno=d.deptno
4 AND e.SAL>2000;
查询结果:
代码演示:
SQL> SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM emp e INNER JOIN dept d ON e.DEPTNO=d.DEPTNO
WHERE e.SAL>2000;
案例:请查询每个部门下的员工姓名,工资。
案例分析:emp表用外键dempno引用dept中的deptno,在dept表中如果有某些部门没有员工,那么用内联接,没有员工部门将无法显示,因此必须以dept表为基准的外联接。
代码演示:
SQL> SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM emp e,dept d
WHERE E.DEPTNO(+)=d.DEPTNO;
代码解析:(+):Oracle专用的联接符,在条件中出现现在左边指右外联接,出现在右边指左外联接。
代码演示:外联接
SQL> SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM EMP e RIGHT OUTER JOIN DEPT d ON e.DEPTNO=d.DEPTNO;
7.本章总结
1.Oracle SQL 语句中有数据操纵语言(DML)、数据定义语言(DDL)、数据控制语言(DCL)、事物控制语言(TCL)等等。
2.DML 语句包括增删改查语句,DDL 语句包括数据库对象创建、修改和删除语句,数据控制命令包括 GRANT、REVOKE 等,事务控制命令有 COMMIT、ROLLBACK 等。
3.数据库中建表常用的类型有:数字类型number (p,s),可变字符串varchar2 (length),
日期 date。
4.Oracle 中 default 是一个值,在 Oracle 中不存在 default 约束。
5.Oracle 的增删改语句与 SQL Server 基本一致,都是使用 INSERT、UPDATE、DELETE
完成。
6.Oracle 高级查询中要注意: DISTINCT、 NULL、IN、BETWEEN…AND…。
7.集合操作有:UNION、UNION ALL、INTESECT、MINUS。
8.联接查询有内联接和外联接。
第三章 子查询和常用函数
1.子查询
子查询selectupdate、delete语句内部可以出现select语句。内部的select语句结果可以作为外部去语句中条件的一部分,也可以作为外部查询的临时表。子查询的类型有:
1.单行子查询:不向外部返回结果,或者返回一行结果
2.多行子查询:向外部返回零行、一行或者多行结果。
代码演示:SELECT ENAME,JOB,SAL,FROM EMP WHERE DEMPNO=(SELECT DEMPNO FROM DEPT WHERE DNAME=’SALES’);
提示:
1.如果内部查询不返回任何记录,则外部条件中字段DEPTNO与NULL比较永远为假,也就是说外部查询不返回任何结果。
2.在单行子查询中外部查询可以使用=,>,<,>=,<=等比较运算符。
3.内部擦讯结果必须与外部查询条件中的(DEPTNO)匹配。
4.如果内部查询出现多昂结果则出现错误
案例1:查询出出表EMP中比任意一个销售员(“SALESMAN”)工资低的员工姓名、工作、工资。
案例分析:查询比任意一个员工工资低的员工只需返回比“最高工资还低”即可。子查询中会出现多条记录。这时候需要用到关键字ANY。ANY放在比较运算符后面表示“任意”的意思。
代码演示:SELECT ENAME,JOB,SAL FROM EMP WHERE SAL<ANY(SELECT SAL FROM EMP WHERE JOB=’SALESMAN’);/
案例2:查询出比所有销售员工资都高的员工姓名,工作,工资。
案例分析:ANY可以表示任意的,但本案例中要求比所有员工个盘子都高,那么就要使用另外的一个关键字ALL。ALL与关系操作符一起使用,表示与子查询中所有元素比较。
代码演示:ALL查询
SELECT ENAME,JOB,SAL FROM EMP WHERE SAL<ALL(SELECT SAL FROM WHERE JOB=’SALESMAN’)/
2. Oracle中的伪列
在Oracle的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就像表中列一样,但是表中并不存储。伪列只能查询,不能进行增删改操作。
1. ROWID
表的每一行在数据文件中都有一个物理地址,ROWID伪列返回的就是该行的物理地址。使用ROWID可以快速的定位表中的某一行。ROWID值可以唯一的标识表中的一行。由于ROWID的返回是该行的物理地址,因此使用ROWID可以显示行是如何存储的。
代码演示:ROWID
SQL> SELECT ROWID ENAME FROM EMP WHERE SAL>2000/
2. ROWNUM
在查询的结果集中,ROWNUM为结果集中的每一行标识一个行号,第一行返回1,第二行返回2,以此类推,通过ROWNUM伪列可以限制查询结果集中返回的行数。
案例:请查出员工表中前5名员工的姓名、工作、工资
代码演示:SQL> SELECT ROWNUM,ENAME,JOB,SALFROM EMP WHERE ROWNUM<=5;
第四章 空间表、数据库对象
1.数据库对象
数据库对象是数据库的组成成分,常常用CREATE命令进行创建,可以使用ALERT命令修改,用DROP执行删除操作。
接下来学习更多的Oracle数据库对象:
1. 同义词;就是给数据库对象的一个别名
2. 序列:Oracle纵实现增长的对象
3. 视图:预定义的查询,作为表一样的查询使用,是一张虚拟表。
4. 索引:对数据库表中的某些列进行排序,便于提高插叙效率。
2. 同义词
同义词(Synonym)是数据库对象的一个别名,Oracle可以为表、视图、序列、过程、函数、程序包等指定一个别名。同义词有两种类型:
1.私有同义词:拥有CREATE SYNONYM权限的用户(包括非管理员)即可创建私有同义词,创建的私有同义词只能当前用户使用。
2.公有同义词:系统管理员可以创建公有同义词,公有同义词可以被所有用户访问。
创建同义词的语法是:
语法结构:同义词
CREATE [OR REPLACE][PUBLIC] SYNONYM[schema.]synonym_name
FOR[schema.]object_name
语法解析:
1. CREATE[OR REPLACE:]表示在创建同义词时,如果该同义词已经存在,哪儿就用新创建同义词代替旧同义词。
2. PUBLIC:创建共有同义词时使用的关键字,一般情况下不需要创建公有同义词。
3. Oracle中一个用户可以创建表、视图等多种数据库对象,一个用户和该用户下的所有数据库对象的集合称为Schema(中文称为模式或者方案),用户名就是Schema名。一个数据库对象的全称是:用户名.对象名,即schema.object_name。
如果一个用户有权限访问其他用户对象时,就可以用全称来访问。
代码演示:System用户访问Scott用户的Emp表
SQL> conn system/manager@orcl;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as system
SQL> SELECT ENAME,JOB,SAL FROM SCOTT.EMP WHERE SAL>2000;
案例1.创建一个用户XiaoMei,该用户拥有CONNECT和RESOURSE角色。为SCOTT用户的EMP表创建同义词,并通过同义词访问EMP表。
代码演示:创建同义词并访问
SQL> CONN system/manager@orcl;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as system
SQL> CREATE USER XiaoMei IDENTIFIED BY XiaoMei;
User created
SQL> GRANT CONNECT TO XiaoMei;
Grant succeeded
SQL> GRANT RESOURSE TO XiaoMei;
Grant succeeded
SQL> GRANT CREATE SYNONYM TO XiaoMei;
Grant succeeded
SQL> CONN XiaoMei/XiaoMei@orcl;
Connected to Oracle Database 10g Enterprise Edition Release10.2.0.3.0
Connected as XiaoMei
SQL> CREATE SYNONYM MyEmp FOR SCOTT.EMP; //在XiaoMei用户下,为Scott.EMP创建同义词,只能在当前用户下使用。访问MyEmp就是访问SCOTT.EMP对象
Synonym created
SQL> SELECT * FROM MYEMP;访问对象出错,对象不存在
SELECT * FROM MYEMP
ORA-00942:表或试图不存在
SQL> CONNECT SCOTT/tiger@ORCL;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as SCOTT
SQL> GRANT ALL ON EMP TO XiaoMei;4
Grant succeeded
SQL> CONNECT XiaoMei/XiaoMei@Orcl;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
SQL> SELECT ENAME,JOB,SAL FROM MyEmp WHERE SAL>2000;
语法结构:删除同义词
DROP[PUBIC]SYNONYM[schema.]synonym_name
语法解析:
1. public:删除公共同义词
2. 同义词的删除只能被拥有同义词对象的用户或者管理员删除
3. 此命名只能删除同义词,不能删除同义词的源对象
3. 序列
序列(Sequence)是用来生成连续的整数数据的对象。序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成。创建序列的语法是:
语法结构:创建序列
CREATE SWQUENCE sequence_name
[START WITH num]
[INCREMENT BY increment]
[MAXVALUE num|NOMAXVALUE]
[MINVALUE num|NOMAXVALUE]
[CYCLE|NOCYCLE]
[CACHE num|NOCACHE]
语法解析:
1. START WITH:从某一个整数开始,升序默认值是1,降序默认值时-1。
2. INCREMENT BY:如果是正数则升序生成,负数则降序生成,
3. NOMAXVALUE:这是最大值的默认选项,升序的最大值是1027,降序默认值是-1.
4. MAXVALUE:指最大值
5. NOMAXVALUE:默认选项,升序的最大值是1,降序默认值是-126.
6. NOCYCLE:表示不重新开始,序列升序达到最大值、降序达到最小值后就报错。
案例:创建一个从1开始,默认最大值,每次增长1的序列,要求NOCYCLE,缓存中有30个预先分配好的序列号
代码演示:
SQL> CREATE SEQUENCE MYSEQ
MINVALUE 1
START WITH 1
NOMAXVALUE
INCREMENT BY 1
NOCYCLE
CACHE 30
/
4. 视图
视图(view)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中插叙信息与从表中查询信息的方法完全相同。只需要简单的SELECT...FROM即可。
视图具有以下的优点:
1. 可以限制用户只能通过视图检索数据。这样就可以对最终用户拼比建表时底层的基表
2. 可以将复杂的查询八寸为视图。可以对最终用户屏蔽一定的复杂性。
3. 限制某个视图只能访问基表中的部分行或者部分列的特定数据,这样就可以实现一定的安全性。
4. 从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。
语法结构:创建视图
CREATE [OR REPLACE] {[FORCE|NOFORCE]} VIEW view_name
AS
SELECT 查询
[WITH READ ONLY CONSTRAINT]
语法解析:
1. OR REPLACE:如果视图已经存在,则替换视图。
2. FORCE:即使基表不存在,也可以创建视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用。
3. NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。
4. WITH READ ONLY:默认可以通过视图对基表执行增删改查操作,但是有很多在基表上的限制。
案例3:基于EMP表和DEPT表创建视图
代码演示:
SQL> CREATE OR PEPLACE VIEW EMPDETAIL
AS
SELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAME
FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO
WITH READ ONLY
/
SQL> SELECT * FROM EMPDETAIL
5.索引
数据库中索引(index)的概念与目录的概念非常相似。如果某列出现在查询的条件中,而该列的数据是无序的,查询时只能从第一行开始一行一行的匹配。创建索引就是对某些特定列中的数据排序,生成独立的索引表。在某列上创建索引后,如果该列出现在查询条件中,Oracle会自动的引用该索引,先从索引表中查询出符合条件记录的 ROWID,由于 ROWID 是记录的物理地址,因此可以根据 ROWID 快速的定位到具体的记录,表中的数据非常多时,引用索引带来的查询效率非常可观。
Oracle数据库会为表的主键和包含唯一约束的列自动创建索引。索引可以提高查询的效率,但是在数据增删改查是需要更新索引,因此索引对增删改查时回头负面的影响。
语法结构:创建索引
CREATE[UNIQUE] INDEX index_name ON
Table_name(column_name[,column_name...])
语法解析:
1. UNIQUE:指定索引列上的值必须是唯一的。
2. index_name:指定索引名
3. tabl_name:指定要为那个表创建索引
4. Column_name:指定要对哪个列创建索引。也可以对多列创建索引:这种索引被称为组合索引。
案例 4:为 EMP 表的 ENAME 列创建创建唯一索引,为 EMP 表的工资列创建普通索引,
把 JOB 列先变为小写再创建索引。
代码演示:
SQL> CREATE UNIQUE INDEX UQ_ENAME_IDX ON EMP(ENAME);
Index created
SQL> CREATE INDEX IDX_SAL ON EMP(SAL);
Index created
SQL> CREATE INDEX IDX_JOB_LOWER ON EMP(LOWER(JOB));
Index created
在 select 语句查询时,Oracle 系统会自动为查询条件上的列应用索引。索引就是对某一列进行排序,因此在索引列上,重复值越少,索引的效果越明显。Oracle 可以为一些列值重复非常多且值有限的列(比如性别列)上创建位图索引。
6.表空间
表空间只是一个逻辑概念,若干操作系统文件(文件可以不是很大)可以组成一个表空间。表空间统一管理空间中的数据文件,一个数据文件只能属于一个表空间。一个数据库空间由若干个表空间组成。如图所示:
Oracle 中所有的数据(包括系统数据),全部保存在表空间中,常见的表空间有:
1.系统表空间:存放系统数据,系统表空间在数据库创建时创建。表空间名称为SYSTEM。存放数据字典和视图以及数据库结构等重要系统数据信息,在运行时如果 SYSTEM 空间不足,对数据库影响会比较大,虽然在系统运行过程中可以通过命令扩充空间,但还是会影响数据库的性能,因此有必要在创建数据库时适当的把数据文件设置大一些。
2.TMEP 表空间:临时表空间,安装数据库时创建,可以在运行时通过命令增大临时表空间。临时表空间的重要作用是数据排序。比如当用户执行了诸如 Order by 等命令后,服务器需要对所选取数据进行排序,如果数据很大,内存的排序区可能装不下太大数据,就需要把一些中间的排序结果写在硬盘的临时表空间中。
3. 用户表自定义空间:用户可以通过 CREATE TABLESPACE 命令创建表空间。创建表空间需要考虑数据库对分区(Extent,一个 Oracle 分区是数据库文件中一段连续的空间,Oracle 分区是 Oracle 管理中最小的单位)的管理,比如当一个表创建后先申请一个分区,在 Insert 执行过程中,如果分区数据已满,需要重新申请另外的分区。如果一个数据库中的分区大小不一,创建表空间时需要考虑一系列问题。因此在 Oracle8i 之后,创建表空间都推荐使用“本地管理表空间”,这种表空间中的分区是一个固定大小的值。
语法结构:创建表空间
CREATE TABLESPACE 空间名称
DATAFILE '文件名1' SIZE 数字M
[,'文件名2' SIZE 数字….]
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 数字M
语法解析:
1. 文件名包括完整路径和文件名,每个数据文件定义了文件的初始大小,初始大小一般以“M”为单位。一个表空间中可以有多个数据文件。
2. EXTENT MANAGEMENT LOCAL 指明表空间类型是:本地管理表空间。本地管理表间要求 Oracle 中的数据分区(Extent)大小统一。
3. UNIFORM SIZE:指定每个分区的统一大小。
案例 5:创建一个表空间,包含两个数据文件大小分别是 10MB,5MB,要求 extent 的大小统一为 1M。
代码演示:
SQL> CREATE TABLESPACE MYSPACE
2 DATAFILE 'D:/A.ORA' SIZE 10M,
3 'D:/B.ORA' SIZE 5M
4 EXTENT MANAGEMENT LOCAL
5 UNIFORM SIZE 1M
6 /
Tablespace created
必须是管理员用户才能创建表空间,当表空间不足时可以使用ALERT TABLESPACE命令向表空间追加数据文件扩充空间
代码演示:扩充表空间
SQL> ALERT TABLESPACE MYSPACE
ADD DATAFILE 'D:/C.ORA' SIZE 10M
/
表空间可以在不使用时删除,使用DROP TABLESPACE命令。
7.本章总结
1.Oracle数据都是使用CREATE命令创建的。
2.同义词就是数据库对象的一个别名。同义词的类型有公有同义词和私有同义词。只有管理员可以创建公有同义词。创建同义词的命令是:CREATE SYNONYM.
3.序列能够产生一个连续不重复的整数。经常作为数据库的主键生成器。创建序列的命令是CREATE SEQUENCE。
4.序列的访问使用两个“伪列”,CURRVAL表示序列的当前值,NEXTVAL表示序列的下一个值。
5.视图就是一个预处理的查询语句,可以从若干表中过滤数据。
6.索引就是在查询中经常使用的列进行排序。常见的索引有:普通索引、唯一序列、组合索引以及基于函数的索引。此外还有位图索引、、反向索引等。
7.表空间的数据库的一个逻辑概念,表空间由若干个数据文件组成。为数据库对象和数据提供统一的空间管理。