第一篇:oracle数据库使用总结
Oracle数据库遇到问题与使用心得总结
一、快速得到存储过程运行的结果。步骤方法:
1、在c://temp目录中得到存储过程调用的参数语句,然后复制。
2、在PL/SQL中打开Test Window窗口,粘贴复制的内容,然后在内容中如下图增加2个参数(r1和r2)。
3、在Test Window窗口的变量和类型中入下图那样设置增加的参数。
4、点Test Window窗口中的图标,等运行按钮亮起时,再点击运行按钮。
5、在Test Window窗口中值哪列点击就能查看运行存储过程的结果。
二、解决数据库弹出“本地计算机上的OracleOraDb11g_home1TNSListener服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止”问题。
分析原因:是因为数据库监听配置文件添加这句话(如下图),然后重启监听服务OracleOraDb11g_home1TNSListener就报上面的错误。
报错现象:接着打开”开始-》所有程序-》oracle_home-》Net Manager “程序发现不能配置监听程序 ;启动监听服务提示“本地计算机上的OracleOraDb11g_home1TNSListener服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止”信息
解决方法步骤:
1、删除这句话。
2、修改为
三、解决数据库提示“ora-12514 无监听程序处理”问题。
原因分析:数据库监听配置都好好,用sqlplus能正常连接数据库,但是用PL/SQL连接就报“ora-12514 无监听程序处理”错误。
1、找到数据库的安装目录文件下的listener.log文件(本人的监听文件放在D:orcladmindiagtnslsnrtzzlistenertrace目录),发现文件很大有几个G。
2、在cmd中输入如下命令
lsnrctl set log_status off;(暂停日志监控)
3、在cmd中通过输入“D:”进入D盘,然后通过 “cd orcl”进入D:orcl目录,一直到D:orcladmindiagtnslsnrtanzizilistenertrace为止
4、再输入命令:copy listener.log listener.log.20150114(复制文件)
5、输入命令:echo >listener.log(清空listener文件)
6、lsnrctl set log_status on;(启动日志监控)
四、oralce查询锁定进程和关闭window系统中的锁定进程
1、查询锁定进程语句: SELECT /*+ rule */ s.username, decode(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL)LOCK_LEVEL, o.owner, o.object_name, o.object_type, s.sid, s.serial#, s.terminal, s.machine, s.program, s.osuser FROM v$session s, v$lock l, dba_objects o WHERE l.sid = s.sid AND l.id1 = o.object_id(+)AND s.username is NOT Null;
2、杀掉锁定的进程
alter system kill session 'sid,serial#';找到锁定进程对应的spid select a.SID,a.USERNAME,a.status,a.process,b.SPID from v$session a,v$process b where a.PADDR=b.ADDR and a.sid='sid';
4、在cmd中输入关闭锁定进程命令: orakill orcl spid;
五、oracle数据库中的jobs
1、查询所有的jobs select * from user_jobs;
2、查看怎在运行的jobs select * from dba_jobs_running;
六、数据库表空间增加空间
1、允许已存在的数据文件自动增长
ALTER DATABASE DATAFILE 'D:orcladminoradataorclAPP03.DBF' AUTOEXTEND ON NEXT 50M MAXSIZE 20480M;手工改变已存在数据文件的大小
ALTER DATABASE DATAFILE 'D:orcladminoradataorclAPP02.DBF' RESIZE 20480M;
七、数据库服务器端数据的导出与导入(必须在数据库服务器端使用),导出和导入使用服务器端命令好处是速度快,不会出现空表不导出现象。
1、cmd
2、expdp kdcrm/1@orcl version=11.1.0.6.0 数据库名/数控密码@实例名 要导入数据库的版本号
(版本号一般是用在高版本数据库向低版本数据库导入数据。)
3、查看导出日志,根据日志找到导出文件
4、进入D:orcladminadminorcldpdump目录,把EXPDAT.DMP压缩下。
5、把压缩之后的文件从服务器拷入本地计算机。
6、找到本地计算机的安装目录下的D:orcladminadminorcldpdump文件夹,把压缩的文件解压到此地。
7、在本地计算机中输入cmd
8、在本地计算机创建表空间,通过PL/SQL工具用oracle数据库的系统管理员进入数据库。CREATE TABLESPACE CMBC_PMS_TBS
LOGGING
DATAFILE 'D:orcladminoradataorclCMBC_PMS_TBS.ora'
SIZE 100M AUTOEXTEND
ON NEXT 100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
--Create the user create user CMBC_PMS identified by 1 default tablespace CMBC_PMS_TBS temporary tablespace TEMP profile DEFAULT password expire;--Grant/Revoke role privileges grant connect to CMBC_PMS;grant dba to CMBC_PMS;grant resource to CMBC_PMS;--Grant/Revoke system privileges grant create any table to CMBC_PMS;grant create any view to CMBC_PMS;grant create database link to CMBC_PMS;grant create table to CMBC_PMS;grant debug connect session to CMBC_PMS;grant drop any table to CMBC_PMS;grant select any table to CMBC_PMS;grant unlimited tablespace to CMBC_PMS;
CREATE TABLESPACE TS_CRM_01
LOGGING
DATAFILE 'D:orcladminoradataorclTS_CRM_01.dbf'
SIZE 100M AUTOEXTEND
ON NEXT 100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;CREATE TEMPORARY TABLESPACE ts_tmp_01
TEMPFILE 'D:orcladminoradataorclts_tmp_01.dbf'
SIZE 100M
AUTOEXTEND ON
NEXT 100M maxsize 2000M;
CREATE TABLESPACE TS_CC_01
LOGGING
DATAFILE 'D:orcladminoradataorclTS_CC_01.dbf'
SIZE 100M AUTOEXTEND
ON NEXT 100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
CREATE TABLESPACE TS_TA_01
LOGGING
DATAFILE 'D:orcladminoradataorclTS_TA_01.dbf'
SIZE 100M AUTOEXTEND
ON NEXT 100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
--系统管理员
select * from dba_directories;CREATE OR REPLACE DIRECTORY dir_crm_db AS 'D:orcldb_bak';--drop directory dir_crm_db;CREATE OR REPLACE DIRECTORY dir_dp AS 'D:orcldp_bak';--drop directory dir_dp;CREATE OR REPLACE DIRECTORY expdp_dir AS 'D:orcldir_bak';--drop directory expdp_dir;
9、在本地计算机创建用户,通过PL/SQL工具用oracle数据库的系统管理员进入数据库。--Create the user
create user KDCRM identified by 1
default tablespace TS_CRM_01
temporary tablespace TS_TMP_01
profile DEFAULT
password expire;--Grant/Revoke object privileges
grant select, insert, update, delete grant select, insert, update, delete KDCRM;grant select, insert, update, delete M;grant select, insert, update, delete CRM;grant select, insert, update, delete KDCRM;grant select, insert, update, delete REHOLD to KDCRM;grant select, insert, update, delete RM;grant select, insert, update, delete grant select, insert, update, delete NFO to KDCRM;grant select, insert, update, delete KDCRM;grant select, insert, update, delete KDCRM;grant select, insert, update, delete ACT to KDCRM;grant select, insert, update, delete;grant select, insert, update, delete grant select, insert, update, delete CRM;grant select, insert, update, delete M;
on CMBC_PMS.BENEFIT to KDCRM;on CMBC_PMS.COLLATERAL_CONTRACT toon CMBC_PMS.ENTRUST_AGENCY to KDCRon CMBC_PMS.FINANCE_CONTRACT to KDon CMBC_PMS.FINANCE_COUNTERPARTY toon CMBC_PMS.FINANCE_COUNTERPARTY_SHAon CMBC_PMS.FINANCE_PROJECT to KDCon CMBC_PMS.FUND_RAISE to KDCRM;on CMBC_PMS.GENERAL_FINANCE_PROJECTIon CMBC_PMS.GUARANTEE_CONTRACT to on CMBC_PMS.INVESTMENT_ADVISER to on CMBC_PMS.INVESTMENT_ADVISER_CONTRon CMBC_PMS.KD_RIGHT_ROLE to KDCRMon CMBC_PMS.PMS_PROJECT to KDCRM;on CMBC_PMS.PMS_PROJECT_USER to KDon CMBC_PMS.SYS_BUSINESSNO to KDCRgrant select, insert, update, delete on CMBC_PMS.SYS_REPORTFIELD to KDCRM;grant select, insert, update, delete on CMBC_PMS.WF_BUSINESSDATA to KDCRM;grant select, insert, update, delete on CMBC_PMS.WF_ROLE_FLOW_AUTH to KDCRM;grant select, insert, update, delete on CMBC_PMS.WF_ROUGH_DRAFT to KDCRM;grant read, write on directory SYS.DIR_CRM_DB to KDCRM;grant execute, read, write on directory SYS.DIR_DP to KDCRM with t option;grant read, write on directory SYS.EXPDP_DIR to KDCRM;--Grant/Revoke role privileges grant connect to KDCRM;grant dba to KDCRM;grant resource to KDCRM;--Grant/Revoke system privileges grant create any table to KDCRM;grant create any view to KDCRM;grant create database link to KDCRM;grant create table to KDCRM;grant debug connect session to KDCRM;grant drop any table to KDCRM;grant select any table to KDCRM;grant unlimited tablespace to KDCRM;
8、impdp kdcrm/1@orcl remap_schema=kdcrm:kdcrm dumpfile=EXPDAT.DMP 数据库名/密码@实例名 导出的数据库名:导入的数据库名 数据库备份文件名
gran
第二篇:Oracle数据库使用心得
Oracle数据库使用心得
092909 谢弘毅
经过助教对oracle和sybase数据库的讲解后,我下载使用和体验了这两个数据库,但主要的还是使用了Oracle数据库,经过一段时间的使用,对其使用有了一定的心得体会,并且通过阅读资料对其现在的前景状况有了一定的了解。
【选择Oracle的原因】
(1)在Gartner/Dataquest报告中Oracle依然在主流操作系统Unix和Linux, Windows NT/2000/XP上的关系数据库市场上占据绝对的领先地位,在UNIX上占63%, Windows+Unix上占49.9%。在关系型数据库市场(包括AS/400,Mainframe),Oracle以39.8%仍然处于领先地位。
(2)Oracle数据库依然是Fortune 100公司的首选数据库,其中51%的Fortune 100公司选用Oracle Database作为构建企业的传统应用和电子商务平台。
(3)Oracle数据库与Sybase数据库相比,无论从体系架构、并行支持、完整性控制等各方面均有很大的优势。
【Oracle相比于sybase的优势】(1)体系结构的比较
Oracle采用多线索多进程体系结构,直接在内核中支持分布式数据库操作、多线索处理、并行处理以及联机事务处理等。Sybase采用单进程多线索体系结构,其核心是SQL Server
(2)多线索多进程与单进程多线索的比较
Oracle和Sybase都采用多线索。Oracle多服务器进程结构,能实现数据库事务的并行处理,提高并发事务处理的响应速度。并且多服务器结构具有非常灵活的扩充性,当硬件平台处理能力提高时,服务器进程的个数也能随之增加,数据库性能也随之提高。Sybase采用单进程多线索方式。当并发用户数达到一定的数量时,会引起系统处理性能大大下降,和服务器进程瓶颈及死锁等现象;同时系统的可扩展余地非常狭窄。
(3)联机事务处理
Oracle的多线索技术在相同硬件环境下,所支持的用户数是其他数据库 系统的5至10倍。
【我对Oracle一些概念的理解】
(1)ORACLE SERVER
一个运行着的ORACLE数据库就可以看成是一个ORACLE SERVER,该SERVER由数据库(Database)和实例(Instance)组成,在一般的情况下一个ORACLE SERVER包含一个实例和一个与之对应的数据库。
一系列物理文件(数据文件,控制文件,联机日志等)的集合或与之对应的逻辑结构(表空间,段等)被称为数据库,简单的说,就是一系列与磁盘有关系的物理文件的组成。ORACLE内存结构和后台进程被成为数据库的实例,一个实例最多只能安装(Mount)和打开(Open)在一个数据库上,负责数据库的相应操作并与用户交互。
实例与数据库的关系如下图所示:
图一 ORACLE SERVER
(2)ORACLE内存结构(Memory structure)Oracle内存结构主要可以分共享内存区与非共享内存区,共享内存区主要包含SGA(System Global Area),非共享内存区主要由PGA(Program Global Area)组成,可以用如下图形表示。
图二 ORACLE MEMOERY STRUCTRUE
(3)后台进程(Background process)后台进程是Oracle的程序,用来管理数据库的读写,恢复和监视等工作。Server Process主要是通过他和user process进行联系和沟通,并由他和user process进行数据的交换。在Unix机器上,Oracle后台进程相对于操作系统进程,也就是说,一个Oracle后台进程将启动一个操作系统进程;在Windows机器上,Oracle后台进程相对于操作系统线程,打开任务管理器,我们只能看到一个ORACLE.EXE的进程,但是通过另外的工具,就可以看到包含在这里进程中的线程。
Oracle系统有5 个基本进程他们是:
DBWR(数据文件写入进程):将修改过的数据缓冲区的数据写入对应数据文件,维护系统内的空缓冲区。 LGWR(日志文件写入进程):将重做日志缓冲区的数据写入重做日志文件。
SMON(系统监护进程):工作主要包含:清除临时空间,在系统启动时,完成系统实例恢复,聚结空闲空间,从不可用的文件中恢复事务的活动,OPS中失败节点的实例恢复等。
PMON(用户进程监护进程):主要用于清除失效的用户进程,释放用户进程所用的资源。
CKPT(检查点进程,同步数据文件, 日志文件,控制文件):同步数据文件,日志文件和控制文件,由于DBWR/LGWR的工作原理,造成了数据文件,日志文件,控制文件的不一至,这就需要CKPT进程来同步。CKPT会更新数据文件/控制文件的头信息。
(4)ORACLE的物理结构 1)数据文件
每一个ORACLE数据库有一个或多个物理的数据文件(data file)。一个数据库的数据文件包含全部数据库数据。逻辑数据库结构(如表、索引)的数据物理地存储在数据库的数据文件中。数据文件有下列特征:
一个数据文件仅与一个数据库联系。 一旦建立,数据文件不能改变大小
一个表空间(数据库存储的逻辑单位)由一个或多个数据文件组成。
数据文件中的数据在需要时可以读取并存储在ORACLE内存储区中。例如:用户要存取数据库一表的某些数据,如果请求信息不在数据库的内存存储区内,则从相应的数据文件中读取并存储在内存。当修改和插入新数据时,不必立刻写入数据文件。为了减少磁盘输出的总数,提高性能,数据存储在内存,然后由ORACLE后台进程DBWR决定如何将其写入到相应的数据文件。2)日志文件
每一个数据库有两个或多个日志文件(redo log file)的组,每一个日志文件组用于收集数据库日志。日志的主要功能是记录对数据所作的修改,所以对数据库作的全部修改是记录在日志中。在出现故障时,如果不能将修改数据永久地写入数据文件,则可利用日志得到该修改,所以从不会丢失已有操作成果。
日志文件主要是保护数据库以防止故障。为了防止日志文件本身的故障,ORACLE允许镜象日志(mirrored redo log),以致可在不同磁盘上维护两个或多个日志副本。
日志文件中的信息仅在系统故障或介质故障恢复数据库时使用,这些故障阻止将数据库数据写入到数据库的数据文件。然而任何丢失的数据在下一次数据库打开时,ORACLE自动地应用日志文件中的信息来恢复数据库数据文件。3)控制文件
每一ORACLE数据库有一个控制文件(control file),它记录数据库的物理结构,包含下列信息类型:
数据库名;
数据库数据文件和日志文件的名字和位置; 数据库建立日期。
为了安全起见,允许控制文件被镜象。
每一次ORACLE数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开。当数据库的物理组成更改时,ORACLE自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。
【我对Oracle图形界面使用心得】
Oracle数据库是一个大型系统,具有强大的数据定义、操纵、组织和存储和维护等管理功能,还具有一定的数据通信接口功能,且分有图形操作界面和文本操作界面。听老师说学习数据库技术就是要学习其语言,熟悉掌握文本操作能有效提高数据库技术。但作为一个初次与实体数据库接触的学生,我更喜欢图形操作界面。在几次尝试中我有以下体会: 【优点】
(1)图形界面给人的第一印象就是直观,相比起纯语言的模式,图形界面能更好的体现你的操作。因为学习数据库以来,老师所讲解的都是一些查询语言,和命令行之类的语言的知识。而通过直观的图形界面,使我数据库的基本结构(物理存储结构、逻辑存储结构)有了更为深刻的了解体会,看到了oracle数据库的一些优秀的特性。和一些优秀的操作功能。
(2)使用图形界面能够更加快捷且准确的行使数据库的各种操作。因为oracle数据库支持图形等操作,使得一些需要用SQL语句或是命令行的操作可以通过简单的拖放点击图形即可完成,这一方面减少了错误的发生,一方面也简化了工作任务。
(3)图形操作界面包含了语句操作的所有功能,而且还能通过教程或是文档获得帮助,这使得你能在使用的过程中克服一些困难。最重要的是,在图形界面的使用过程中你可以直观清晰的看到各种操作产生的结果,加深你对数据库中各种关系的理解。
【缺点】
(1)使用图形界面不能做到像语言命令操作的多变性,一部分操作通过语言能够简单化,例如对于很多对象的查询和修改,就比较适合用语言操作,这体现了图形界面操作的局限性。
(2)图形界面所占用系统资源大,不利于多用户的并行操作。也减低了系统的处理能力。最关键的是图形界面不容易维护和修改对象(3)无逻辑
图形操作是一个非结构化的操作集合,先后顺序完全掌握在操作者手中。这种操作过程很容易出错,而文本操作着可以利用语句有效控制。
【总结】
虽然使用oracle一段时间,但是要学的东西实在是太多了,不仅是数据库软件本身,还有SQL语言也是要好好学的,虽然说觉得图形界面好,方便,但是如果最基本的语言没学好,还是不能有所作为的。
第三篇:Oracle数据库总结范文
创建表及命名规则?
表名和列名:
必须以字母开头 必须在1–30个字符之间
必须只能包含A–Z, a–z, 0–9, _, $, 和# 必须不能和用户定义的其他对象重名 必须不能是Oracle 的保留字 Oracle默认存储是都存为大写
增删改查语法?
增加: 例如:使用INSERT语句往customers表中插入数据,指定相关列和值 INSERT INTO customers(customer_id, first_name, last_name, dob, phone)VALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');
如果为表所有列都指定值,那么可以忽略列清单
INSERT INTO customersVALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');
可以使用NULL为某些列指定空值
INSERT INTO customersVALUES(8, 'Sophie', 'White', NULL, NULL);
查询:select * fromcustomers;或者select字段 fromcustomerswhere条件 删除:deletefromcustomerswhere条件
更改:update customersset name = 'xiaoming',age = ‘16’(更改多个字段时候用逗号隔开)where 条件
对查询结果进行排序?
语句:select * fromcustomersorderby字段 desc;
(asc(升序),desc(降序)如果不写,默认升序)
NULL值了解么?
NULL值表示未知的值。它是一个特殊的值,但并不是空字符串,NULL值表示该列是未知的。当某些查询语句在输出结果列上看不到值的时候,可能就是NULL值
NVL()和NVL2():
NULL值被查询出来的时候没有显示信息,如何告知用户这是空字符串还是NULL,这可以通过NVL()函数来进行处理
NVL(x,value)是有value显示本身,null显示为替换的value NVL2(x,value1,value2)是如果x不为NULL值,返回value1,否则返回value2 例程:
select name,nvl2(email,'已知','未知')from student;【代码含义:代表如果email字段中有值,则显示已知,null则显示未知,如果想显示本来的查询结果select name,nvl(email,'未知')from student;】 update student set name = replace(name,'小','大');【代码含义:代表将STUDENT表中NAME 字段中如果含有小字,那么就将小字替换为大字(操作的不是显示结果,而是将表中数据进行更改)】
Oracle中的简单函数?
字符串函数
concat:将x和y拼接起来,并返回新字符串
例程:
select concat(first_name,'-'||last_name)姓名 from customers; Instr字符查找,从1开始。
select instr('asdbcrdbewqrbmde','b')from dual;select instr('asdbcrdbewqrbmde','b',5,2)from dual;【代表从第5个字符开始,第二个b所在的位置】
Ltrim : LTRIM(x,[trim_string])从x字符串左侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除左侧空白字符
Rtrim RTRIM(x,[trim_string])从x字符串右侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除右侧空白字符 Trim TRIM(trim_string FROM x)从x字符串两侧去除trim_string字符串
Replace REPLACE(x, search_string, replace_string)从字符串x中搜索search_string字符串,并使用replace_string字符串替换。用select执行并不会修改数据库中原始值,但是用update执行可以修改。
Substr SUBSTR(x, start,[length])返回字符串中的指定的字符,这些字符从字符串的第start个位置开始,长度为length个字符;如果start是负数,则从x字符串的末尾开始算起;如果length省略,则将返回一直到字符串末尾的所有字符
例程:
select substr('abcd月fg',4,2)from dual;(结果:d月)select substr('abcdefg',-2)from dual;(结果:fq)
日期函数
Sysdate 例程:
Selectsysdatefromdual;
Select to_char(sysdate, 'yyyy-mm-dd-hh-mm-ss')from dual;
Add_months(d1,n1) last_day():
转换函数
To_char TO_CHAR(x,[ format])将x转化为字符串。format为转换的格式,可以为数字格式或日期格式
select to_char(sysdate,'yyyy-mm-dd')from dual;【一般在查询时候使用,使返回的值成为指定格式】
to_date TO_DATE(x,[format])将x字符串转换为日期
insert into student values(seq_stu.nextval,'小明',to_date('1992-2-18','yyyy-mm-dd'),default,'北京',null);【一般在添加使用】 返回所查询的值中最后一个日期数据。
聚合函数
Avg:平均数 Sum:求和 Max:最大值 Min:最小值 Count:返回统计的行数 Round:四舍五入
例程:
select round(avg(bid),1)from bug;分组了解么?
有时需要对表中的行进行分组,然后统计每组的信息,可以使用GROUP BY进行分组,然后再对每组进行统计。
(1)可以使用GROUP BY对多个列进行分组
例:
SELECT product_id, avg(customer_id)FROM purchases GROUP BY product_id;
(2)可以对分组后的行使用聚集函数,聚集函数会统计每组中的值,对于每组分别统计后返回一个值 例:
SELECT
product_type_id,BY
COUNT(ROWID)FROM
BY
productsGROUP product_type_id;注意:
product_type_idORDER a)如果查询中使用了聚集函数,被查询的列未使用聚集函数处理,那么这些列必须出现在GROUP BY子句后,否则,会提示ORA-00937错误
b)不能使用聚集函数作为WHERE子句的筛选条件,否则,会提示ORA-00934错误
c)可以使用HAVING子句过滤分组后的行
SELECT...FROM...WHERE GROUP BY...HAVING...ORDER BY...;(GROUP BY使用时可以不使用HAVING,但是使用HAVING时必须有GROUP BY才有意义)
(3)同时使用WHERE, GROUP BY和HAVING
a)首先,执行WHERE筛选掉不符合条件的行 b)然后,将符合条件的行使用GROUP BY进行分组 c)最后,使用HAVING对分组统计的结果进行再次筛选 例:
SELECT product_type_id, AVG(price)FROM products
WHERE price < 15
GROUP BY product_type_id HAVING AVG(price)> 13 ORDER BY product_type_id;
表的约束条件?
目的:
确保表中数据的完整性。
常用的约束类型: 主键约束(PRIMARY KEY):要求主键列数据唯一,并且不允许为空 非空约束(NOT NULL):指定的列的值不允许为空
唯一键约束(UNIQUE):要求该列唯一,允许为空,但只能出现一个空
值
检查约束(CHECK):指定表中一列或多列可以接受的数据值格式 默认约束(DEFAULT):指定某列的默认值
外键约束(FOREIGN KEY):用于建立和加强两个表数据之间连接的一
列或多列。通过将表中的主键列添加到另一个表中。可以创建两个表之间的连接。这个主键的列就称为第二个表的外键。外键约束就可以确保添加到外键表中的任何行都在主表中都存在相应的行
多表查询?
不同的数据存储在不同的表中,通常要查询多张表才能找到需要的数据
例程: SELECT products.name, product_types.name FROM products, product_types WHERE
products.product_type_id
= product_types.product_type_id AND products.product_id = 3;
products表和product_types表相关字段会用在SELECT语句及WHERE子句上,可以给表起别名,提高代码可读性、降低书写难度 例程:
SELECT p.name, pt.name FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 3 注意:
如果查询两张表,并且没有定义连接条件,那么查询的结果集是两表相乘的结果,这样的情况称之为笛卡尔乘积。总结:多表查询WHERE时,连接次数=查询时连接表的数量-1
常见的三种连接类型:
内连接:
内连接返回的行只有满足连接条件才会返回。如果连接条件的列中有NULL值,那么该行则不会返回 外连接:
外连接返回的行满足连接条件,也包括在连接条件的列包含空值的行
自连接:
连接的表为同一张表
子查询?
子查询是嵌入到另一个SELECT语句中的一个SELECT语句。通过使用子查询,可以使用简单的语句组成强大的语句。当需要从表中选择行,而选择条件却取决于该表自身中的数据时,子查询非常有用。
单行子查询:(1)可以将另外一个查询作为WHERE子句的子查询
例:查询尾名是‘Brown’的首名和尾名
SELECT first_name, last_name FROM customers
WHERE customer_id =
(SELECT customer_id FROM customers WHERE last_name = 'Brown');(2)在单行子查询还可以使用其他比较运算符,如<>、<、>、<=和>= 例:查询价格大于平均价格的商品编号、名称及价格
WHERE子句中使用>,以及子查询中使用AVG()聚集函数
SELECT product_id, name, price FROM products WHERE price >(SELECT AVG(price)FROM products);(3)在HAVING子句中使用子查询
HAVING是在分组统计后用于过滤行,同样在HAVING子句后面可以跟子查询。单行子查询将返回结果用于HAVING子句过滤分组统计的行
例如:查询平均价格小于最大平均值的商品编号及平均值
SELECT product_type_id, AVG(price)FROM products GROUP BY product_type_id HAVING AVG(price)<(SELECT MAX(AVG(price))FROM products GROUP BY product_type_id)ORDER BY product_type_id;
分页查询?
可以通过ROWNUM来实现。
序列?
序列是一个数据库对象,用于生成一系列的整数。
索引?
索引是与表关联的可选结构。可以创建索引以加快对表执行SQL语句的速度。就像书的索引可以帮助我们更快速的查找信息一样,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('2009-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)>2000;注意:分组函数可以嵌套使用,但是在组函数嵌套使用的时候不能再出现分组条件的查询语句
如下语法是错误的: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; 1.constraint约束: alter table [table_name] add constraint [pk_name] primary key(pkname);//添加主键 alter table [table_name] drop constraint [pk_name];//删除主键 alter table [table_name] add constraint [fk_name] foreign key(fkname)references [tablename](fkname);//添加外 键 alter table [table_name] drop constraint [fk_name];//删除外键 2.union 关键字: A username, B username rod bruce rose marina select username from A union select username from B 2、几个高级查询运算词 A: UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来 自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。 C: INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 3.复合主键一般不设外键 4.组函数也称为聚合函数。 例如:我们把学生可以分为男生和女生两个组,如果想求每组的人数,平均身高,平均年龄等,就需要用到分组函数了。 在SQL中常用的组函数有以下几个: COUNT():求出全部的记录数 MAX():求出一组中的最大值 MIN():求出一组中的最小值 AVG():求出一组中的平均值 SUM():求和 范例:COUNT()函数 SELECT COUNT(empno)FROM emp; 我们常用COUNT(*),最好能够用字段代替* 范例:MAX()、MIN()函数,求最大最小值,一般是针对于数值的字段的,求出所有员工的的最高工资,和最底工资和平均工 资。 SELECT MAX(sal)最高工资,MIN(sal)最底工资,AVG(sal)平均工资 FROM emp; 范例:求出部门10的所有员工工资的总合 SELECT SUM(sal)工资综合 FROM emp WHERE deptno=10; 如果如下查询输出部门编号和其部门所有员工的工资总和,会产生错误。 SELECT deptno ,SUM(sal)工资综合 FROM emp WHERE deptno=10; 错误: “不是单组分组函数” 发生以上的错误信息,是因为这样的查询需要进行分组统计。 分组统计有其固定的语法格式: SELECT {DISTINCT} *| 查询列 列别名1,查询列2 列别名2,…… FROM 表名称1 表别名1,表名称2 表别名2,…… {WHERE 条件(s)} {ORDER BY 排序的字段1,排序的字段2 ASC|DESC} {GROUP BY 分组字段} 所以老师写的是错的! 5.//从t_student表中删除名字重复的记录的信息 delete from t_student where sid not in(select sid from(select min(sid)sid,sname from t_student group by sname)); // delete from tablename where id not in(select max(id)from tablename group by col1,col2,...) 6.sequence 在oracle中sequence就是序号,每次取的时候它会自动增加。sequence与表没有关系。 (1) CREATE SEQUENCE seqTest INCREMENT BY 1--每次加几个 START WITH 1--从1开始计数 NOMAXvalue--不设置最大值 NOCYCLE--一直累加,不循环 CACHE 10;--设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为----NOCACHE(2) 定义好sequence后,你就可以用currVal,nextVal取得值。 CurrVal:返回 sequence的当前值 NextVal:增加sequence的值,然后返回 增加后sequence值 eg: SELECT Sequence名称.CurrVal FROM DUAL; select seqtest.currval from dual(3) 在Sql语句中可以使用sequence的地方: -不包含子查询、snapshot、VIEW的 SELECT 语句 -INSERT语句的子查询中 -INSERT语句的values中 -UPDATE 的 SET中 如在插入语句中 insert into 表名(id,name)values(seqtest.Nextval,'sequence 插入测试'); 7.范式: 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一 列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分 为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式 就是无重复的域。 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。 第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作 为实体的唯一标识。第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一 部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一 对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。例如在员工表中的身份证号码即可实现每个一员工的区分,该身份证号码即为候选键,任何 一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号 进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被 添加的编号或ID选作主键。 第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门 有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简 介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有 大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传 递依赖于主属性。第五篇:Oracle数据库 知识点总结