1个oracle ――1个数据库――多个数据表(数据对象)――多个用户
注:默认会创建 SYS 和 SYSTEM ,同时 Oracle 为程序测试提供了一个普通用户 scott. 默认的用户中, SYS 和 SYSTEM 用户是没有锁定的,安装成功后可以直接使用, SCOTT 用户默认为锁定状态,因此不能直接使用,需要把 SCOTT 用户设定为非锁定状态才能正常 使用.
一、链接数据库:
1.使用sqlplus /nolog(启动一个客户端进程)
conn 用户名/密码 as 连接身份@服务器连接字符串
其中链接身份:sys 用户只能使用 sysdba 身份登录,而 system 可以用普通用户登录
连接身份:表示该用户连接后拥有的权限
sysdba: 即数据库管理员, 权限包括: 打开数据库服务器、 关闭数据库服务
器、 备份数据库、 恢复数据库、 日志归档、 会话限制、 管理功能、 创建数据库。
sys 用户必须用 sysdba 身份才能登录, system 用户可以用普通身份登录。
sysyoper: 即数据库操作员, 权限包括: 打开数据库服务器、 关闭数据库服务
器、 备份数据库、 恢复数据库、 日志归档、 会话限制。
normal: 即普通用户, 权限只有查询某些数据表的数据。默认的身份是 normal
network/ADMIN/ tnsnames.ora:
详情见附件
配置本地网络服务名:
本地网络服务名,即客户端与服务器的连接字符串,本地网络服务名是客户端的配置,Oracle 客户端安装后,可以使用客户端自带的网络配置向导( Net Configuration Assistant)进行配置:
2.PL/SQL Developer 工具
二、ORACLE 服务
1). OracleService+服务名 数据库服务器基本启动服务
2). OracleOraDb10g_home1TNSListener 服务器监听客户端的服务
3).OracleOraDb10g_home1iSQL*Plus 使用浏览器进行远程登录操作数据库服务(http://localhost:5560/isqlplus)
4). OracleDBConsole+服务名 基于 B/S 的企业管理器 输入命令:emctl start dbconsole ,获取 B/S 地址
三、数据库启动跟关闭
sqlplus 中 只能以 sys 用户启动 startup open / shutdown immediate
四、用户和权限
CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK] 默认为锁定状态,需要给用户赋予 CREATE SESSION 权限才能登录
权限举例: CONNECT, RESOURCE, DBA
授权语句: GRANT角色|权限 TO 用户(角色) :GRANT CONNECT TO jerry;
回收权限: REVOKE 角色|权限 FROM 用户(角色)
修改密码: ALTER USER 用户名 IDENTIFIED BY 新密码
修改锁定状态: ALTER USER 用户名 ACCOUNT LOCK|UNLOCK
五、数据类型
1). CHAR(length) : 存储固定长度 length
2). VARCHAR2(length) : 存储变长字符串 length 为最大长度
3). NUMBER(p, s) : p 为整数长度,s 为小数长度
4). Date 年月日,时分秒,可以通过 sysdate 函数返回数据
5). TIMESTAMP 不但存储日期的年月日,时分秒,以及秒后 6 位,同时包含时区,可以通过 systimestamp函数返回数据
6). CLOB(大文件,ex: xml),BLOB (二进制文件)
六、创建表和约束
1)、
ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束内容
主键: 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 CONSTRAINTS UN_STUNAME UNIQUE(STUNAME)
外键: ALTER TABLE SCORES ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES INFOS(STUID)
2)、
复制表结构: CREATE TABLE INFOS2 AS SELECT * FROM INFOS WHERE 1=2;
若需插入数据: CREATE TABLE INFOS2 AS SELECT * FROM INFOS;
插入数据的时候要插入时间 date : TO_DATE('2009-8-9 06:30:10',' YYYY-MM-DD HH24:MI:SS ')
3)、
删除数据: TRUNCATE TABLE 表名 为DDL命令,数据不能恢复;delete 为 DML 命令,数据可以通过日志文件恢复
4)、
查询的时候字符串链接: 字符串的连接用双竖线( ||)表示
消除重复: SELECT DISTINCT DEPTNO FROM EMP
LIKE: '%30\%%' escape '\' (包含“ 30%”的字符串,“ \”指转义字符,“ \%”在字符串中
表示一个字符“ %”)
ANY: SELECT ENAME,JOB,SAL FROM EMP
WHERE SAL<ANY (SELECT SAL FROM EMP WHERE JOB='SALESMAN')
ALL: SELECT ENAME,JOB,SAL FROM EMP
WHERE SAL>ALL (SELECT SAL FROM EMP WHERE JOB='SALESMAN')
ROWID,ROWNUM: SELECT ROWNUM,ENAME,JOB,SAL FROM EMP WHERE ROWNUM<=5;
5)、 集合运算
INTERSECT(交集), 返回两个查询共有的记录。
UNION ALL(并集),返回各个查询的所有记录,包括重复记录。
UNION(并集),返回各个查询的所有记录,不包括重复记录。
MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。
6)、
内联接: SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM EMP e INNER JOIN DEPT d ON e.DEPTNO=d.DEPTNO
其中 INNER 可以省略
外联接: SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM EMP e RIGHT OUTER JOIN DEPT d ON e.DEPTNO=d.DEPTNO
其中 OUTER 可以省略
七、函数
字符串:
示例 示例结果
SELECT ASCII('a') FROM DUAL 97
SELECT CONCAT('Hello', ' world') FROM DUAL Hello world
SELECT INSTR('Hello world', 'or') FROM DUAL 8
SELECT LENGTH('Hello') FROM DUAL 5
SELECT LOWER('hElLO') FROM DUAL; hello
SELECT UPPER('hello') FROM DUAL HELLO
SELECT LTRIM('===HELLO===', '=') FROM DUAL HELLO===
SELECT '=='||LTRIM(' HELLO===') FROM DUAL ==HELLO===
SELECT RTRIM('===HELLO===', '=') FROM DUAL ===HELLO
SELECT '='||TRIM(' HELLO ')||'=' FROM DUAL =HELLO=
SELECT TRIM('=' FROM '===HELLO===') FROM DUAL HELLO
SELECT REPLACE('ABCDE','CD','AAA') FROM DUAL ABAAAE
SELECT SUBSTR('ABCDE',2) FROM DUAL BCDE
SELECT SUBSTR('ABCDE',2,3) FROM DUAL BCD
数字:
函数 说明 示例
ABS(x) x 绝对值 ABS(-3)=3
ACOS(x) x 的反余弦 ACOS(1)=0
COS(x) 余弦 COS(1)=1.57079633
CEIL(x) 大于或等于x 的最小值 CEIL(5.4)=6
FLOOR(x) 小于或等于 x 的最大值 FLOOR(5.8)=5
LOG(x,y) x 为底 y 的对数 LOG(2,4)=2
MOD(x,y) x 除以 y 的余数 MOD(8,3)=2
POWER(x,y) x 的 y 次幂 POWER(2,3)=8
ROUND(x[,y]) x 在第 y 位四舍五入 ROUND(3.456,2)=3.46
SQRT(x) x 的平方根 SQRT(4)=2
TRUNC(x[,y]) x 在第 y 位截断 TRUNC(3.456,2)=3.45
说明:
1. ROUND(X[,Y]),四舍五入。
在缺省 y 时,默认 y=0;比如: ROUND(3.56)=4。
y 是正整数,就是四舍五入到小数点后 y 位。 ROUND(5.654,2)=5.65。
y 是负整数,四舍五入到小数点左边|y|位。 ROUND(351.654,-2)=400。
2. TRUNC(x[,y]),直接截取,不四舍五入。
在缺省 y 时,默认 y=0;比如: TRUNC (3.56)=3。
y 是正整数,就是四舍五入到小数点后 y 位。 TRUNC (5.654,2)=5.65。
y 是负整数,四舍五入到小数点左边|y|位。 TRUNC (351.654,-2)=300。
日期:
1. ADD_MONTHS(d,n),在某一个日期 d 上,加上指定的月数 n,返回计算后的新日期。
d 表示日期, n 表示要加的月数。
2. LAST_DAY(d),返回指定日期当月的最后一天。
3. ROUND(d[,fmt]),返回一个以 fmt 为格式的四舍五入日期值, d 是日期, fmt 是格式
模型。默认 fmt 为 DDD,即月中的某一天。
如果 fmt 为“ YEAR”则舍入到某年的 1 月 1 日,即前半年舍去,后半年作为下
一年。
如果 fmt 为“ MONTH”则舍入到某月的 1 日,即前月舍去,后半月作为下一
月。
默认为“ DDD”,即月中的某一天,最靠近的天,前半天舍去,后半天作为第
二天。
如果 fmt 为“ DAY”则舍入到最近的周的周日,即上半周舍去,下半周作为下
一周周日。
与 ROUND 对应的函数时 TRUNC(d[,fmt])对日期的操作, TRUNC 与 ROUND 非常相似,只
是不对日期进行舍入,直接截取到对应格式的第一天。
4. EXTRACT(fmt FROM d),提取日期中的特定部分。
fmt 为: YEAR、 MONTH、 DAY、 HOUR、 MINUTE、 SECOND。其中 YEAR、 MONTH、 DAY
可以为 DATE 类型匹配,也可以与 TIMESTAMP 类型匹配;但是 HOUR、 MINUTE、 SECOND 必
须与 TIMESTAMP 类型匹配。
转换函数:
1)、
SELECT TO_CHAR(SYSDATE,'YYYY"年"MM"月"DD"日" HH24:MI:SS') "date"
2)、
SQL> SELECT TO_CHAR(-123123.45,'L9.9EEEEPR') "date"
2 FROM DUAL
3 /
date
--------------------
<¥1.2E+05>
3)、
SQL> SELECT TO_NUMBER('-$12,345.67','$99,999.99') "NUM"
2 FROM DUAL
3 /
NUM
---------------
-12345.67
其他单行函数:
1. NVL(x,value)
如果 x 为空,返回 value,否则返回 x。
2. NVL2(x,value1,value2)
如果 x 非空,返回 value1,否则返回 value2。
聚合函数:
名称 作用 语法
AVG 平均值 AVG(表达式)
SUM 求和 SUM(表达式)
MIN、 MAX 最小值、最大值 MIN(表达式)、 MAX(表达式)
COUNT 数据统计 COUNT(表达式)
八、数据库对象
同义词:
案例:创建一个用户 XiaoMei,该用户拥有 CONNECT 角色和 RESOURCE 角色。为 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 RESOURCE TO XiaoMei;
Grant succeeded
SQL> GRANT CREATE SYNONYM TO XiaoMei;
Grant succeeded
SQL> CONN XiaoMei/XiaoMei@ORCL;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as XiaoMei
SQL> CREATE SYNONYM MyEmp FOR SCOTT.EMP; ②
Synonym created
SQL> SELECT * FROM MYEMP; ③
SELECT * FROM MYEMP
ORA-00942: 表或视图不存在
SQL> CONNECT SCOTT/tiger@ORCL //连接到Scott
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as SCOTT
SQL> GRANT ALL ON EMP TO XiaoMei; ④
Grant succeeded
SQL> CONNECT XiaoMei/XiaoMei@ORCL;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as XiaoMei
SQL> SELECT ENAME,JOB,SAL FROM MyEmp WHERE SAL>2000;
DROP [PUBLIC] SYNONYM [schema.]sysnonym_name
语法解析:
① PUBLIC:删除公共同义词。
② 同义词的删除只能被拥有同义词对象的用户或者管理员删除。
③ 此命令只能删除同义词,不能删除同义词下的源对象。
序列号:
语法结构:创建序列
CREATE SEQUENCE sequence_name
[START WITH num]
[INCREMENT BY increment]
[MAXVALUE num|NOMAXVALUE]
[MINVALUE num|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE num|NOCACHE]
语法解析:
① START WITH:从某一个整数开始,升序默认值是 1,降序默认值是-1。
② INCREMENT BY:增长数。如果是正数则升序生成,如果是负数则降序生成。升序默
认值是 1,降序默认值是-1。
③ MAXVALUE:指最大值。
④ NOMAXVALUE:这是最大值的默认选项,升序的最大值是: 1027,降序默认值是-1。
⑤ MINVALUE:指最小值。
⑥ NOMINVALUE:这是默认值选项,升序默认值是 1,降序默认值是-1026。
⑦ CYCLE:表示如果升序达到最大值后,从最小值重新开始;如果是降序序列,达到最
小值后,从最大值重新开始。
⑧ NOCYCLE:表示不重新开始,序列升序达到最大值、降序达到最小值后就报错。默
认 NOCYCLE。
⑨ CACHE:使用 CACHE 选项时,该序列会根据序列规则预生成一组序列号。保留在内
存中,当使用下一个序列号时,可以更快的响应。当内存中的序列号用完时,系统
再生成一组新的序列号,并保存在缓存中,这样可以提高生成序列号的效率。 Oracle
默认会生产 20 个序列号。
案例:创建一个从 1 开始,默认最大值,每次增长 1 的序列,要求 NOCYCLE,缓存中
有 30 个预先分配好的序列号。
代码演示:生成序列号
SQL> CREATE SEQUENCE MYSEQ
2 MINVALUE 1
3 START WITH 1
4 NOMAXVALUE
5 INCREMENT BY 1
6 NOCYCLE
7 CACHE 30
8 /
序列创建之后,可以通过序列对象的 CURRVAL 和 NEXTVAL 两个“伪列” 分别访问该序
列的当前值和下一个值。
代码演示:序列修改和删除
SQL> ALTER SEQUENCE MYSEQ
2 MAXVALUE 10000
3 MINVALUE -300
4 /
SEQUENCE ALTERED
SQL> DROP SEQUENCE MYSEQ;
SEQUENCE DROPPED
视图:
索引:
表空间:
语法结构:创建表空间
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:指定每个分区的统一大小。
代码演示:为某一用户指定默认表空间
SQL> CREATE USER ACONG IDENTIFIED BY ACONG
2 DEFAULT TABLESPACE MYSPACE
3 /
代码演示:为表指定表空间
SQL> CREATE TABLE SCORES
2 (
3 ID NUMBER ,
4 TERM VARCHAR2(2),
5 STUID VARCHAR2(7) NOT NULL,
6 EXAMNO VARCHAR2(7) NOT NULL,
7 WRITTENSCORE NUMBER(4,1) NOT NULL,
8 LABSCORE NUMBER(4,1) NOT NULL
9 )
10 TABLESPACE MYSPACE
11 /
代码演示:为索引指定表空间
SQL> CREATE INDEX UQ_ID ON SCORES(ID)
2 TABLESPACE MYSPACE;
九、数据库导入与导出
代码演示:exp 的交互环境
D:\>exp scott/tiger@my_orcl ①
Export: Release 10.2.0.3.0 - Production on 星期一 10月 19 17:04:14 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
输入数组提取缓冲区大小: 4096 > ②
导出文件: EXPDAT.DMP > scott.dmp ③
(2)U(用户), 或 (3)T(表): (2)U > 2 ④
导出权限 (yes/no): yes > yes ⑤
导出表数据 (yes/no): yes > yes ⑥
压缩区 (yes/no): yes > no ⑦
参数名 说明
USERID 表示“用户名/密码”。
BUFFER 数据缓冲区大小。以字节为单位,一般在 64000 以上。
FILE 指定输出文件的路径和文件名。一般以.dmp 为后缀名,注意该文件包括完整路径,但是 路径必须存在,导出命令不能自动创建路径。
COMPRESS 是否压缩导出,默认 yes。
GRANTS 是否导出权限,默认 yes
INDEXES 是否导出索引,默认 yes
DIRECT 是否直接导出,默认情况,数据先经过 Oracle 的数据缓冲区,然后再导出数据。
LOG 指定导出命令的日志所在的日志文件的位置。
ROWS 是否导出数据行,默认导出所有数据。
CONSTRAINTS 是否导出表的约束条件,默认 yes
PARFILE 可以把各种参数配置为一个文本键值形式的文件,该参数可以指定参数文件的位置。
TRIGGERS 是否导出触发器,默认值是 yes。
TABLES 表的名称列表,导出多个表可以使用逗号隔开。
TABLESPACES 导出某一个表空间的数据。
Owner 导出某一用户的数据。
Full 导出数据库的所有数据。默认值是 no
IMP 程序导入就是把 Exp 导出的文件重新导入到数据库的过程。导入时也有一些重要的
参数:
1.Fromuser:指出导出时 dmp 文件中记载的用户信息。
2.Touser:dmp 文件要导入到什么目标用户中。
3.Commit:默认是 N,在缓冲区满时是否需要 commit,如果设为 N,需要较大的回滚段。
4.Igore: Oracle在恢复数据的过程中,当恢复某个表时,该表已经存在,就要根据 ignore
参数的设置来决定如何操作。若 ignore=y, Oracle 不执行 CREATE TABLE 语句,直接
将数据插入到表中,如果插入的记录违背了约束条件,比如主键约束,则出错的记
录不会插入,但合法的记录会添加到表中。若 ignore=n, Oracle 不执行 CREATE TABLE
语句,同时也不会将数据插入到表中,而是忽略该表的错误,继续恢复下一个表。
代码演示:Imp 导入
D:\>imp system/manager file=employee.dmp fromuser=scott touser=employee
commit=y
IMP常见问题
一、数据库对象已经存在
一般情况, 导入数据前应该彻底删除目标数据下的表, 序列, 函数/过程,触发器等。
数据库对象已经存在, 按缺省的 imp 参数, 则会导入失败。
如果用了参数 ignore=y, 会把 exp 文件内的数据内容导入。
如果表有唯一关键字的约束条件, 不合条件将不被导入。
如果表没有唯一关键字的约束条件, 将引起记录重复。
二、数据库对象有主外键约束
不符合主外键约束时, 数据会导入失败。
解决办法: 先导入主表, 再导入依存表。
disable 目标导入对象的主外键约束, 导入数据后, 再 enable 它们。
三、权限不够
如果要把 A 用户的数据导入 B 用户下, A 用户需要有 imp_full_database 权限。
四、导入大表( 大于 80M ) 时, 存储分配失败
默认的 EXP 时, compress = Y, 也就是把所有的数据压缩在一个数据块上。
导入时, 如果不存在连续一个大数据块, 则会导入失败。
导出 80M 以上的大表时, 记得 compress= N, 则不会引起这种错误。
五、Imp 和 Exp 使用的字符集不同
如果字符集不同, 导入会失败, 可以改变 unix 环境变量或者 NT 注册表里 NLS_LANG 相
关信息。
六、Imp 和 Exp 版本不能往上兼容
Imp 可以成功导入低版本 Exp 生成的文件