??xml version="1.0" encoding="utf-8" standalone="yes"?>
use mysql;
select host,user,password from user;
flush privileges
其中最内层的查?span lang="EN-US">SELECT * FROM TABLE_NAME表示不进行翻늚原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每늚范围?/span>
上面l出的这个分|询语句,在大多数情况拥有较高的效率。分늚目的是控制输出l果集大,结果尽快的q回。在上面的分|询语句中Q这U考虑主要体现?span lang="EN-US">WHERE ROWNUM <= 40q句上?/span>
选择W?span lang="EN-US">21?0条记录存在两U方法,一U是上面例子中展C的在查询的W二层通过ROWNUM <= 40来控制最大|在查询的最外层控制最倹{而另一U方式是L查询W二层的WHERE ROWNUM <= 40语句Q在查询的最外层控制分页的最值和最大倹{这是,查询语句如下Q?/span>
Ҏq两U写法,l大多数的情况下Q第一个查询的效率比第二个高得多?/span>
q是׃CBO优化模式下,Oracle可以外层的查询条g推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,W二层的查询条gWHERE ROWNUM <= 40可以被Oracle推入到内层查询中Q这样Oracle查询的结果一旦超q了ROWNUM限制条gQ就l止查询结果返回了?/span>
而第二个查询语句Q由于查询条?span lang="EN-US">BETWEEN 21 AND 40是存在于查询的第三层Q而Oracle无法第三层的查询条件推到最内层Q即使推到最内层也没有意义,因ؓ最内层查询不知道RN代表什么)。因此,对于W二个查询语句,Oracle最内层q回l中间层的是所有满x件的数据Q而中间层q回l最外层的也是所有数据。数据的qo在最外层完成Q显然这个效率要比第一个查询低得多?/span>
上面分析的查询不仅仅是针对单表的单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一h效?/span>
q里׃对包含排序的查询q行说明了。下面简单讨Z下多表联合的情况。对于最常见的等Dq接查询Q?span lang="EN-US">CBO一般可能会采用两种q接方式NESTED LOOP和HASH JOINQMERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑Q。在q里Q由于用了分页Q因此指定了一个返回的最大记录数QNESTED LOOP在返回记录数过最大值时可以马上停止q将l果q回l中间层Q而HASH JOIN必须处理完所有结果集QMERGE JOIN也是Q。那么在大部分的情况下,对于分页查询选择NESTED LOOP作ؓ查询的连接方法具有较高的效率Q分|询的时候绝大部分的情况是查询前几页的数据,靠后面的页数访问几率越)?/span>
因此Q如果不介意在系l中使用HINT的话Q可以将分页的查询语句改写ؓQ?/span>
一、选择?br />1. 单的SELECT 语句
SELECT [DISTINCT] {*,COLUMN [ALIAS], ……} FROM table_name;
字段的非唯一的结果集
DISTINCT 字段? [ ,字段?]
数字cd字段名之间可以进行算术运?br /> + - * / {?br /> 例如: (字段?*字段?)/3
合ƈ字段内容的连接字W?||
字段? || 字段?
字段可以有别?br /> SELECT 字段? [AS] '字段? 解释' FROM table;
2. 处理NULL
NULL 未定义,不可操作Q什么都不是
NULL != 0 NULL!='I格'
和NULL的Q何运都q回NULL
ORACLE里未定义的变量值都为NULL
NVL函数可把NULL转换成其它类型的W号
NVL(EXPR1, EXPR2)函数
解释: IF EXPR1=NULL RETURN EXPR2
ELSE RETURN EXPR1
~程技? NVL函数在多条g模糊查询的时候比较有?br />nvl('+input_value+','0')='0' or filed_name like '%+input_value+%'
NVL函数可返回多U数据类?
q回日期 NVL(start_date,'2002-02-01')
q回字符串 NVL(title,'no title')
q回数字 NVL(salary,1000)
3. 使用SQL*PLUSQ?Q?br />dSQL*PLUS的方?br /> 用户名,密码Q数据库q接字符?br />数据库连接字W串可以用net8 easy configuration建立本地|络服务名配|,
也可以手工编?ORACLE_HOME/network/admin/tnsnames.ora文g?br />在UNIXpȝ下不要用
$sqlplus username/password@dbname
q样别的用户?ps命o能看出用L密码
SQL> desc table; 昄表结?br />SQL> select * from tab; 查看用户下所有的?br />SQL> set pause on; 可以使大量结果集在用h“Enter?回R)后翻?br />SQL> set pagesize 100; 讑֮SQL语句q回l果集一늚行数100, 默认值是14
SQL> set linesize 100; 讑֮SQL语句q回l果集一行的宽度100, 默认值是80
3. 使用SQL*PLUSQ?QSQL*PLUS里的~辑命o
最q一条SQL命o语句存在ORACLE内存Qsql bufferQ里,但SQL*PLUS命o却不会存q去?br />SQL*PLUS里的~辑命o:
A[PPEND] text 把text增加到当前行后面
C[HANGE] /old/new/ 把当前行oldW号替换成newW号,new为空Q删除oldW号
CL[EAR] BUFF[ER] 从sql buffer里删除所有的?br /> DEL n 删除sql buffer里第n?br /> I[NPUT] text 在sql buffer后面插入text
L[IST] n 昄sql buffer里第n?br /> n 使第n行ؓ当前?br /> n text Wn行替换成text
0 text 在第一行前面插入一?/p>
3. 使用SQL*PLUSQ?Q?SQL*PLUS里的文g命o:
SAV[E] filename [REP[LACE] | APP[END] ]
把sql buffer里的SQL命o存到OS下一个文件filename,默认的文件名后缀?sql.
REP[LACE]替换filename里的SQL命o
APP[END] 把sql buffer里的SQL命od到filename?br /> GET filename 从filename里把SQL命odsql buffer
STA[RT] filename q行上次保存到文件filename里的SQL命o
@filename q行上次保存到文件filename里的SQL命o
EDIT 打开~辑H口Q编辑sql buffer里的SQL命o
EDIT filename 打开~辑H口Q编辑文件filename里的SQL命o
SPO[OL] filename [OFF | OUT] 把SQL命ol果输出到OS下一个文件filename OFFl束输出到文? OUTl束输出到文件ƈ打印文g
4. SQL*PLUS里规定字D늚昄格式
规定数字的显C格?br />SQL>column 字段?format 99999999999;
SQL>column 字段?format 999,999,999,999;
规定字符串的昄宽度
SQL>column 字段?format a数字 [word_wrapped];
说明: 一行只昄数字位的长度, 过长度折行,加word_wrapped? 单词不会折行
规定long字符的显C宽?br />SQL>set long 200;
规定字段名的昄内容
SQL> column 字段?heading '字段名显C内?;
SQL> set heading off; 查询时不昄字段名称
规定字段的对齐方?br />SQL> column 字段?justify [left | right | center];
清除字段的格式 ?br />SQL> column 字段?clear;
5. SQL*PLUS里规定字D늚昄格式例子
SQL> column last_name heading 'Employee|Name' format a15;
SQL> column salary justify right format $99,999.99;
SQL> column start_date format a10 null 'Not Hired';
说明Q如果start_date为null, 昄字符?Not Hired'
6. 判断?T/F)
(1). SQL command are always held in sql buffer. [T]
(2). SQL*PLUS command assit with query data. [T]
SQL*PLUS命o只控制SELECTl果集的昄格式及控制文?只有SQL命o能访问数据库.
二、限刉择?br />1. 按指定的规则排序
SELECT expr FROM table [ORDER BY {column, expr} [ASC | DESC] ];
默认的排序是ASC升序(由小到大)
q可以ORDER BY 字段名的位置[1]| [2] ASC| DESC;
当字D名很复杂或者是术表达式时用字D名昄的位|排序很方便.
2. 用WHERE限制选择?1)
比较操作W? > < >= <= != <> ^= 与NULL比较不能用上面的比较操作W ANY SOME ALL
SQL操作W BETWEEN ?AND… IN LIKE IS NULL
NOT BETWEEN ?AND? NOT IN NOT LIKE IS NOT NULL
逻辑操作W AND OR NOT
3. 用WHERE限制选择?2)
比较序(可以用括h变它们的序)
(1). = < > >= <= in like is null between
(2). and
(3). Or
注意: char和varchar2的比较规则有不同:
char比较时会忽略字符串后面的I格. varchar2会计字W串后面的空?/p>
4. LIKE操作
% 零到L多个字符 _ 一个字W?br />例如: 字段?like 'M%' 字段?like '%m%' 字段?like 'job_'
如果要找含下划线的字W? 要加反斜U ?例如:字段?like '%X/_Y%' escape '/'
5. 日期字段的比?br />举例:
日期字段 between to_date('2001-12-12','YYYY-MM-DD') and to_date('2002-02-01','YYYY-MM-DD')
日期字段> to_date('2001-12-12','YYYY-MM-DD') and日期字段<= to_date('2002-02-01','YYYY-MM-DD');
6. 不能用到索引的比较操作符
IS NULL
IS NOT NULL
LIKE '%m%'
三、单行函?br />1. 数字函数
ABS 取绝对值 POWER 乘方 LN 10为底数取?br />SQRT qx根 EXP e的nơ乘方?LOG(m,n) m为底数n取冪
数学q算函数:ACOS ATAN ATAN2 COS COSH SIGN SIN SINH TAN TANH
CEIL 大于或等于取整数
FLOOR 于或等于取整数
MOD 取余敊W ?br />ROUND(n,m) 按m的位数取四舍五入值如果round(日期): 中午12以后是明天的日? round(sysdate,'Y')是年的第一?br />TRUNC(n,m) 按m的位数取前面的数值如果trunc(日期), 省的是L旉
2. 字符函数
CHR 按数据库的字W集由数字返回字W?
CONCAT(c1,c2) 把两个字Wc1,c2l合成一个字W? ?|| 相同
REPLACE(c,s,r) 把字Wc里出现s的字W替换成r, q回新字W?
SUBSTR(c,m,n) m大于0,字符c从前面m处开始取n位字W?m{于0?一?
m与0,字符c从后面m处开始取n位字W?br />TRANSLATE(c,f1,t1) 字符c按f1到t1的规则{换成新的字符?br />INITCAP 字符首字母大?其它字符写
LOWER 字符全部写
UPPER 字符全部大写
LTRIM(c1,c2) L字符c1左边出现的字Wc2
RTRIM(c1,c2)
TRIM(c1,c2) L字符c1左右两边的字Wc2
LPAD(c1,n,c2) 字符c1按制定的位数n昄不的位数用c2字符串替换左边的IZ
RPAD(c1,n,c2)
3. 日期函数
ADD_MONTHS(d,n) 日期值加n?br />LAST_DAY(d) q回当月的最后一天的日期
MONTHS_BETWEEN(d1,d2) 两个日期值间的月?d1<d2 q回负数
NEXT_DAY(d) q回日期g一天的日期
SYSDATE 当前的系l时?br /> DUAL是SYS用户下一个空表,它只有一个字Ddummy
4. 转换函数(1)
TO_CHAR(date,'日期昄格式')
TO_CHAR(number) 用于昄或报表的格式寚w
TO_DATE(char,'日期昄格式')
TO_LOB 把long字段转换成lob字段
TO_NUMBER(char) 用于计算或者比较大?
4. 转换函数(2)
to_date里日期显C格?br /> YYYY qbYEAR YYY YY Y
Q 季度
MM 月 MONTH MON
W 星期 (week of month) WW, IW (week of year)
(说明Q周计是按ISO标准,??日的星期数到后面七天Z?不一定是从周一到周?
DD 日 DAY DY
HH24 时 HH12 HH
MI 分钟
SS U?br />如果惛_定日期的昄格式可以在数据库的参数文件initorasid.ora里新写一行参敊WNLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX环境变量或者NT的注册表里的讄 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss
4. 转换函数(3)
如果惛_定日期的昄格式可以用alter session命o改变
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
它的作用序如下:
initialization parameter
Environment variable
ALTER SESSION command
4. 转换函数 (4)
to_char(number)里数字显C格?br /> 9 数字?br /> 0 数字前面? to_char(-1200,'00000.00')
. 数点的位置
, 标记位置的逗号 用在数字昄格式的左边 ?br /> L Ҏ数据库字W集加货币符号 to_char(-1200,'L9999.99')
B 把数?昄为空?用在数字昄格式的右?br />
MI 双的负数标? to_char(-1200,'9999.99MI')
PR 括v来的负数 to_char(-1200,'9999.99PR')
EEEE 用指数方式表C ? to_char(-1200,'9999.99EEEE')
5. 输入字符,q回数字的函?br />instr(c1,c2) 字符c2出现在c1的位|? 不出? q回0, 常用于模p查?br />length(c) 按数据库的字W集,出字符c的长?跟数据库的字W集有关, 一个汉字长度ؓ1
6. 有逻辑比较的函数NVL(EXPR1, EXPR2)函数
解释: IF EXPR1=NULL RETURN EXPR2
ELSE RETURN EXPR1
DECODE(AAHV1HR1HV2HR2....)函数
解释: IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..?br /> ELSE
RETURN NULL
举例: decode(id,1,'dept sale',2,'dept tech')
四、从多个表里选取数据记录
1. 数据表间的连?br />单的q接语法:
SELECT 字段?, 字段?, …?FROM 表名1, [表名2, ……]
WHERE 表名1.字段?= 表名2. 字段?[ AND ……] ;
SELECT 字段?, 字段?, …?FROM 表名1, [表名2, ……]
WHERE 表名1.字段?= 表名2. 字段?+) [ AND ……] ;
?+)L字段位置自动补空?
q接的分c?
{于的连接?=
不等于的q接 != BETWEEN ?AND … IN 注意IN和OR不能一L
外连接 有一个字D名(+) , 没有满的条件补I值?br /> 自连接 同一个表自己跟自p接 例如找重复记录
2. 数据表间的连接例?br />删除table_name表里字段名email重复的记?
SQL>delete from table_name t1
where t1.rowid >
(select min(rowid) from table_name t2
where t1.email = t2.email
group by email
having count(email) > 1);
扑ֈ手机用户的服务区?
SQL> select a.handphoneno,nvl(c.name,'null'),a.totalscore
from topscore a,chargeoperator cc,chargeoperatorinfo c
where substr(a.handphoneno,1,7)=cc.hpnohead(+)
and cc.chargetype=c.chargetype(+)
order by a.totalscore desc;
3. 数据表间的连接技?br />q接N个表, 需要N-1个连接操?br />被连接的表最好徏一个单字符的别? 字段名前加上q个单字W的别名
BETWEEN .. AND.. 比用 >= AND <= 要好
q接操作的字D名上最好要有烦?br />q接操作的字D|好用整数数字cd
有外q接? 不能用OR或IN的比较操?/p>
4. 如何分析和执行SQL语句
写多表连接SQL语句时要知道它的分析执行计划的情?
Sys用户下运行@/ORACLE_HOME/sqlplus/admin/plustrce.sql
产生plustrace角色
Sys用户下把此角色赋予一般用?SQL> grant plustrace to &username;
一般用户下q行@/ORACLE_HOME/rdbms/admin/utlxplan.sql
产生plan_table
SQL> set time on; 说明Q打开旉昄
SQL> set autotrace on; 说明Q打开自动分析l计Qƈ昄SQL语句的运行结?br />SQL> set autotrace traceonly; 说明Q打开自动分析l计Q不昄SQL语句的运行结?br />接下来你p行测试SQL语句Q看到其分析l计l果了?br />一般来Ԍ我们的SQL语句应该避免大表的全表扫描?br />SQL> set autotrace off; 说明Q关闭自动分析统?/p>
五、集合函敊W经常和group by一起?
1. 集合函数列表
AVG (DISTINCT | ALL | N) 取^均?br />COUNT (DISTINCT | ALL | N | expr | * ) l计数量
MAX (DISTINCT | ALL | N) 取最大?br />MIN (DISTINCT | ALL | N) 取最?br />SUM (DISTINCT | ALL | N) 取合计?br />STDDEV (DISTINCT | ALL | N) 取偏差?如果l里选择的内定w相同,l果?
VARIANCE (DISTINCT | ALL | N) 取^方偏差?/p>
2. 使用集合函数的语?br />SELECT column, group_function FROM table
WHERE condition GROUP BY group_by_expression
HAVING group_condition ORDER BY column;
3. 使用count时的注意事项
SELECT COUNT(*) FROM table;
SELECT COUNT(帔R) FROM table;
都是l计表中记录数量,如果没有PK后者要好一?br />SELECT COUNT(all 字段? FROM table;
SELECT COUNT(字段? FROM table;
不会l计为NULL的字D늚数量
SUM,AVG旉会忽略ؓNULL的字D?/p>
4. 用group by时的限制条g
SELECT字段名不能随? 要包含在GROUP BY的字D里
GROUP BY后ORDER BY时不能用位置W号和别?br /> 限制GROUP BY的显C结? 用HAVING条g
5. 例子
SQL> select title,sum(salary) payroll from s_emp
where title like 'VP%' group by title
having sum(salary)>5000 order by sum(salary) desc;
扑և某表里字D重复的记录? q显C?br />SQL> select (duplicate field names) from table_name
group by (list out fields) having count(*)>1;
6. 判断?T/F)
(1) Group functions include nulls in calculations [F]
(2) Using the having clause to exclude rows from a group calculation [F]
解释:
Group function 都是忽略NULL值的 如果您要计算NULL? 用NVL函数
Where语句在Group By前把l果集排除在外Having语句在Group By后把l果集排除在?/p>
7. 在SQL*PLUS里可使用的其它命?
Ctrl^C l止正在q行的SQL语句
remark /*...*/ -- 注释W号
HOST 可执行的操作pȝ下的命o 有些unix可以?!
BREAK ON column_name SKIP n [ ON column_name SKIP n ]
按字D늚名称column_name分隔昄,更清?SKIP n 是在分隔处空行的数量n
BREAK ON ROW SKIP n 每一行间隔都放n个空?/p>
COMPUTE 集合q算W?OF 字段1 ON 字段2 按字D?对字D?q行集合q算
COMPUTE后面可以跟的集合q算W?
SUM MINIMUM MAXIMUM AVG STD VARIANCE COUNT NUMBER
8.在SQL*PLUS里可使用的其它命令D?(scott用户)
BREAK ON REPORT
COMPUTE SUM LABEL TOTAL OF SAL ON REPORT 在全部结果集后面合?br /> select ename,sal from emp where job='SALESMAN';
COMPUTE AVG LABEL avg OF SAL ON REPORT 在全部结果集后面^均?br /> / 再次执行上次的sql语句
break on DEPTNO skip 2 on JOB skip 1 在BREAK字段l果集后面算合计
COMPUTE SUM OF SAL ON DEPTNO
SELECT DEPTNO,JOB,ENAME,SAL FROM EMP ORDER BY DEPTNO,JOB;
SQL> CLEAR BREAKS; 清除讄的BREAK条g
SQL> CLEAR COMPUTES; 清除讄的COMPUTE条g
六、子查询
1. 查询语句可以嵌套
例如: SELECT …?FROM (SELECT …?FROM表名1, [表名2, ……] WHERE 条g) WHERE 条g2;
2. 何处可用子查?
当查询条件是不确定的条g?br />DML(insert, update,delete)语句里也可用子查?br />HAVING里也可用子查?/p>
3. 两个查询语句的结果可以做集合操作
例如:
qUNION(L重复记录)
qUNION ALL(不去掉重复记?
差集MINUS,
交集INTERSECT
4. 子查询的注意事项
先执行括号里面的SQL语句Q一层层到外?br />内部查询只执行一?br />如果里层的结果集q回多个Q不能用= > < >= <={比较符要用IN.
5. 子查询的例子(1)
SQL> select title,avg(salary) from s_emp
group by title Having avg(salary) =
(select min(avg(salary)) from s_emp
group by title);
扑ֈ最低^均工资的职位名称和工?/p>
5. 子查询的例子(2)
子查询可以用父查询里的表?br />q条SQL语句是对?
SQL>select cty_name from city where st_code in
(select st_code from state where st_name='TENNESSEE' and
city.cnt_code=state.cnt_code);
说明Q父查询调用子查询只执行一ơ.
6.取出l果集的80 ?00的SQL语句
ORACLE处理每个l果集只有一个ROWNUM字段标明它的逻辑位置,
q且只能 用ROWNUM<100, 不能用ROWNUM>80?br />以下是经q分析后较好的两UORACLE取得l果?0?00间的SQL语句( ID是唯一关键字的字段?)Q?
语句写法Q?
SQL>select * from (
( select rownum as numrow, c.* from (
select [field_name,...] from table_name where 条g1 order by 条g2) c)
where numrow > 80 and numrow <= 100 )
order by 条g3;
七、在执行SQL语句时绑定变?br />1. 接收和定义变量的SQL*PLUS命o
ACCEPT
DEFINE UNDEFINE
&
2. l定变量SQL语句的例?1)
SQL> select id, last_name, salary from s_emp where dept_id = &department_number;
Enter value for department_number: 10
old 1: select id, last_name, salary from s_emp where dept_id=&department_number;
new 1: select id, last_name, salary from s_emp where dept_id= 10
SQL> SET VERIFY OFF | ON;可以关闭和打开提示认信息old 1和new 1的显C?
3. l定变量SQL语句的例?2)
SQL> select id, last_name, salary
from s_emp
where title = '&job_title';
Enter value for job_title: Stock Clerk
SQL> select id, last_name, salary
from s_emp
where hiredate >to_date( '&start_hire_date','YYYY-MM-DD');
Enter value for start_hire_date : 2001-01-01
把绑定字W串和日期类型变量时Q变量外面要加单引号
也可l定变量来查询不同的字段?br />输入变量值的时候不要加;{其它符?/p>
4. ACCEPT的语法和例子
SQL> ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE]
说明Q variable 指变量名 datatype 指变量类型,如number,char{ format 指变量显C格式 prompt text 可自定义弹出提示W的内容text hide 隐藏用户的输入符?br />使用ACCEPT的例子:
ACCEPT p_dname PROMPT 'Provide the department name: '
ACCEPT p_salary NUMBER PROMPT 'Salary amount: '
ACCEPT pswd CHAR PROMPT 'Password: ' HIDE
ACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):?/p>
4. DEFINE的语法和例子
SQL> DEFINE variable = value
说明Q variable 指变量名 value 指变量?br />定义好了变良值后, 执行l定变量的SQL语句时不再提C入变?br />使用DEFINE的例子:
SQL> DEFINE dname = sales
SQL> DEFINE dname
DEFINE dname = “sales?(CHAR)
SQL> select name from dept where lower(name)='&dname';
NAME
-------------------------
sales
sales
SQL> UNDEFINE dname
SQL> DEFINE dname
Symbol dname is UNDEFINED
5. SQL*PLUS里传递参数到保存好的*.sql文g?br />SQL> @ /路径?文g名?参数?[,参数?, ?]
SQL> start /路径?文g名?参数?[,参数?, ?]
注意事项:
一ơ最多只能获??amp;变量, 变量名称只能是从&1,&2?amp;9
变量名后不要加特D的l束W号
如果在SQL*PLUS里要?amp;W号保存在ORACLE数据库里,要修改sql*plus环境变量define
SQL> set define off;
八、概q数据模型和数据库设?br />1. pȝ开发的阶段:
Strategy and Analysis
Design
Build and Document
Transition
Production
2. 数据模型
Model of system in client's mind
Entity model of client's model
Table model of entity model
Tables on disk
3. 实体关系模型 (ERM)概念
ERM ( entity relationship modeling)
实体 存有特定信息的目标和事g 例如: 客户,订单{?br />属性 描q实体的属性 ?例如: 姓名,电话L{?br />关系 两个实体间的关系 例如:订单和品等
实体关系模型图表里的U定
Dashed line (虚线) 可选参?“may be?br />Solid line (实线) 必选参?“must be?br />Crow's foot (多线) E度参数 “one or more?br />Single line (单线) E度参数 “one and only one?/p>
4. 实体关系模型例子
每个订单都必L一个或几个客户
每个客户可能是一个或几个订单的申误?/p>
5. 实体关系的类?br />1:1 一对一 例如: 的士和司机?
M:1 多对一 例如: 乘客和飞?br />1:M 一对多 例如: 员工和技?/p>
6. 校正实体关系的原?br />属性是单一值的, 不会有重?br />属性必M存于实体, 要有唯一标记
没有非唯一属性依赖于另一个非唯一的属?br />7. 定义l构时的注意事项
减少数据冗余
减少完整性约束生的问题
认省略的实?关系和属?/p>
8. 完整性约束的要求
Primary key d键字 唯一非NULL
Foreign key 外键 依赖于另一个Primary key,可能为NULL
Column 字段名 符合定义的cd和长?br />Constraint U束条g 用户自定义的U束条g,要符合工作流要求
例如: 一个销售h员的提成不能过它的基本工资
Candidate key 候选主关键字 多个字D名可组成候选主关键? 其组合是唯一和非NULL?/p>
9. 把实体关pd映射到关pL据库对象的方?br />把简单实体映到数据库里的表
把属性映到数据库里的表的字D? 标明cd和注?br />把唯一标记映射到数据库里的唯一关键?br />把实体间的关pL到数据库里的外?/p>
其它的考虑:
设计索引,使查询更?br />建立视图,使信息有不同的呈现面, 减少复杂的SQL语句
计划存储I间的分?br />重新定义完整性约束条?/p>
10. 实体关系NW号的含?br />PK 唯一关键字的字段
FK 外键的字D?br />FK1,FK2 同一个表的两个不同的外键
FK1,FK1 两个字段共同l成一个外?br />NN 非null字段
U 唯一字段
U1,U1 两个字段共同l成一个唯一字段
九、创
1. ORACLE常用的字D늱?br />ORACLE常用的字D늱型有
VARCHAR2 (size) 可变长度的字W串, 必须规定长度
CHAR(size) 固定长度的字W串, 不规定长度默认gؓQ?br /> NUMBER(p,s) 数字型p是位数总长? s是小数的长度, 可存负数
最?8? 不够位时会四舍五?
DATE 日期和时间类?
LOB 长字符, 最大可?G
CLOB 长文本字符串?br /> BLOB 长二进制字W串
BFILE 长二进制字W串, 保存在数据库外的文g里是只读?
数字字段cd位数及其四舍五入的结?br />原始数?234567.89
数字字段cd位数 存储的?br />Number 1234567.89
Number(8) 12345678
Number(6) ?br />Number(9,1) 1234567.9
Number(9,3) ?br />Number(7,2) ?br />Number(5,-2) 1234600
Number(5,-4) 1230000
Number(*,1) 1234567.9
2. 创徏表时l字D加默认?和约束条?br />创徏表时可以l字D加上默认?br />例如 : 日期字段 DEFAULT SYSDATE
q样每次插入和修Ҏ, 不用E序操作q个字段都能得到动作的时?
创徏表时可以l字D加上约束条?br />例如: 非空 NOT NULL
不允讔R? UNIQUE
关键? PRIMARY KEY
按条件检查 CHECK (条g)
外键 REFERENCES 表名(字段?
3. 创徏表的例子
CREATE TABLE DEPT(
EPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2(14),
LOC VARCHAR2(13)) ;
CREATE TABLE region(
ID number(2) NOT NULL PRIMARY KEY,
postcode number(6) default '0' NOT NULL,
areaname varchar2(30) default ' ' NOT NULL);
4. 创徏表时的命名规则和注意事项
表名和字D名的命名规则:必须以字母开_可以含符号A-Z,a-z,0-9,_,$,#
大小写不区分
不用SQL里的保留? 一定要用时可用双引h字符串括hQ?br />用和实体或属性相关的英文W号长度有一定的限制
注意事项:
时可以用中文的字D名, 但最好还是用英文的字D名
创徏表时要把较小的不为空的字D|在前? 可能为空的字D|在后?br />时如果有唯一关键字或者唯一的约束条Ӟ时自动徏了烦?br />一个表的最多字D个C是有限制的,254?
5. U束名的命名规则和语?br />U束名的命名规则U束名如果在的时候没有指明,pȝ命名规则是SYS_Cn(n是数?
U束名字W串的命名规则同于表和字D名的命名规?/p>
6. 使用U束时的注意事项
U束里不能用pȝ函数,如SYSDATE和别的表的字D|?br />可以用本表内字段的比?/p>
惛_事务处理? 做约束的?br />SQL> alter session set constraints deferred.
7. 由实体关pd到创的例子 ?s_dept
前提条g:已有region表且含唯一关键字的字段id
SQL> CREATE TABLE s_dept
(id NUMBER(7)
CONSTRAINT s_dept_id_pk PRIMARY KEY,
name VARCHAR2(25)
CONSTRAINT s_dept_name_nn NOT NULL,
region_id NUMBER(7)
CONSTRAINT s_dept_region_id_fk REFERENCES region (id),
CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));
8. 较复杂的创徏表例?br />SQL> CREATE TABLE s_emp
(id NUMBER(7)
CONSTRAINT s_emp_id_pk PRIMARY KEY,
last_name VARCHAR2(25)
CONSTRAINT s_emp_last_name_nn NOT NULL,
first_name VARCHAR2(25),
userid VARCHAR2(8)
CONSTRAINT s_emp_userid_nn NOT NULL
CONSTRAINT s_emp_userid_uk UNIQUE,
start_date DATE DEFAULT SYSDATE,
comments VARCHAR2(25),
manager_id NUMBER(7),
title VARCHAR2(25),
dept_id NUMBER(7)
CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id),
salary NUMBER(11,2),
commission_pct NUMBER(4,2)
CONSTRAINT s_emp_commission_pct_ck CHECK
(commission_pct IN(10,12.5,15,17.5,20)));
8. 通过子查询徏?br />通过子查询徏表的例子
SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date
FROM s_emp WHERE dept_id = 41;
SQL> CREATE TABLE A as select * from B where 1=2;
只要表的l构.
10. 用子查询的注意事?br />可以兌多个表及用集合函数生成新?注意选择出来的字D必L合法的字D名U?且不能重复?br />用子查询方式建立的表Q只有非INOT NULL的约束条件能l承q来, 其它的约束条件和默认值都没有l承q来.
Ҏ需要,可以用alter table add constraint ……再建立其它的约束条Ӟ如primary key{?
10. Foreign Key的可选参数ON DELETE CASCADE
在创建Foreign Key时可以加可选参?
ON DELETE CASCADE它的含义是如果删除外键主表里的内容,子表里相关的内容一赯删除.
如果没有ON DELETE CASCADE参数Q子表里有内容,父表里的d键字记录不能被删除掉.
12. 如果数据库表里有不满的记录存在Q徏立约束条件将不会成功.
13. l表创徏和删除同义词的例?br />SQL> CREATE SYNONYM d_sum
2 FOR dept_sum_vu;
SQL> CREATE PUBLIC SYNONYM s_dept
2 FOR alice.s_dept;
SQL> DROP SYNONYM s_dept;
十、ORACLE里的数据字典
1. 什么是数据字典ORACLE的数据字典是数据库的重要l成部分之一Q它随着数据?br /> 的生而? 随着数据库的变化而变? 体现为sys用户下所有的一些表和视?
2. 数据字典里存了以下内容:用户信息
用户的权限信?br /> 所有数据对象信息表的约束条件统计分析数据库的视囄
不能手工修改数据字典里的信息.
3. 常用的数据字?br />Dictionary 存放所有数据表Q视图,同义词名U和解释
Dict_columns 数据字典里字D名U的和解?br />Dba_users 用户 Dba_tablespaces 表空?br />Dba_data_files 数据库的文g Dba_free_space I闲表空?br />Dba_rollback_segs 回滚D?br />User_objects 数据对象 User_constraints U束条g
User_sequences 序列号 User_views 视图
User_indexes 索引 User_synonyms 同义?br />Session_roles 用户的角色 User_role_privs 用户的角色权?br />User_sys_privs 用户的系l权限 User_tab_privs 用户的表U权?br />V$session 实时用户情况 V$sysstat 实时pȝl计
V$sesstat 实时用户l计 V$sgastat 实时SGA使用
V$locked_object 实时锁 V$controlfile 控制文g
V$logfile 日志文g V$parameter 参数文g
4. 数据字典的分c?br />数据字典四大cd
User_ 用户下所有数据库对象
All_ 用户权限范围内所有的数据库对?br />Dba_ 所有的数据库对?br />V$ l计分析数据库的视图 赋于oem_monitor权限非DBA用户也可查询V$*视图
5. 查询数据字典
SQL> select * from dictionary where instr(comments,'index')>0;
SQL> select constraint_name, constraint_type,
2 search_condition, r_constraint_name
3 from user_constraints
4 where table_name = ?amp;table_name';
十一. 控制数据
1 、INSERT(往数据表里插入记录的语?
SQL> insert into 表名(字段?, 字段?, …? values ( ?, ?, …?;
SQL> insert into 表名(字段?, 字段?, …? select (字段?, 字段?, …?
from 另外的表?where 条g;
可以?amp;标记变量的方法多ơ输入记?/p>
快速插入数据的Ҏ, 一般用于大?28M的数据{U?br />SQL> insert /*+ append */ into 表名
select * from 另外的用户名 .另外的表?WHERE 条g;
SQL> commit;
注意事项Q?br /> 用INSERT /*+ APPEND */ 的方法会对target_tablename产生U别?的独占锁Q?br /> 如果q行此命令时q有对target_tablename的DML操作会排队在它后?
对OLTPpȝ在用的表操作是不合适的?/p>
2. 插入字符串类型的字段的注意事?
字符串类型的字段值必ȝ单引hh, 例如: ’GOOD DAY?
如果字段值里包含单引号?需要进行字W串转换, 我们把它替换成两个 ?单引号??br />字符串类型的字段Dq定义的长度会出? 最好在插入前进行长度校?
‘?标记是NULL, user 标明当前用户
日期字段的字D值可以用当前数据库的pȝ旉SYSDATE, _到秒
用字W串转换成日期型函数TO_DATE(?001-08-01?’YYYY-MM-DD?
TO_DATE( )q有很多U日期格? 可以参看ORACLE DOC.
q???时:分钟:U?的格式YYYY-MM-DD HH24:MI:SS
INSERT时最大可操作的字W串长度于{于4000个单字节,
如果要插入更长的字符? 误虑字段用CLOBcd, Ҏ借用ORACLE里自带的DBMS_LOBE序?
3、UPDATE (修改数据表里记录的语?
SQL> UPDATE 表名 SET 字段?=?, 字段?=?, …? WHERE 条g;
如果修改的值N没有赋值或定义? 把原来的记录内Ҏ为NULL,
最好在修改前进行非I校?
值N过定义的长度会出错, 最好在插入前进行长度校?
新功能,可以修改子查询后的结果集
例子QSQL> update (select * from s_dept) set id=50 where id=60;
4、DELETE (删除数据表里记录的语?
SQL> DELETE FROM 表名 WHERE 条g;
注意Q删除记录ƈ不能释放ORACLE里被占用的数据块表空? 它只把那些 ?被删除的数据块标成unused.
如果实要删除一个大表里的全部记? 可以?TRUNCATE 命o, 它可以释攑֍用的数据块表I间
SQL> TRUNCATE TABLE 表名;
此操作不可回退.
5?SQL语句的分c?br />数据定义语言(DDL)Qcreate、alter、dropQ创建、修改结构、删除)Q其他:renameQ?br />数据操纵语言(DML)Qinsert、delete、select、updateQ增、删、查、改Q(其他QtruncateQ?
数据控制语言(DCL)Qgrant、revokeQ授权、回Ӟ、set role
事务控制Qcommit、rollback、savepointQ其他:lock table、set constraint(s)、set transactionQ?br />审计控制Qaudit、noaudit
pȝ控制Qalter system 会话控制Qalter session
其他语句QcommentQ添加注释)、explain plan、analyze、validate、call
6、ORACLE里事务控制?
Commit 提交事务
Rollback 回退事务
Savepoint 讄断点, 在事务中标记位置, 事务l束, 断点释放
事务l束的情况遇到commit或者rollback遇到DDL和DCL语句发现错误Q如死锁用户退出SQL*PLUSpȝ重启或崩?/p>
6、事物控制和SAVEPOINT命o
7. DML操作的注意事?
以上SQL语句对表都加上了行? 认完成? 必须加上事物处理l束的命令COMMIT 才能正式生效,
否则改变不一定写入数据库?行锁也未能得到释放.
如果x回这些操? 可以用命?ROLLBACK 复原.
在运行INSERT, DELETE ?UPDATE 语句前最好估一下可能操作的记录范围,
应该把它限定在较?(一万条记录) 范围?. 否则ORACLE处理q个事物用到很大的回退D?
E序响应慢甚臛_d? 如果记录C十万以上q些操作,
可以把这些SQL语句分段分次完成, 光加上COMMIT 认事物处理.
太过频繁的commit不好
十二、改变表和约束条?
1. 改变表的几种情况(1) q行时会加表U锁
改变表的名称
SQL> RENAME 表名1 TO 表名2; SQL> ALTER TABLE 表名1 RENAME TO 表名2;
在表的后面增加一个字D?
SQL> ALTER TABLE 表名 ADD 字段?字段名描q? [ DEFAULT expr ][ NOT NULL ][ ,字段? ……];
修改表里字段的定义描q?
SQL> ALTER TABLE 表名 MODIFY 字段? 字段?描述 [ DEFAULT expr ][ NOT NULL ][ ,字段? ……]; 记录为空Ӟ可以减少字段长度Q改变字D늱型修改DEFAULT值只作用于修改后的INSERT和UPDATE的记录修改NOT NULLU束只对现存含非I录的字段起作?/p>
1. 改变表的几种情况(2) q行时会加表U锁
删除表里的某个字D?br />SQL> ALTER TABLE 表名 DROP 字段?
l表里的字段加上/止/启用U束条g
SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT U束?PRIMARY KEY (字段?[,字段? ……]);
SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT U束?UNIQUE (字段?[,字段? ……]);
加唯一关键字或者唯一U束条g时自动徏立烦?br />说明Q禁止唯一关键字和唯一U束时烦引仍然存在,可以被?
1. 改变表的几种情况(3) q行时会加表U锁
删除表里的约束条?br />SQL> ALTER TABLE 表名 DROP CONSTRAINTS U束?[CASCADE];
会把U束相关的烦引一起删? CASCADE能同时删d键的U束条g.
把表攑֜或取出数据库的内存区
SQL> ALTER TABLE 表名 CACHE;
SQL> ALTER TABLE 表名 NOCACHE;
改变表存储的表空?br />SQL> ALTER TABLE 表名 MOVE TABLESPACE 表空间名 ;
注意: 如果被{U表I间的表含有索引, 表{Ud索引变得不可?
我们要删除旧索引,建立新烦?/p>
2. 删除表及表里的数?br />删除?br />SQL> DROP TABLE 表名 [CASCADE CONSTRAINTS];
清空表里的记?br />SQL> TRUNCATE TABLE 表名;
按时间清I日志表里的记录Q用重新命名的Ҏ(应用E序可能有短暂出? 可以选择在不J忙的时间执?
按原来表A的徏表语句创建新表A1,
把表A重命名ؓA2Q如果表A上有较频J的DML操作,会对表加上行U锁Q重命名q程用递归的方式@环做Q直到DML操作l束Q命名成?.
把创建新表A1重命名ؓA
历史记录表A2备䆾或删?/p>
3. 删除表后应该注意的问?br />删除表后把表里的索引一起删?
删除表后会结束基于它的悬而未决的事物
删除表后Ҏ表创建的views,synonym,stored procedure,stored function依然存在Q但views,synonym变成非法? 需要手工找出它们ƈ删除.
如果用了CASCADE CONSTRAINTS会把与它相关的约束一起删?br />此操作不可回退
4. l表加注?
加注释的语法
SQL> COMMENT ON TABLE 表名 | COLUMN表名.字段?IS ‘text?br />加注释的例子
SQL> comment on table s_emp is ‘Enployee information?
SQL> comment on column s_emp.last_name is ‘?
关于注释的数据库字典
ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS
十三、创建序列号
1. 创徏序列号里各参数的解释
SQL> CREATE SEQUENCE name [INCREMENT BY n]
[START WITH n] [{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
INCREMENT BY n 一ơ增长n 个数?br />NOMAXVALUE ~省?0E+27
NOMINVALUE ~省?
NOCYCLE 不@? 常用于唯一关键?br />CACHE n 在内存里~存n个序?出错回退时会丢失
oracle8i里默认的n?0
序列L名称一般可以采用“表名_字段名”的命名规则
2. 插入自动增长序列号字D늚Ҏ
INSERT时如果要用到?开始自动增长的数字做唯一关键? 应该先徏立一个序列号.
CREATE SEQUENCE 序列L名称 (最好是表名+序列h? INCREMENT BY 1 START WITH 1 MAXVALUE 99999 NOCYCLE NOCACHE;
其中最大的值按字段的长度来?比如定义的自动增长的序列NUMBER(6) , 最大gؓ999999
INSERT 语句插入q个字段gؓ: 序列L名称.NEXTVAL
例子: SQL> insert into s_dept(id, name, region_id) values (s_dept_id.nextval, 'finance', 2);
1 row created.
只有q行了序列号的名U? nextval后序列号的名U? currval 才有效才有?
3. 查询序列L情况
SQL> select sequence_name, min_value, max_value, increment_by, last_number from user_sequences;
其中last_number指的是序列号的下一个?
4. 改变序列?br />SQL> ALTER SEQUENCE sequence [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];
注意: 不能改变它的起始?br /> 如果要改变序列的起始? 先把序列号删除掉, 再新Z?
5. 删除序列?br />SQL>DROP SEQUENCE sequence;
6. 不能用序列号的nextval和currval的地?/p>
视图的查?br />有distinct的查?br />有group by,having,order by的查?br />有子查询的查?br />表里的缺省?/p>
十四、创?
1. 视图的概念和优点
视图是基于一个或多个表及视图的一些查询语? 它象昄数据的视H? 它本w是不存储数据的.
视图可以限制数据库的讉K, 更好的控制权?br />使用户用简单的查询语句
数据的非依赖?br />同一数据的不同表现Ş?/p>
2. 创徏视图的语?br />SQL> CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
参数解释:
FORCE 表不存在?视图仍然可以创徏成功
WITH CHECK OPTION 只有W合视图定义的记录才能被插入或修?br />WITH READ ONLY 不允许DML操作
Oracle8i以后创徏视图可以用order by
3. 创徏修改视图的例?br />SQL> CREATE OR REPLACE VIEW salvu41 AS SELECT id, first_name FIRST,
last_name LAST, salary MONTHLY_SALARY
FROM s_emp WHERE dept_id = 41;
SQL> CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.name, MIN(e.salary), MAX(e.salary), AVG(e.salary) FROM s_emp e, s_dept d WHERE e.dept_id = d.id GROUP BY d.name;
注意: 如果用select * from table_name创徏的视?br /> table_name的结构改变后 view要重建或compile后才能显C新的字D内?/p>
4. 查询视图的数据字?br />SQL> set long 1600;
SQL> select view_name,text from user_views;
说明: 可以Ҏ视图text_length来设|set long 数字;
User_updatable_columns视图能查询视N能被修改的字D?/p>
5. 单和复杂的视囑֯?br />特 ?? 单视图 复杂视?
表的数量 一? 多个
有函数吗? 没有 ?
有分l操作吗? 没有 ?
有基于视囄DML操作? ? 没有
6. 在视图上可以用DML命o?
可以, 但有一定的限制条g
没有下面的情? 可以删除view里的记录. group function, group by, distinct
没有上面和下面的情况, 可以修改view里的记录. 字段表达?
例如: salary*12 含rownum的view
没有上面两种情况, 且view里含里所有非I字D늚情况, 可以往view里插入记?
7. 在视N使用 WITH CHECK OPTIONU束条g
SQL> create or replace view empvu41
as select * from s_emp where dept_id = 41
with check option constraint empvu41_ck;
如果q行下面命o会出错ora-01402
SQL> update empvu41 set dept_id=42 where id=16;
原因: 视图empvu41里规定只能看部门号ؓ41的记录 修改后会把记录排除在视图empvu41以外
与它的约束条件冲H?/p>
8. 删除视图
SQL> DROP VIEW view_name;
十五、创建烦?/p>
1.索引的概?br />索引是数据库里的一U数据对?br />它利用B*? hash, bitmapl构直接快速地讉K数据
它和表是分开存放的两个实?br />索引创徏好了? ql自动调用和理
2. 什么时候创建烦?
自动创徏的烦?唯一关键? 唯一的约束条?br />手工需要创建的索引:大表查询? sql语句where后经常用到的字段或字D늻?br /> 字段内容差别很大有大量NULLD很大, q回记录数较?
3. B*树烦引的l构 每个索引由字D值和指针或ROWIDl成
4.创徏索引的语?br />CREATE INDEX 索引?ON 表名 ( 字段1, [字段2, ……] ) TABLESPACE 表空间名;
5.创徏索引的注意事?br /> 创徏索引时会加行U独占锁
一个表的烦引最好不要超q三?(Ҏ的大表除?
最好用单字D늃?br /> 索引最好和表分不同的表I间存放
l合SQL语句的分析执行情? 也可以徏立多字段的组合烦引和Z函数的烦?
大表的烦引会占用很大的存储空?br /> 不要建唯一的烦? 而应该加唯一的约束条?/p>
6.查询索引的方?br />查询数据字典user_indexes和user_ind_columns
例子:
SQL> SELECT ic.index_name, ic.column_name,
2 ic.column_position col_pos,ix.uniqueness
3 FROM user_indexes ix, user_ind_columns ic
4 WHERE ic.index_name = ix.index_name
5 AND ic.table_name = 'S_EMP';
注意: 数据字典里存攄字符都是大写?
7. 不用索引的地?br />表很?br />where后不l常使用的比较字D?br />表被频繁修改
q回记录数很?br />where后含IS NULL /IS NOT NULL/ like ?输入W?’等条g
8. 重徏索引的语?br />ALTER INDEX 索引?REBUILD TABLESPACE 原来表空间名 NOLOGGING;
定期重徏索引可以减少索引的碎? 更有效地使用表空?
9. 删除索引
SQL> drop index 索引?
SQL> alter table 表名 drop constraint U束?
十六、控制用戯?br />1.权限的类?br />pȝU权? 针对整个pȝ操作的权限 ?br /> ? 用户?密码, 使用表空间的限额{?br />对象U权? 针对某个具体object操作的权限?br /> ? 针对某个? 视图, 表的某个字段的select, update, delete权限
2. 查看当前数据库的用户信息
SQL>select username,default_tablespace,temporary_tablespace from dba_users;
查看在线用户信息
SQL>select count(*) “number?username “current username”?from v$session group by username; 用户查看自己的缺省表I间SQL>select username,default_tablespace from user_users;
3. 创徏新用?br />SQL> create user username identified by password
default tablespace tablespace_name temporary tablespace temp
quota unlimited on tablespace_name
quota 1k on system
[quota 1k on other_tablespace_name ……] ;
l用戯权限
SQL> grant connect, resource to username;
查看当前用户的权限角?br />SQL> select * from user_role_privs;
查看当前用户的系l权限和表权限
SQL> select * from user_sys_privs;SQL> select * from user_tab_privs;
4 、常用的角色及其权限
CONNECT 8 privs q上Oracle,做最基本操作
RESOURCE 8 privs hE序开发最的权?br />DBA 114 privs 数据库管理员所有权?br />EXP_FULL_DATABASE 5 privs 数据库整个备份输出的权限
IMP_FULL_DATABASE 64 privs 数据库整个备份输入的权限
查看角色明细的系l权?br />SQL> select * from role_sys_privs;
5、改变老用户 ?可以改变老用L密码, ~省表空? 临时表空? I间限额.
SQL> alter user username identified by password
default tablespace tablespace_name
temporary tablespace temp
quota unlimited on tablespace_name
quota 1k on system
[quota 1k on other_tablespace_name ……] ;
撤销用户的角色或权限
SQL> revoke role_name or priv_name from username;
注意事项
撤消用户的角色dba? 同时撤消了用户unlimited tablespace的系l权? 切记要再ơ赋予resource角色l此用户
SQL> grant resource to username;
6、删除用?br />如果用户下没有Q何数据对?br />SQL> drop user username;
如果用户下有数据对象
SQL> drop user username cascade;
注意事项
如果用户下有含clob,blob字段的表, 应该先删除这些表?才能用cascade选项完全删除.
7、角色的概念和管?br />角色是命名多个相x限的l合. 能把它赋于其它的用户或角色我们能创徏角色, 使权限管理更Ҏ一?
8、赋于系l的权限语法和例?br />语法:
SQL> GRANT sys_priv TO {user|role|PUBLIC} [WITH ADMIN OPTION];
例子:
SQL> GRANT create session TO sue, rich;
SQL> GRANT create table To scott, manager;
注意: 如果用WITH ADMIN OPTION通过中间用户赋于的系l权限 中间用户删除后, pȝ权限仍然存在.
9、赋于数据对象的权限语法和例子
语法:
SQL> GRANT object_priv [(columns)] ON object TO {user|role|PUBLIC} [WITH GRANT OPTION];
例子:
SQL> GRANT select ON s_emp TO sue, rich;
SQL> GRANT update (name, region_id)
ON s_dept TO scott, manager;
注意: 如果用WITH GRANT OPTION通过中间用户赋于的对象权限 中间用户删除后,对象权限׃存在?
举个例子来说明:
?book 中有name varchar2(20)//书籍名称,buydate Date //购买日期 两个字段?/p>
已经创徏了数据库q接Connection conn;
Ҏ一、用java.sql.Date实现比较单的yyyy-mm-dd格式日期?/p>
java.sql.Date不支持时间格式。切C要用new java.sql.Date(int year,int month,int date),因ؓq要处理旉差问题?/p>
PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");
java.sql.Date buydate=java.sql.Date.valueOf("2005-06-08");
pstmt.setString(1, "Java~程思想");
pstmt.setDate(2,buydate );
pstmt.execute();
Ҏ二、用java.sql.Timestamp,同上不用new Timestamp(....)
PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");
java.sql.Timestamp buydate=java.sql.Timestamp.valueOf("2004-06-08 05:33:99");
pstmt.setString(1, "Java~程思想");
pstmt.setTimestamp(2,buydate );
pstmt.execute();
Ҏ三、用oracle 的to_date内置函数
PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,to_date(?, 'yyyy-mm-dd hh24:mi:ss')");
String buydate="2004-06-08 05:33:99";
pstmt.setString(1, "Java~程思想");
pstmt.setString(2,buydate );
pstmt.execute();
?oracle日期格式参数 含义说明
d: 一周中的星期几
day: 天的名字Q用空格填充到9个字W ?br />dd: 月中的第几天
ddd: q中的第几天
dy: 天的写名
iw: ISO标准的年中的W几周 ?br />iyyy: ISO标准的四位年q?br />yyyy: 四位q䆾
yyy,yy,y: q䆾的最后三位,两位Q一位 ?br />hh: 时Q按12时计 ?br />hh24: 时Q按24时计 ?br />mi: 分 ?br />ss: U ?br />mm: 月 ?br />mon: 月䆾的简写 ?br />month: 月䆾的全名 ?br />w: 该月的第几个星期
ww: q中的第几个星期