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 导出的文件重新导入到数据库的过程。导入时也有一些重要的
参数:
Fromuser:指出导出时 dmp 文件中记载的用户信息。
Touser:dmp 文件要导入到什么目标用户中。
Commit:默认是 N,在缓冲区满时是否需要 commit,如果设为 N,需要较大的回滚段。
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 生成的文件