第一篇:Oracle数据库学习中的六条经验总结
Oracle数据库学习中的六条经验总结
以下的文章主要是介绍在Oracle数据库学习中的六条经验总结,其实想学好Oracle数据库并不是一件很困难的事情,很多人都认为Oracle数据库的体系过于庞大,在学习的过程中摸不到头绪,以下的文章就会给你提供相关的解答方法。
1、如果有一定的数据库基础知道SQL是怎么回事,即使写不出来简单的SQL,但可以看动它们,你就可以跳到2。否则请先看一下数据库基础和SQL语言,不需要很深,更不需要去记忆那些复杂的SQL命令,这些可以留在以后边应用边学习、记忆。
2、要想学好Oracle数据库,首先要学习ORACLE的体系结构,现在你不需要深入理解它们,但要分清几个关键的概念:instance&database, memory structure,process&those files,such as data file, control file,init parameter file etc以及database ,tablespace,data file和tablespace,segmnet,extent & block它们之间的关系。
当然还要分清undo tablespace & redo log file等,对于很多初学者来说,能够对这些概念有个较为清晰的认识并不是一件容易的事,而这些并非Oracle的全部。
3、是有关ORACLE的一些基本概念,下面要学习的是一些简单的的实际操作,就是如何去管理ORACLE数据库,当然不是管理全部的ORACLE。在此过程中你将对SQL和ORACLE体系结构有个更深入的了解。
4、到了这一步你基本上算是初步掌握了ORACLE,下面将要根据你的方向来具体学习其它的ORACLE知识了。如果你是开发人员,则需要更多地去学习PL/SQL以及DEVELOPER,而这将是一门新的课程。如果你是一名DBA,请继续。
5、现在你可以根据自己的实际情况,进行有选择的学习,也就是说下面的内容没有特别顺序要求。可以选择深入学习ORACLE数据库的管理、备份与恢复、性能调整、网络等。当然在学习这些知识的过程中,如果有实际的工作更好,这样你可以在实际中成长,学会TROUBLE SHOOTING。
6、当然在学习的过程中,你可以在网站或论坛中与他人进行交流,可以看别人的一些经验文章,也可以自己写一些心得体会。技术进步的本身就是经验的积累和提炼过程,希望大家共同成长,欢迎大家相互交流。
第二篇:ORACLE数据库开发经验总结
ORACLE数据库开发经验总结
----ORACLE数据库作为大型数据库管理系统,近年来一直占有世界上高端数据库的最大 份额,其强大而完善的数据库管理功能,以及ORACLE公司推陈出新的不断努力,一直成 为IT业界瞩目的焦点。岭澳核电站的数据库平台采用了ORACLE7.3作为后端平台,前端选 择了ORACLE公司的DEVELOPER 202_ 及DESIGNER 202_作为开发工具,采用了目前流行的
CLIENT/SERVER模式。本人在ORACLE系统的开发中,就ORACLE的整套开发工具提出一些自
己的体会,供同行参考。
----一.ORACLE SQL PLUS 使用技巧:----①查找重复记录:
SELECT DRAWING,DSNO FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID)FROM EM5 _PIPE_PREFAB D WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO);----执行上述SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录。----删除重复记录:
DELETE FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID)FROM EM5 _PIPE_PREFAB D WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO);----执行上述SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录。----② 快速编译所有视图
----当在把数据库倒入到新的服务器上后(数据库重建),需要将视图重新编译一遍,因 为该表空间视图到其它表空间的表的连接会出现问题,可以利用PL/SQL的语言特性,快 速编译。
SQL >SPOOL ON.SQL SQL >SELECT ‘ALTER VIEW ‘||TNAME||’
COMPILE;’ FROM TAB;SQL >SPOOL OFF 然后执行ON.SQL即可。
SQL >@ON.SQL 当然,授权和创建同义词也可以快速进行,如:
SQL >SELECT ‘GRANT SELECT ON ’ ||TNAME||’ TO USERNAME;’ FROM TAB;SQL >SELECT ‘CREATE SYNONYM
‘||TNAME||’ FOR USERNAME.’||TNAME||’;’ FROM TAB;③ 用外联接提高表连接的查询速度
在作表连接(常用于视图)时,常使用以下方法来查询数据: SELECT PAY_NO, PROJECT_NAME FROM A WHERE A.PAY_NO NOT IN(SELECT PAY_ NO FROM B WHERE VALUE >=120000);----但是若表A有10000条记录,表B有10000条记录,则要用掉30分钟才能查完,主要因 为NOT IN要进行一条一条的比较,共需要10000*10000次比较后,才能得到结果。该用外
联接后,可以缩短到1分左右的时间: SELECT PAY_NO,PROJECT_NAME FROM A,B WHERE A.PAY_NO=B.PAY_NO(+)AND B.PAY_NO IS NULL AND B.VALUE >=12000;----④ 怎样读写文本型操作系统文件
----在PL/SQL 3.3以上的版本中,UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下: DECALRE FILE_HANDLE UTL_FILE.FILE_TYPE;BEGIN
FILE_HANDLE:=UTL_FILE.FOPEN(‘C:’,’TEST.TXT’,’A’);
UTL_FILE.PUT_LINE(FILE_HANDLE,’ HELLO,IT’S A TEST TXT FILE’);UTL_FILE.FCLOSE(FILE_HANDLE);END;----相关UTL_FILE数据库包详细信息可以参见相关资料。----⑤ 怎样在数据库触发器中使用列的新值与旧值
----在数据库触发器中几乎总是要使用触发器基表的列值,如果某条语句需要某列修改 前的值,使用:OLD就可以了,使用某列修改后的新值,用:NEW就可以了。如:OLD.DEPT_ NO,:NEW.DEPT_NO。
----二.ORACLE DEVELOPER 202_使用技巧:
----① 改变FORM(FMX模块)运行时的Runform4.5的题头:
----DEVELOPER2000中FMX默认题头为:Developer/202_ Forms Runtime for Windows
/ NT 你可以改为自己定义的标题,----1.在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE----2.在此触发器中写如下代码:
set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT SYSTEM 欢迎使用');----② 如何隐藏菜单中的window选项:
----在创建自己的菜单时,最后选项总有window项,下面介绍如何去掉它,----1.创建一个Menu
----2.在Menu中建立一个Item,命名为WINDOW。----3.设置该Item属性如下:----
Menu Item Type:Magic Command Type:Null Magic Item:Window Lable:为空
----③ 怎样创建动态下拉列表List
----Developer 202_ 中的列表是通过设置相关属性而完成数据项的列表设置的,但那
只是静态的,有时你想让某项成为动态的列表,随输入数据的改变而改变,就需要动手 去编个小程序。下面详细介绍怎样去做:----有块EBOP_CABLE_ACCOUNT,下有SPECIFICATION数据项,当一进入该模块时,就将
SPECIFICATION项在数据库中存储的值动态显示出来,先在Form4.5中建立一个PRCEDURE,命名为DYN_LIST: PROCEDURE DYN_LIST IS
CURSOR C1 IS
SELECT DISTINCT(SPECIFICATION)FROM EBOP_CABLE_ACCOUNT;CNT NUMBER;i NUMBER;TNAME EBOP_CABLE_ ACCOUNT.SPECIFICATION%TYPE;BEGIN
CLEAR_LIST('EBOP_CABLE_ ACCOUNT.SPECIFICATION');SELECT COUNT(DISTINCT
(SPECIFICATION))INTO CNT FROM EBOP _CABLE_ACCOUNT;open C1;FOR i IN 1..CNT LOOP
FETCH C1 INTO TNAME;EXIT WHEN C1%NOTFOUND OR C1%NOTFOUND IS NULL;ADD_LIST_ELEMENT('EBOP_CABLE_ACCOUNT.SPECIFICATION',i,TNAME,TNAME);END LOOP;DELETE_LIST_ELEMENT('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);CLOSE C1;END;然后在FORM的WHEN-NEW
-FORM-INSTANCE触发子中加入一行: DYN_LIST;----这样一进入该FMX,就会动态刷新该列表。除此之外,SPECIFICATION数据项改为列 表项。
----④ 当显示多条记录且数据项特别多时,如何组织录入及显示界面:----如上图所示,PRN代码及设备代码在画布1(CONTENT型)上,其它数据项在画布2(ST ACK型)上,所有数据项为一个表的列或一个块的数据项。在拉动水平滚动条时或用TAB或 敲回车键时,将看到全部数据项。这种排布方法适用于数据项特别多又想显示多条记录 时用。主要制作顺序为:先建立两个画布,画布1(CONTENT型),画布2(STACK型),然后
建立块,选画布时用画布1,这样所有项都显示在画布1上,然后选中除PRN代码及设备代 码之外的所有数据项,选TOOLS菜单下的PROPERTIES选项,将这些数据项的CANVAS属性选
为画布2(STACK型),然后调整整体位置就可以了。----⑤ 如何在FORM的受限触发子中提交保存数据
----在FORM中很多触发子是不能用COMMIT WORK语句的,当你在该触发子中使用了UPDA
TE,DELETE等操作并想立即存盘时,就需要COMMIT WORK语句了。首先在服务器端建立D B_SQL_COMMIT这个过程(采用ORACLE7.3数据库),PROCEDURE DB_SQL_COMMIT IS source_cursor integer;ignore integer;V7 NUMBER :=2;BEGIN
source_cursor:=dbms_sql.open_cursor;dbms_sql.parse(source_cursor,'COMMIT WORK',V7);ignore:=dbms_sql.execute(source_cursor);DBMS_SQL.CLOSE_CURSOR(source_cursor);END;----然后在FORM中该触发子中调用过程DB_SQL_COMMIT;就可以了,当然你可以根据自己
需要将该过程加入参数,这样通过参数可以得到执行DML语句的权限。----⑥ 如何在FORM中实现某数据项自动按记录序号加一操作
----设块名为VO,要操作的数据项为VO_ID,在该块中建立块级触发子WHEN-CREATE-REC
ORD,加入如下代码:
:VO_ID:=:System.Trigger_Record;----这样每当生成新记录时VO_ID就会自动加一了。
----⑦ 如何在一个FORM中调用另一个FORM,或在一个块中调用另一个块时显示特定的 记录有时用户会要求在调用另一个FORM时,只显示相关的记录,举例如下,在一个FORM 的块中有一个按钮,在按钮触发子中加入如下代码: DECLARE PM PARAMLIST;BEGIN
PM:=GET_PARAMETER_LIST('PM');IF NOT ID_NULL(PM)THEN
DESTROY_PARAMETER_LIST('PM');END IF;PM:=CREATE_PARAMETER_LIST('PM');......................ADD_PARAMETER(PM,'THE_WHERE', TEXT_PARAMETER,'EM_NAME=''EM4'' AND EM_PROJECT_NAME=''支架预制''');OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);END;
----其中EM_NAME,EM_PROJECT_NAME为本FORM某块的数据项,PAYMENT为要调用的FORM 模块。这样通过传递参数列表就可以得到想要的结果。在FORM PAYMENT.FMB中,建立一 参数THE_WHERE,CHAR型,长1000,然后在PAYMENT.FMB中建立FORM级触发子WHEN-NEW-F ORM-INSTANCE,在该触发子中加入以下语句:
IF :PARAMETER.THE_WHERE IS NOT NULL THEN SET_BLOCK_PROPERTY('PAYMENT', DEFAULT_WHERE,:PARAMETER.THE_WHERE);END IF;----其中PAYMENT为要显示的块,这样通过参数传递就得到想要的某些特定条件的数据 了。
----⑧ 在FORM中当有主从块时,连续输入记录如何避免被不断的提示保存:
----每输入一条主记录和若干条该主记录的从记录后,此时再导航到主块输下一条记录,FORM就会提示你是否要保存记录,而你并不希望FORM提示,让它自动保存,此时你可 以到Program Units中找到过程PROCEDURE Clear_All_Master_Details,然后在这个过程 中找到语句
Clear_Block(ASK_COMMIT);----将其改为Clear_Block(DO_COMMIT);就可以了。----⑨ 在Report开始时选择排序项:
----在报表开始的Parameter Form中选择报表按哪个数据项排序,----1.先在USER PARAMETER 中创建SORT参数,为字符型,长20。
----2.初始值选’责任方’,然后将这四个值输入到DATA SELECTION中,形成列表。----3.然后处理QUERY中的SQL语句: select CHARGER,FCO_NO,EM_NAME,FCO _NO,DESCRIPTION, FCR_POINT from FCR_MAIN ORDER BY DECODE(:SORT,'责任方',CHARGER,'FCO号', FCO_NO,'FCR号',FCR_NO,'FCR号',EM_NAME)----⑩ 在Developer 202_中如何读写操作系统文件
----在用Developer 202_的开发工具开发应用程序时,经常碰到需要读写外部文件的问
题,可以用ORACLE 带的包TEXT_IO来完成这项需求。例如: DECLARE
IN_FILE TEXT_IO.FILE_TYPE;OUT_FILE TEXT_IO.FILE_TYPE;LINE_BUFER VARCHAR2(80);/*若不用IN_FILE,可以将各字段联接在一起赋值给此变量*/
BEGIN
IN_FILE:=TEXT_IO.FOPEN(‘C:TEMPTEST1.TXT’,’r’);OUT_FILE:=TEXT_IO.FOPEN(‘C:TEMPTEST2.TXT’,’w+’);
LOOP
TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);TEXT_IO.PUT(LINE_BUFER);TEXT_IO.NEW_LINE;TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);END LOOP;EXCEPTION
WHEN no_data_found THEN
TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....’);TEXT_IO.FCLOSE(IN_FILE);TEXT_IO.FCLOSE(OUT_FILE);END;----三.数据库管理
----① 在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TAB
LE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次DR OP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了。----② 数据库文件的移动方法
----当想将数据库文件移动到另外一个目录下时,可以用ALTER DATABASE命令来移动(比ALTER TABLESPACE适用性强):
----1.使用SERVER MANAGER关闭实例.SVRMGR > connect internal;SVRMGR > shutdown;SVRMGR >exit;----2.使用操作系统命令来移动数据库文件位置(假设这里操作系统为SOLARIS 2.6).在UNIX中用 mv命令可以把文件移动到新的位置,#mv /ora13/orarun/document.dbf /ora12/orarun----3.装载数据库并用alter database命令来改变数据库中的文件名.SVRMGR > connect internal;SVRMGR > startup mount RUN73;SVRMGR > alter database rename file
> ‘/ ora13/orarun/document.dbf’
> ‘/ ora12/orarun/document.dbf’;----4.启动实例.SVRMGR > alter database open;----ORACLE数据库开发经验总结
第三篇:Oracle数据库学习总结
Oracle数据库学习总结
1.set linesize xx;设置行间距,常用数值有100,200,300
2.set pagesize xx;设置每页显示行数
3.ed x;表示新建一个x.sql文件,通过文件编辑SQL语句,然后用@x命令可以调用刚才的命令
4.CONN username/password;命令可以建立用户的连接,需要注意的是sys用户是超级管理员,连接是时需要在末尾加上AS SYSDBA 以系统管理员的身份进行连接
5.如果表是归某个用户特有的,在查询的时候需要加上用户名 即以 用户名.表名 的格式查询
6.SHOW USER;命令可以显示当前连接的用户名
7.SELECT * FROM tab;可以显示当前用户下的所有数据表
8.“ / ”表示重复执行上一次的SQL命令操作
9.SELECT xx别名,xx 别名 FROM xx;搜索指定列名,并指定别名,方便显示
10.关键字DISTINCT 可以消除重复值 如 SELECT DISTINCT xx FROM xx;
11.Oracle中提供的字符串连接操作,使用“||”表示,相当于Java的“+”普通字符用“ ' ” 括起来
如: SELECT'员工姓名是'||ename||'员工卡号是'||empnoFROM emp;
12.查询语句 BETWEEN xx AND xx 是包括边界的13.查询日期的时候要加上''把日期引起来
例如:SELECT * FROM emp WHERE hiredate BETWEEN '1-1月-81' AND '08-9月-81';
14.模糊查询中“%”可以匹配任意长度的内容,“_”可以匹配一个长度的内容,如果没输入模糊查询关键字,那么默认查询全部数据,like关键字可以用在任何地方,可以匹配数字、字符、日期等。
15.SQL中不等于可以用“<>”或者“!=”表示
16.ORDER BY语句中 ASC表示升序,DESC表示降序,在没指定的时候默认按照升序排序
17.Oracle中的单行函数有如下,默认的所有的函数都要到表中执行,加上关键字DUAL只会产生一个临时表
UPPER('xxx')将小写转换为大写
LOWER('xxx')将大写转换为小写
INITCAP('xxx')将首字母大写
CONCAT('','')字符串连接
SUBSTR('xxx',x,x)字符串截取,从0或1开始截取效果是一样的,因为Oracle比较智能,要是输入的参数为负数,则表示倒着截取
LENGTH('xxx')字符串长度
REPLACE('xxx','x','x')字符串替换
ROUND(xxx,xx)四舍五入 xxx需要四舍五入的数值,xx保留的小数位,可以加负数 TRUNC(xxx)截断操作,默认小数点后的全部截断,也可以指定小数点保留位数如TRUNC(789.536,2)得到的结果是789.53,也可以加负数如TRUNC(789.536,-2)结果是700
18.SELECT sysdate FROM DUAL;可以求出当前的日期
19.Oracle 中提供了以下日期函数支持:
MONTHS_BETWEEN()求出给定日期范围的月数
ADD_MONTHS(xxx,xxx)在指定日期加上指定的月数
NEXT_DATE(xxx,'')求出下一个给定日期数
TO_CHAR()可以将年、月、日进行分割
例如
TO_CHAR(hirdate,'yyyy')year,TO_CHAR(hirdate,'mm')months,TO_CHAR(hirdate,'dd')day 还可以对时间进行格式化输出 如TO_CHAR(hirdate,'yyyy-mm-dd')
TO_CHAR(hirdate,'fmyyyy-mm-dd')可以去掉前导0
TO_CHAR()还可以对数字进行格式化 如
SELECT ename,TO_CHAR(SAL,'99,999')FROM emp;
注意:一定要用9来表示
$表示美元符号,L表示Local的缩写,以本地语言进行金额显示
TO_NUMBER()将字符串变为数字
TO_DATE()将字符串变为Date类型 例如 SELECT TO_DATE('202_-12-8','yyyy-mm-dd')FROM dual;
TO_NVL()可以将NULL的内容变为指定的内容
DECODE()相当于Java的if else else语句
例如SELECT DECODE(1,1,'内容是1',2,'内容是2',3,'内容是3')FROM dual;将输入 内容是1
20.左右连接
SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE
e.deptno(+)=d.deptno;此例中是右连接,以deptno表为准。
21.SQL1999语法
CROSS JOIN 交叉连接 会产生笛卡尔积
NATURAL JOIN 自然连接 自动进行关联字段匹配 可以消除笛卡尔积
USING 子句:直接关联操作列 如 SELECT * FROM emp e JOIN dept USING(deptno)WHERE deptno=30;
ON 子句 用户自己编写连接条件
LETF JOIN/RIGHT JOIN 左右连接
SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e right OUTER JOIN dept d ON(e.deptno=d.deptno);
22.分组查询GROUP BY 放在where之后
常见的组函数有
COUNT();
MAX();
MIN();
AVG();
SUM();
用法如下:SELECT deptno,count(empno)FROM emp GROUP BY deptno;
语法:SELECT deptno,empno,count(empno)FROM emp GROUP BY deptno;是错误的,原因是使用分组函数的时候,不能出现分组函数和分组条件以外的字段。
语法:SELECT deptno,count(empno)FROM emp;是错误的,原因是不使用分组的时候,则只能单独使用分组函数
分组函数只能在分组中使用,不允许子啊where语句中个使用,要使用个分组条件可以加上HAVING
例如:SELECT deptno,avg(sal)FROM emp GROUP BY deptno having avg(sal)>202_;注意:分组函数可以嵌套使用,但是在组函数嵌套使用的时候不能再出现分组条件的查询语句
如下语法是错误的:SELECT deptno,max(avg(sal))FROM emp GROUP BY deptno;不能出现deptno
如下语法是正确的:SELECT max(avg(sal))FROM emp GROUP BY deptno;
23.子查询中
>ANY 比里面的最小值大
=ANY 与IN用法相同
>ALL 比里面的最大值大
24.表复制
CREATE TABLE myemp AS SELECT * FROM emp;既复制表结构,又复制表内容
CREATE TABLE myemp AS SELECT * FROM emp where 1=2;后面的条件不可能成立,只复制表结构
25.Oracle 中常用的数据类型
VARCHAR、VARCHAR2 代表一个字符串,有长度限制,为255
NUMBER 分为两种
1)NUMBER(n)代表一个整数,数字的长度是n,可以使用INT
2)NUMBER(m,n)代表一个小数,小数长度为n,整数长度为m-n,可以使用FLOAT
DATE 代表日期的类型,日期要按照标准的日期格式进行存放
CLOB 大对象,表示大文本数据,一般可以存放4G的文本
BLOB 大对象,表示二进制数据最大可以存放4G,例如存放歌曲、电影、图片
26.表的创建
CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男');
27.插入数据
INSERT INTO person(pid,name,birthdate,age)VALUES('222','里斯
',TO_DATE('1989-02-09','yyyy-mm-dd'),45);
28.更改表中数据
增加表结构:ALTER TABLE person ADD(address VARCHAR2(50)DEFAULT '暂无地址');
修改已存在的列:ALTER TABLE person MODIFY(name VARCHAR2(40)DEFAULT '无名氏');
29.表的重命名(只能在Oracle中使用)
RENAME XXX TO XXX;
30.约束(主要分为5类)
1)主键约束 主键表示是一个唯一的标识。本身不能为空
2)唯一约束 在一个表中只允许建立一个主键约束,而其他列如果不希望重复值的话,则可以使用唯一约束
3)检查约束 检出一个列的内容是否合法
4)非空约束
5)外键约束 在两张表中进行约束的操作 删除时应该先删除子表,再删除父表 创建主键:
语法1
CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男');
语法2:
CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男',CONSTRAINT p_id PRIMARY KEY(pid));
创建非空约束
CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男');
创建唯一约束
语法一
CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)UNIQUE NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男');
语法二
CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男',CONSTRAINT p_name UNIQUE(name),);
创建检查约束
语法一
CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL CHECK(age BETWEEN 0 AND 150),sex VARCHAR2(2)DEFAULT '男' CHECK(sex IN('男','女','中')),);
语法二
CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男' ,CONSTRAINT p_age CHECK(age BETWEEN 0 AND 150),CONSTRAINT p_sex CHECK(sex IN('男','女','中')));
创建外键约束
--person表
CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男');
--book表
CREATE TABLE book(bid NUMBER PRIMARY KEY,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18),CONSTRAINT b_pid_fk FOREIGN KEY(pid)REFERENCES person(pid));
对于删除,应该先删除book表再删除person表
也可以使用级联删除,强制删除某张表
DROP TABLE person CASCADE CONSTRAINT;
设置外键约束级联删除
--person表
CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男');
--book表
CREATE TABLE book(bid NUMBER PRIMARY KEY,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18),CONSTRAINT b_pid_fk FOREIGN KEY(pid)REFERENCES person(pid)ON DELETE CASCADE);
31.修改约束
如果一张表已经建立完成之后,则可以为其添加约束
ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段);
关于约束名称的命名最好要统一:
PRIMARY KEY :主键字段_PK
UNIQUE:字段_UK
CHECK:字段_CK
FOREIGH KEY:父字段_子字段_FK
例如:
DROP TABLE person;
CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男');
ALTER TABLE person ADD CONSTRAINT pid_PK PRIMARY KEY(pid);
ALTER TABLE person ADD CONSTRAINT name_UK UNIQUE(name);
ALTER TABLE person ADD CONSTRAINT age_CK CHECK(age BETWEEN 1 AND 150);CREATE TABLE book(bid NUMBER ,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18));
ALTER TABLE book ADD CONSTRAINT book_PK PRIMARY KEY(bid);
ALTER TABLE book ADD CONSTRAINT pid_FK FOREIGN KEY(pid)REFERENCES person(pid);删除约束
ALTER TABLE person DROP CONSTRAINT name_UK;
ALTER TABLE person DROP CONSTRAINT age_CK;
第四篇:ORACLE数据库学习总结
数据库学习总结-Marlon
目录一、二、三、四、五、六、七、八、ORACLE_简介.............................................................................................................................................................1 ORACLE_简单查询.....................................................................................................................................................3 ORACLE标量函数和算数运算..................................................................................................................................5 ORACLE_多表查询.....................................................................................................................................................9 ORACLE_列函数和分组...........................................................................................................................................10 ORACLE_子查询.......................................................................................................................................................12 ORACLE_表的更新操作...........................................................................................................................................13 ORACLE_表与视图的管理.......................................................................................................................................15
一、ORACLE_简介
Oralce数据库发展 Oracle 8
Oracle 8i:i表示internet,标识着Oracle公司正式进军互联网。Oracle9i Oracle10g:g表示grid,即网络技术。Oracle11g
Oracle体系结构一 物理结构: 文件系统 控制文件 数据文件 日志文件
参数文件(不是数据库的组成成分)
Oracel体系结构三 逻辑结构: block 快 extent 盘区 segment 段
tablespace 表空间 datafile 数据文件 SQL * Plus下的常用命令
连接到SQL*PLUS sqlplus user/password[as sysdaba|sysoper] sqlplus/nolog
启动数据库
startup mount 启动实例,打开控制文件,但不打开数据文件 startup nomount 只启动实例
关闭数据库
shutdown immediate
迫使每个用户执行为当前的SQL语句,立即断开连接 shutdown transactional
迫使用户执行完当前事务时,断开连接 shutdown abort 强制关闭数据库
常用SQL命令
show user:查看当前连接的用户
connect scott/tiger: 采用scott的用户名/tiger的密码连接数据库 desc table_name:查看tableName表结构 quit|exit:退出
disconnect:断开连接
clear screen:清屏,相当于Windows下的cls命令 select * from tab:列出当前用户下的所有表 @pata 执行pata制定的脚本文件
Oracle常用基本数据类型 varchar2/varchar:变成字符串 char:定长字符串 Integer:整型
number(m,n):数字型 smallint:短整型 float:浮点数
decimal:十进制数字(小数)date:日期型
二、ORACLE_简单查询
SQL结构化查询语言(Structured Query Language)
SQL分类
1.数据定义语言(Data Definition Language,DDL):create、alter、drop。
create table 表名;alter table add 新列名 数据类型;drop table 表名;2.数据操纵语言(Data Manipulation Language,DML):insert、update、delete、select。Insert into 表名(字段1,字段2…)values(值1,值2…);update student set sage=22 where sno='200215';(将学生200215的年龄改为22岁)select distinct job from emp;去除重复行
3.数据控制语言(Data Control Language,DCL):commit work、rollback work。 查询雇员的所有信息 select * from emp; *表示所有列
查询语句的格式
select *|列名 from 表名
查询雇员的编号,姓名,工资
select * from empno,ename,sal from emp;
查询所有职位 select job from emp;select distinct job from emp;distinct: 有区别的(去除重复行)
查询工资大于1500的雇员信息,列出编号,用户名,工资 select empno,ename,sal from emp where sal>1500;
带有where条件查询语句的基本格式 select *|列名 from 表名 where 条件;
比较运算符 大于:> 小于:< 等于:= 大于等于:>= 小于等于:<= 不等于:!=或者<>
限定查询 is null 和 is not null 的使用 查询每月可以得到奖金的雇员
select empno,ename,comm from emp where comm is not null;
select empno,ename,comm from emp where comm is not null and comm>0; 查询谁没有奖金
select empno,ename from emp where comm is null;
限定查询 and 的使用
查询工资大于1500,并且可以领取奖金的雇员
SQL> select empno,ename,sal,comm from emp where comm is not null and sal>1500;
限定查询 or 的使用
查询工资大于1500和可以领取奖金的雇员
select empno,ename,sal,comm from emp where sal>1500 or comm is not null; 查询没有奖金的雇员
select empno,ename,comm from emp where comm=0 or comm is null;
限定查询 使用not对条件整体取反
查询工资不大于1500并且不能领取奖金的雇员
select empno,ename,sal,comm from emp where sal<=1500 and(comm is null or comm=0);select empno,ename,sal,comm from emp where not(sal>1500 or comm is not null);
限定查询 between...and...的使用
查询基本工资大于等于1500并且小于等于3000的雇员
select empno,ename,sal from emp where sal>=1500 and sal<=3000;select empno,ename,sal from emp where sal between 1500 and 3000; 查询1981年雇佣的所有员工
select empno,ename,hiredate from emp where hiredate between'1-1月 1981' and '31-12月 1981';注:日期格式 日-月 年,要匹配上
限定查询 字符串的比较
查询姓名是'SMITH'员工的所有信息 select * from emp where ename='SMITH';select * from emp where ename='smith';注:列值区分大小写
限定查询 in的使用
查询出编号7369,7499,7521的雇员的具体信息
select * from emp where empno=7369 or empno=7499 or empno=7521;select * from emp where empno in(7369,7499,7521);
限定查询 not in的使用
查询出雇员编号不是369,7499,7521的雇员的具体信息 select * from emp where empno not in(7369,7499,7521);
限定查询 like的使用
查询雇员的名字第二个字符是M的雇员信息 select * from emp where ename like'_M%';注:_匹配一个字符,%匹配0个多个字母(前缀或后缀的代表) 查询1982年入职的所有雇员的信息
select * from emp where hiredate like'%82'; 查询工资中包含5的雇员信息
select * from emp sal where like'%5%';
对结果排序-Oracle By 查询员工工资大于1500员工的信息,按工资排序 select * from emp where sal>1500 order by sal; 查询工资大于1500员工的信息,按工资降序,按雇佣日期升序排序 select * from emp where sal>1500 order by sal desc,hiredate asc;注:ASC升序,DESC降序,默认ASC。
ascending [ə'sendiŋ]上升的,降序排列(descend [di'send] 的缩写);
三、ORACLE标量函数和算数运算
字符函数的使用
转换为大写字母
select upper('smith')from dual;注:dual是公共表。upper ['?p?] 上面的,上部的
转换为小写字母
select lower('SMITH')from dual;注:lower 放下
每个单词的字母变成大写,其余字母小写 select initcap('hello world')from dual
串连接(concat):可以使用“||”进行串连接 select concat('HELLO','WORLD')from dual;select 'HELLO'||'WORLD' from dual;
求子串(SUBSTR)select substr(ename,1,3)from emp;注:含义为截取ename字段从第一个字符开始,总共三个字符
求长度(LENGTH)select length(ename)from emp;
串替换(REPLACE)select replace('HELLO WORLD','WOR','WEL')from dual;结果:
REPLACE('HE-----------HELLO WELLD 注:第一个逗号是原字符,第二个逗号是原字符的一部分,第三部分是替换原字符那个部分。
要求显示所有雇员的姓名和姓名的后三个字符
select ename,substr(ename,length(ename)-2)from emp;select ename,substr(ename,-3)from emp;
四舍五入(Round)select round(789.536)from dual;ROUND(789.536)--------------
790
四舍五入(Round):指定保留小数位数 select round(789.536,2)from dual;----------------
789.54
四舍五入(Round):对整数四舍五入 select round(789.536,-2)from dual;ROUND(789.536,-2)-----------------
800
截断小数位(TRUNC)select trunc(789.536)from dual;TRUNC(789.536)--------------
789
截断小数位(TRUNC):指定保留小数位 select trunc(789.536,2)from dual;TRUNC(789.536,2)----------------
789.53
截断小数位(TRUNC):对整数截断 select trunc(789.536,-2)from dual;TRUNC(789.536,-2)-----------------
700 除空格(TRIM)
SQL> SELECT TRIM(55)FROM DUAL;TRIM(55)--------55 取余数(MOD)select mod(10,3)from dual;
日期函数 运算规律:
日期+数字=日期 日期-数字=日期
日期-日期=数字(天数)
查询当前日期
select sysdate from dual;SYSDATE-------------10-3月-12
显示10部门员工进入公司的星期数
select empno,ename,round((sysdate-hiredate)/7)from emp where deptno=10;
在指定日期上加入指定的月数之后的日期(ADD_MONTHS)select add_months(sysdate,4)from dual;ADD_MONTHS(SYS--------------10-7月-12
求出给定日期范围的月数(months_between)select empno,ename,months_between(sysdate,hiredate)from emp;
下一个给定的星期是那个日期(next_day)select next_day(sysdate,'星期一')from dual;注:表示在当前时间的前提下,下个礼拜一的具体日期
求出给定日期所在月份的最后一天日期(last_day)select last_day(sysdate)from dual;
转换成字符串(to_char)查询雇员号,姓名,以及入职的年份
select empno,ename,to_char(hiredate,'yyyy')from emp;注:yyyy匹配年份,mm匹配月份,dd匹配日
使用to_char设置日期的显示格式
select empno,ename,to_char(hiredate,'yyyy-mm-dd')from emp;
使用fm去掉前导0 select empno,ename,to_char(hiredate,'fmyyyy-mm-dd')from emp;EMPNO ENAME
TO_CHAR(HI--------------------------
7369 SMITH
1980-12-17
7499 ALLEN
1981-2-20 注:正常的值是1981-02-20,02前面的0去掉,变成了1981-2-20. 通过to_char设置数值的格式
select empno,ename,to_char(sal,'99,999')from emp;说明:9代表1位数字
EMPNO ENAME
TO_CHAR---------------------------
7369 SMITH
800
7499 ALLEN
1,600
7521 WARD
1,250 注:把sal的值分成两个部分,后三位为一个部分,前两位为一个部分,用逗号隔开。
显示余额
select empno,ename,to_char(sal,'$99,999')from emp;说明:$代表美元
转换成数字(to_number)select to_number('123')+to_number('123')from dual;TO_NUMBER('123')+TO_NUMBER('123')--
246
转换成日期(to_date)select to_date('202_-07-31','yyyy-mm-dd')from dual;TO_DATE('202_---------------31-7月-09
算数运算
查询每个员工的年收入
select empno,ename,(sal+comm)*12 from emp;年收入=工资+奖金
查询每个员工的年收入
select empno,ename,(sal+comm)*12 income from emp;
查询每个员工的年收入
select empno,ename,(sal+NVL(comm,0))*12 income from emp;注:NVL(comm,0),当comm的值为null时,用0替换
ORACLE_多表查询
格式:
select 列名1 别名1,......from 表名1,表名2,......where 条件 order by 列名
查询员工的编号,姓名,部门编号,部门名称
select empno,ename,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;
关联查询-为表命别名
查询员工的编号,姓名,部门编号,部门名称
select empno,ename,e.deptno,dname from emp e,dept d where d.deptno=e.deptno;注:这里的e是emp的别名,d是dept的别名
关联查询-自连接
查询出每个雇员的姓名、工作、雇员的直接上级领导的姓名
select e.empno,e.ename,e.job,m.ename mname from emp e,emp m where e.mgr=m.empno;注:mname是m.ename的别名
关联查询-多表关联
四、 查询出每个雇员的姓名,工作,雇员的直接上级领导,以及部门名称 select e.ename,e.job,m.ename,d.dname from emp e,dept d,emp m where e.mgr=m.empno and e.deptno=d.deptno;注:当查询的字段间的关系涉及到n个表时,则n个表之间关联。
左、右外连接
查询员工编号,姓名,所在部门号,部门名称,将没有员工的部门也显示出来 select e.ename,d.deptno,d.dname from emp e,dept d where e.deptno(+)=d.deptno;注:(+)在左边,表示右连接,会列出所有右表中出现但是没有在左表中出现的行。
查询雇员的编号,姓名及其领导的编号,将没有领导的员工也列出来 select e.empno,e.ename,m.empno,m.ename from emp e,emp m where e.mgr=m.empno(+);注:(+)在右边表示左连接,会列出左表中出现但没有在右表中出现的行。
交叉连接(cross join):用来长生笛卡尔积 select * from emp cross join dept;
自然连接(nutural join):自动进行关联字段的匹配 select * from emp natural join dept;
using子句:直接指定操作关联列
select * from emp join dept using(deptno)
on子句:用户自己编写连接条件
select * from emp join dept on emp.deptno=dept.deptno;
left join:左外连接
right join:右外连接
五、ORACLE_列函数和分组
常用的列函数
sum(expression)求和 max(expression)求最大值 min(expression)求最小值 avg(expression)求平均数 count(expression)统计记录数
count(distinct colname)统计去除重复行记录数 nvl(comm,0)当comm为null时,用0替换
列函数的使用
查询员工的记录数,员工工资的总和,平均工资,最高工资,最低工资
select count(*)count_emp,sum(sal)sum_sal, max(sal)max_sal,min(sal)min_sal, avg(sal)avg_sal from emp;
列函数的使用-对null的处理
查询所有员工的年收入
select sum(sal+comm)from emp;SUM(SAL+COMM)-------------
7800 注:当comm为null时,sal+comm是没有结果值的
select sum(sal)+sum(comm)from emp;SUM(SAL)+SUM(COMM)------------------
31225
select sum(sal+nvl(comm,0))from emp;SUM(SAL+NVL(COMM,0))--------------------
31225
分组查询
语法格式
select 列名...,列函数 from 表名...where 条件...group by 列名...order by 列名... 查询每个部门的人数
select deptno,count(*)from emp group by deptno;规则:如果在select字句中,有不在列函数中的列,则该列一定要出现在group by之后。
分组查询having字句的使用
显示出平均工资大于202_的部门编号和平均工资 select deptno,avg(sal)from emp group by deptno having avg(sal)>202_;
SQL语句的书写顺序
select 列名,列函数 from 表名 where 条件 group by列名 having 条件 order by 列名
SQL语句的执行顺序
from where group by having select order by
查询20,30部门的平均工资,并将平均工资大于202_的输出,输出结果按平均工资排序 select deptno,avg(sal)from emp where deptno in(20,30)group by deptno having avg(sal)>202_ order by avg(sal);
六、ORACLE_子查询
在where子句中使用子查询
查询工资比7654雇员工资高的全部雇员信息
select * from emp where sal>(select sal from emp where empno=7654);子查询-in的使用
查询和smith或jones在同一部门,同一职位工作的员工
select ename from emp where(deptno,job)in(select deptno,job from emp where ename in('SMITH','JONES'));
子查询-any的使用
=any:与in操作符的效果一致
查询和smith或jones在同一部门,同一职位工作的员工
select ename from emp where(deptno,job)=any(select deptno,job from emp where ename in('SMITH','JONES'));
>any:只要大于子查询中的任何一个值即可 select * from emp where sal>any(select min(sal)from emp group by deptno);
select empno from emp where sal
子查询all的使用
>all:比最大的值大
select * from emp where sal>all
(select min(sal)from emp group by deptno);注:select min(sal)from emp group by deptno结果为
MIN(SAL)----------
950
800
1300 是每个部门当中的最少工资。
七、ORACLE_表的更新操作
创建表副本
create table myemp as select * from emp;
插入 到表中 insert的语法
insert into 表名(字段名1,字段名2,......)values(值1,值2......)
为myemp中增加一条记录 insert into myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values(7899,'张三','清洁工','7369','14-2月-202_',9000,300,40);注:给定的值要和指定的字段数一致。
1.如果全部字段都插入值的话,那字段名可以省略。即:
insert into 表名 values(值1,值2,.......);2.如果只是部分字段插入值的话,字段名又想省略的话,那么,其余没有数据插入的字段用null填补。
to_date:字符型转换成日期型
批量插入记录 格式:
insert into 表名
select 字段列表 from 表名 where 条件
注:insert表和select表列数等都一致 例如:
create table test as select * from emp;insert into test select * from emp;
修改记录
update表名set要修改的字段=新值,要修改的字段=新值,...where条件
将雇员号为7896的雇员的奖金修改为100 update myemp set comm=100 where empno=7896;注:执行修改操作时,一定要使用where来指定修改的条件,否则会改变表中的所有记录。
删除记录
delete from 表名 where 条件
删除雇员编号为7896的雇员信息 delete from myemp where empno=7896;注:执行delete操作时,一定要使用where来指定修改的条件,否则会删除表中所有的记录。
Oralce的事务处理
commit:提交事务 rollback:回滚操作
注:操作一旦执行了commit操作,就再也不能回滚操作了。
八、ORACLE_表与视图的管理
oracle中的常见数据类型
varchar、varchar2:表示一个字符串,有长度限制,为255 number:
number(n):表示一个整数,数字的长度是n,可以使用int number(n,m):表示一个小数,数字的长度为n,整数长度m-n,可以使用float date:表示日期类型,日期要按照标准格式日期存放。clob:大对象,表示大文本数据类型,可存放4G。
blob:大对象,表示二进制数据,最大可以存放4G,如电影,图片、歌曲
创建表 语法:
create table 表名(字段名称1 字段类型[default 默认值], 字段名称1 字段类型[default 默认值],............字段名称1 字段类型[default 默认值],);
复制表
create table 表名 as(子查询);注:当子查询不成立时,如果1=2,则只复制表的结果,不复制表的数据。
删除表 语法:
drop table 表名;
修改表结构
增加一列
alter table 表名 add(列名称 列数据类型 default 默认值)
删除列 alter table 表名 drop column 列名称;
修改列的数据类型
alter table 表名称 modify(列的名称 列的类型 default 默认值);注:1.如果是更改数据的长度,则要求更改时,长度不能小于当前表中数据所具有的最大长度。
2.如果是更改数据类型,则要求更改时,该列的所有记录值都为空。
修改表结构
为表重命名
rename 旧表名 to 新表名;注:这是oracle特有的操作
将myemp表改名为iemp SQL> rename myemp to iemp;表已重命名。 截断表
truncate table 表名;意义:清空表中的所有数据,并且立即释放资源,该操作是不可回滚。
约束-约束的分类
主键约束:表示一个唯一的标识,本身不能为空 唯一约束:列值不允许重复
检查约束:检查一个列的内容是否合法
非空约束:不能为空值,如用户不能为空(no null)外键约束:在两张表中进行约束的操作
主键约束(primary key)主键约束一般在id上使用,而且本身已经默认了不能为空,主键约束可以在建表的时候指定 create table person(pid varchar2(18)primary key, name varchar(30), age number(3), sex varchar2(2)default'男');
使用constraint指定
constraint [kən'streint] 约束;强制 create table person(pid varchar2(18), name varchar(30), age number(3), sex varchar2(2)default'男'
constraint person_pid_pk primary key(pid);); 非空约束(not null)create table person(pid varchar2(18)primary key, name varchar(30)not null, age number(3), sex varchar2(2)default'男');
唯一约束(unique)create table person(pid varchar2(18)primary key, name varchar(30)unique not null, age number(3), sex varchar2(2)default'男');
视图
概念:一个视图实质是封装了一条复杂的SQL语句
创建视图 语法:
create view 视图名称 as 子查询
创建部门20员工的雇员信息
create view empv20 as select * from emp where deptno=20;注:当创建视图以后,可以像操作表一样操作视图。注:视图的操作会影响到表的操作。
with check option 不能更新创建视图的条件 with read only 创建只读视图
删除视图 语法:
drop view 视图名称
注:当删除视图所在的表时,则视图也不能被使用
序列
创建序列语法:sequence ['si:kwəns] create sequence 序列名称;create sequence myseq;序列的操作:
nextval:取得序列的下一个内容 currval:取得当前序列的内容
创建表验证序列的操作
create table testseq(next number,curr number);insert into testseq values(myseq.currval,myseq.nextval);
创建序列指定每次增长的增量
create sequence myseq increment by 2;注:每次增长2
创建序列指定开始的序列,默认的序列从1开始。create sequence myseq increment by 2 start with 10;注:序列从10开始,每次增长2
创建一个序列1,3,5,7,9.create sequence myseq maxvalue 9 increment by 2 start with 1 cache 2 cycle;注:序列从1开始,每次增长2,最大值为9,循环两次。
第五篇:ORACLE数据库工作总结
202_-202_学第一学期ORACLE教学工作总结
班级:13高软班
数据库技术是计算机科学技术中发展最快的领域之一,也是应用最为广泛的技术之一,它已经成为计算机信息系统与应用的核心技术和重要基础。所以在学习这门课时,注重学生实际操作能力,安排了理论与上机操作相结合。以下是我的工作总结:
1、课前准备:备好课。认真学习贯彻教学大纲,钻研教材。了解教材的基本思想、基本概念、结构、重点与难点,掌握知识的逻辑。
了解学生原有的知识技能的质量,他们的兴趣、需要、方法、习惯,学习新知识可能会有哪些困难,采取相应的措施。
考虑教法,解决如何把已掌握的教材传授给学生,包括如何组织教学、如何安排每节课的活动。
2、课堂上的情况。组织好课堂教学,关注全体学生,注意信息反馈,调动学生的注意力,使其保持相对稳定性。同时,激发学生的情感,使他们产生愉悦的心境,创造良好的课堂气氛,课堂语言简洁明了,课堂提问面向全体学生,注意引发学生学习的兴趣,课堂上讲练结合,布置好课外作业,减轻学生的负担。
3、上机操作情况。让学生复习操作上节课的学习内容,布置一定的作业,做到每个学生的每个SQL语句,每个操作抖完全掌握。总之,作为一名教师,教学是我的基本工作,而教与学是一个良性互动的过程,在教中学,在学中教,才能实现自己在业务上的进步与飞跃。实施素质教育对教师的素质要求更高,在今后的教育教学中,我将严格要求自己,努力工作,发扬优点,开拓进取,为教育事业奉献自己的力量。