`
陈静静2014
  • 浏览: 41942 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

oracle数据查询与操作

阅读更多
数据查询
1、查询的基本用法:
1) ROWNUM:虚列。用来显示行号
2) 算术运算符:+ - * / 用于显示计算列
3) as:用来起别名,用于改变列表表头的显示。(as可省略,但列名与其别名之间得用空格隔开。别名中若含有空格、特殊字符、或大小写敏感,则需要用双引号将之引起来)
4) ||:连接运算符。可以将两个字符串连接在一起
5) DISTINCT:消除重复行。此关键字要紧跟在 SELECT 之后
2、查询结果的排序
ORDER BY 字 段 名 1  [ASC|DESC][, 字 段 名 2 [ASC|DESC]...];
order by从句在select语句的最后。ASC表示升序,DESC表示降序。默认为升序。
条件查询
1、 简单条件查询
比较运算符

字符串比较区分大小写。Eg: WHERE job=‘SALESMAN’ 。条件中的字符串和日期型数据的值是包含在单引号中的。字符的值对大小写敏感,在emp表中存放的职务字符串全部是大写。
2、 符合条件查询
逻辑运算符

运算的优先顺序是NOT,AND,OR。如果要改变优先顺序,可以使用括号。
3、 条件特殊表示法



BETWEEN…AND查询范围中包含上下限的值。Exists比IN更快,最慢的是NOT操作。不等于是<>.
select /*+INDEX(emp1 I_deptno)*/ * from emp1 where exists (select 1 from dept where dept.deptno=emp1.deptno and deptno=20 )
like中%:代表0个或多个任意字符。 _ :代表一个任意字符
虚表dual
Oracle系统中dual表是一个“神秘”的表,该表只有一行一列, oracle保证dual里面永远只有一条记录
1) 查看当前用户 : select user from dual;
2) 获得当前系统时间: select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
3) from dual; select sysdate from dual;
4) 获得一个随机数: select dbms_random.random from dual;
5) 获得序列sequence的下一个值: select my_seq.nextval from dual;
6) 获 得 主 机 名 : select SYS_CONTEXT('USERENV','TERMINAL') from dual
函数
1、 数值型函数

cos函数的输入参数应为弧度
round函数按照第二个参数指定的位置对第一个数进行四舍五入。2代表对小数点后第三位进行四舍五入,0 代表对小数位进行四舍五入,?1代表对个位进行四舍五入。
trunc该函数按照第二个参数指定的位置对第一个数进行截断。2代表对小数点后第三位进行截断,0 代表对小数位进行截断,-1代表对个位进行截断。
------递归查
SELECT ORGNUM, ORGNAME, ROLLUPORGNUM, ORGLEVEL FROM ORG CONNECT BY PRIOR ORGNUM = ROLLUPORGNUM START WITH ORGNUM = 3 order by orglevel;
2、 字符型函数

rpad函数向字符串的右侧添加字符,以达到指定宽度。concat函数是连接两个字符串
instr(ename,'S‘,1,1)函数返回ename中从第一个字符位置开始,字符串“S”第一次出现的位置。如果函数返回0,则说明ename中不包含字符串“S”;如果函数返回值大于0,则说明ename中包含字符串“S”
3、 日期型函数
SYSDATE是返回系统当前时间的虚列函数。日期显示格式为默认格式,如“06-2月-03”表示03年2月6日。

* 对日期的值加减一个天数,得到新的日期。
* 对两个日期相减,得到相隔天数。
* 通过加小时来增加天数,24小时为一天,如12小时可以写成12/24(或0.5)。
4、 转换函数
Oracle的类型转换分为自动类型转换和强制类型换。常用的类型转换函数有TO_CHAR、TO_DATE或TO_NUMBER。TO_CHAR转换成字符串类型TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS AM DY');TO_DATE转换成日期类型。to_date('2004-11-27 13:34:43','yyyy-mm-dd hh24:mi:ss')。TO_NUMBER转化成数值类型
高级查询
1、 多表联合查询
通过连接可以建立多表查询,多表查询的数据可以来自多个表,但是表之间必须有适当的连接条件。为了从多张表中查询,必须识别连接多张表的公共列。一般是在WHERE子句中用比较运算符指明连接的条件。忘记说明表的连接条件时,将会产生表连接的笛卡尔积(即一个表中的每条记
录与另一个表中的每条记录作连接产生的结果)。一般N个表进行连接,需要至少N-1个连接条件,才能够正确连接。
两个表的连接有四种连接方式:
* 相等连接(内连接)
Where中增加的条件用AND连接。
Eg:显示雇员的名称和所在的部门的编号和名称。
执行以下查询:SELECT emp.ename,emp.deptno,dept.dname FROM emp,dept WHERE emp.deptno=dept.deptno;
使用内连接的方式如下:SELECT emp.ename,emp.deptno,dept.dname FROM emp inner join dept on emp.deptno=dept.deptno;
* 不等连接。
* 外连接
外连,即除了显示满足相等连接条件的记录外,还显示那些不满足连接条件的行,不满足连接条件的行将显示在最后。外连操作符为(+),它可以出现在相等连接条件的左侧(左外连接)或右侧(右外连接)。
Eg:显示雇员的名称、工资和所在的部门名称及没有任何雇员的部门。
执行以下查询:SELECT ename,sal,dname FROM emp,dept WHERE emp.deptno(+)=dept.deptno;
left outer join 即左外连接方式:
SELECT ename,sal,dname FROM emp left outer join dept on emp.deptno=dept.deptno;
* 自连接。
2、 统计查询
组函数可以对分组的数据进行求和、求平均值等运算。组函数只能应用于SELECT子句、HAVING子句或ORDER BY子句中。组函数也可以称为统计函数。
常用的组函数:

分组函数中SUM和AVG只应用于数值型的列,MAX、MIN和COUNT可以应用于字符、数值和日期类型的列。组函数忽略列的空值。使用GROUP BY 从句可以对数据进行分组。
在组函数中可使用DISTINCT或ALL关键字。ALL表示对所有非NULL值(可重复)进行运算(COUNT除外)。DISTINCT 表示对每一个非NULL值,如果存在重复值,则组函数只运算一次。如果不指明上述关键字,默认为ALL。
在分组查询的查询列中,只能包含分组的列和聚合函数列,不能使用分组列以外的其他列,否则会产生错误信息。
对分组查询的结果进行过滤,要使用HAVING从句。HAVING 从句过滤分组后的结果,它只能出现在GROUP BY 从句之后 ,而WHERE从句要出现在GROUP BY从句之前。
3、 子查询:第一个查询可以作为第二个查询的一部分出现在第二个查询的条件中
子查询一般出现在SELECT语句的WHERE子句中,Oracle也支持在FROM或HAVING子句中出现子查询。
子查询比主查询先执行,结果作为主查询的条件,在书写上要用圆括号扩起来,并放在比较运算符的右侧。
子查询可以嵌套使用,最里层的查询最先执行
Eg:查询雇员表中排在第 6 ~ 9 位置上的雇员。
执行以下查询:
SELECT  * FROM  (SELECT  rownum  as num,ename,sal FROM emp WHERE rownum<=9 ) WHERE num>=6;
4、 集合运算

union 和 union all 的区别。union 比 union all 多做了一步 distinct 操作。能用 union all 的情况下尽量不用 union。

数据操作
一、 数据库操作语句

1、插入数据
1)数据插入基本语法([]里的内容可省略)
INSERT INTO 表名[(字段列表)] VALUES ( 表达式列表);
插入字段的值的类型要和字段的类型一一对应。字符串类型的字段值必须用单引号括起来。字段列表如果省略则代表全部字段,且插入数据的顺序必须与表的字段默认顺序保持一致。如果不知道表的字段默认顺序,可以用DESCRIBE命令查看。
2) 复制数据另一种插入数据(相当于复制)方法的语法格式是:
INSERT INTO 表名(字段列表) SELECT(字段名1,字段名2, ...) FROM 另外的表名;
该形式一次可以插入多行数据。
eg:将emp表拷贝数据到manager:
步骤1:创建一个新表manager:
CREATE TABLE manager AS SELECT empno,ename,sal,job FROM emp WHERE job='MANAGER';
步骤2:从emp表拷贝数据到manager:
INSERT INTO manager SELECT empno, ename, sal,job FROM emp  WHERE job = 'CLERK';
3)使用序列
序列是一个要预先定义的有序的数值序列, 应该先建立一个序列,然后在插入语句中使用.
创建序列:CREATE SEQUENCE seq_abc INCREMENT BY 1 START WITH 2000 MAXVALUE 99999 CYCLE NOCACHE;
NOCACHE-出入内存, CYCLE-循环使用,nocycle到最大值会报错, MAXVALUE-最大
在INSERT 语句使用序列,序列的名称为abc:
INSERT INTO manager VALUES(seq_abc.nextval,' 小王 ',2500, 'CLERK');
select abc.currval from dual 当前序列值
select abc.nextval from dual 下一个序列值
2、修改数据
修改数据的语句UPDATE对表中指定字段的数据进行修改,一般需要通过添加WHERE条件来限定要进行修改的行,如果不添加WHERE条件,将对所有的行进行修改。
1) 修改数据的语句UPDATE的基本语法如下:
UPDATE 表名 SET 字段名1=表达式1, 字段名2=表达式2, ... WHERE 条件;
如果修改的值没有赋值或定义,将把原来字段的内容清为NULL。若修改值的长度超过定义的长度,则会出错。不能省略WHERE条件,否则将会修改表的所有行。
2) UPDATE语句的另外一种用法:
UPDATE 表名 SET(字段名1, 字段名2, ...)=SELECT (字段名1, 字段名2, ...) FROM 另外的表名WHERE条件;
3、删除数据
1)删除数据的基本语法如下:
DELETE FROM 表名 WHERE 条件;
要从表中删除满足条件的记录,WHERE条件一般不能省略,如果省略就会删除表的全部数据。
删除记录并不能释放Oracle 中被占用的数据块表空间,它只是把那些被删
除的数据块标成 unused 。
2)如果确实要删除一个大表里的全部记录,可以用TRUNCATE 命令,它可以释放占用的数据块表空间,
语法为:
TRUNCATE TABLE 表名;
TRUNCATE TABLE 命令用来删除表的全部数据而不是删除表,表依旧存在。数据不能恢复 , 不用 commit, 不能 rollback;
3)删除重复记录
方法原理:
1、Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的, rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。
2、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。
实现方法:
SQL> create table TA (
bm char(4), --编码
mc varchar2(20) --名称
)
insert into ta values(1,'a'); insert into ta values(2,'b');
insert into ta values(3,'c'); insert into ta values(1,'a');
insert into ta values(1,'a');
查出重复记录
SQL> select rowid,bm,mc from TA a where a.rowid!=(select max(rowid)
from TA b where a.bm=b.bm and a.mc=b.mc);
删除重复记录
SQL> delete from TA a where a.rowid!=(select max(rowid) from TA b
where a.bm=b.bm and a.mc=b.mc);

数据库事务
1、 事务
由相关操作构成的一个完整的操作单元,具有同时成功或同时失败的特点.
2、  事务的特征:ACID
1)原子性(Atomicity) : 数据库中的事务执行是作为原子,不可再分,整个语句要么执行,要么不执行
2)一致性(Consistency) : 在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏(如外键、not null)
3)理解隔离性(Isolation) : 事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据
4)理解持久性(Durability) : 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
3、 Oracle的事务控制:
1)Dirty read: 脏读意味着一个事务读取了另一个事务未提交的数据
2)Phantom read: 幻读,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。如果第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样
3)Unrepeatable Read :不可重复读,即一个事务范围内两个相同的查询却返回了不同数据
4)Lost update: 丢失更新,即两个并发的事务,后提交的事务把先提交事务的修改结果覆盖了
4、Oracle的事务控制:
1)Read uncommited :性能最佳,但允许出现脏读
2)Read commited : 不允许脏读,可能出现不可重复读,幻读
3) Repeatable Read: 可以重复读,没有脏读,可能出现幻读
4)Serializable: 性能最差,但安全性最高
Oracle默认的事务级别为read commited
5、 数据库事务的应用
数据库事务处理可分为隐式和显式两种。显式事务操作通过命令实现,隐式事务由系统自动完成提交或撤销(回退)工作,无需用户的干预。隐式提交的情况包括:当用户正常退出SQL*Plus或执行CREATE、DROP、GRANT、REVOKE等命令时会发生事务的自动提交。
如 果 把 系 统 的 环 境 变 量AUTOCOMMIT设置为ON(默认状态为OFF),则每当执行一条INSERT、DELETE或UPDATE命令对数据进行修改后,就会马上自动提交。设置命令格式如下:  SET AUTOCOMMIT ON/OFF
隐式回退的情况包括:当异常结束SQL*Plus或系统故障发生时,会发生事务的自动回退。
显式事务处理的数据库事务操作语句有3条:

6、 表的锁定
1)隐式加锁
在Oracle数据库中,修改数据操作时需要一个隐式的独占锁,以锁定修改的行 ,直到修改被提交或撤销为止。
如果一个会话锁定了数据,那么第二个会话要想对数据进行修改,只能等到第一个会话对修改使用COMMIT命令进行提交或使用ROLLBACK命令进行回滚撤销后,才开始执行。
2)显式加锁

锁定行时,直接在SELECT语句后加for update.
LOCK语句用于对整张表进行锁定。语法如下:
LOCK TABLE 表名 IN {SHARE|EXCLUSIVE} MODE
对表的锁定可以是共享(SHARE)或独占(EXCLUSIVE)模式。共享模式下,其他会话可以加共享锁,但不能加独占锁。在独占模式下,其他会话不能加共享或独占锁。
说明:当使用LOCK语句显式锁定一张表时,死锁的概率就会增加。同样地,使用COMMIT或ROLLBACK命令可以释放锁。
注意:必须没有其他会话对该表的任何记录加锁,此操作才能成功
乐观锁和悲观锁:
乐观锁( Optimistic Locking ):乐观假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁通常采用检查version、时间戳、关键数据等方式
Eg: select ver from emp where empno=7782;
update emp set sal =1909,ver=ver+1 where empno=7782 and ver=20;
悲观锁(Pessimistic Locking):在整个数据处理过程中,采取保守态度,将数据全部处于锁定 状态(不允许修改、删除)
如: SELECT * FROM emp WHERE deptno=10 FOR UPDATE;
(只允许查询,不允许修改和删除锁定的数据)
由于悲观锁在并发环境中影响性能,建议尽量使用乐观锁!
分享到:
评论
1 楼 guochongcan 2014-09-03  
悲观锁、乐观锁

相关推荐

    Oracle 数据查询器

    Oracle数据查询器的开发,体现了Delphi与Oracle数据库的完美结合,为数据库管理员和开发人员提供了一个直观、易用的界面,减少了对复杂命令行工具的依赖。通过这款工具,用户无需深入了解Oracle的底层细节,也能高效...

    通用查询分析器(Oracle数据查询)

    "通用查询分析器"就是为此目的设计的一款工具,它能够帮助用户更方便、直观地执行Oracle数据库的SQL查询操作。 通用查询分析器通常具备以下特性: 1. **图形化界面**:与命令行界面相比,通用查询分析器提供了一个...

    Oracle 大数据量操作性能优化

    Oracle 大数据量操作性能优化 Oracle大数据量操作性能优化是指在处理大量数据时,如何提高 Oracle 数据库的性能。...Oracle 大数据量操作性能优化技术可以提高 Oracle 数据库的性能,提高数据处理效率和查询速度。

    直接拷贝数据文件实现Oracle数据迁移

    总的来说,直接拷贝数据文件的迁移方式适用于特定条件下的Oracle数据迁移,它简化了传统备份恢复过程,但仍然需要谨慎操作,以避免数据丢失或不一致。在进行任何数据迁移之前,始终建议先备份源数据库,以备不时之需...

    oracle查询一个月之内数据

    根据提供的标题、描述、标签及部分内容,我们可以了解到本篇文章主要关注的是如何在Oracle数据库中查询一个月内的数据。这里的关键在于日期范围的确定以及如何利用Oracle的内置函数来完成这一任务。接下来,我们将...

    mysql-oracle数据同步

    对于“mysql-oracle数据同步”这个主题,我们可以采用以下几种方法: 1. **使用ETL工具**:Extract, Transform, Load(ETL)工具如Informatica、Talend或Kettle(Pentaho Data Integration),它们提供图形化界面,...

    oracle数据字典-数据操作

    里面有教学系统的oracle数据字典。同时插入了数据,当学习oracle时,可以利用里面的数据来进行数据操作。

    oracle数据仓库教程

    Oracle数据仓库教程是针对使用Oracle数据库系统构建和管理数据仓库的专业知识体系的深入学习资源。在数据仓库领域,Oracle以其高效、稳定和强大的功能而备受赞誉。本教程旨在帮助学习者掌握如何利用Oracle构建和优化...

    Java操作Oracle数据库(建表,插数据,删除)

    插入数据操作 在上面的代码中,我们使用了以下语句来插入数据: ```java String sql = "insert into MYFIRST values('1','liming')"; String sql1 = "insert into MYFIRST values('2','mm')"; ``` 这两个语句使用了...

    sql查询oracle时间段操作

    在SQL查询中对Oracle数据库进行时间段操作是一项关键技能,特别是在数据恢复和历史数据分析时。Oracle数据库提供了多种方式来处理时间范围的数据,包括SQL查询、闪回功能和快照。下面我们将详细探讨这些知识点。 ...

    C#实现Oracle数据批量导入

    C#实现Oracle数据批量导入 在本文中,我们将讨论如何使用C#语言实现对Oracle数据库的批量数据导入功能。本文的主要内容包括如何使用Oracle.DataAccess.Client命名空间来实现批量导入功能,以及如何使用SqlBulkCopy...

    Oracle数据查询语句执行过程分析.pdf

    Oracle 数据查询语句执行过程分析 Oracle 数据库是当前关系型数据库市场的主流产品,广泛应用于各种行业信息化系统。 Oracle 数据查询语句执行过程是了解 Oracle 数据库性能的关键。本文将详细分析 Oracle 数据查询...

    oracle 导出数据字典的小工具

    "Oracle 导出数据字典的小工具"可能利用SQL查询从上述视图中提取数据,并将其整理成易于阅读的Word表格。这种工具对于数据库管理员和开发人员非常有用,他们可以快速地获取和理解数据库的架构和配置,而无需手动编写...

    Oracle_数据库中的海量数据处理

    #### 数据仓库系统的特点与Oracle数据仓库简介 数据仓库系统是一种专门设计用于存储、管理和分析企业历史数据的信息管理系统。它的特点包括面向主题、集成性、随时间变化以及非易失性。 1. **面向主题**:数据仓库...

    Oracle11g教程_第5章_数据查询操作

    Oracle11g教程_第5章_数据查询操作,是PPT,适合初学者快速入门

    C#版Oracle数据库通用操作类

    `ConnForOracle` 类通过封装常用的数据库操作,极大地简化了 C# 应用程序与 Oracle 数据库之间的交互过程。它不仅提供了基础的连接管理和 SQL 执行功能,还包含了高级特性如数据分页和哈希表自动插入数据库等,为...

    oracle格式化查看json数据

    总结来说,Oracle提供了全面的JSON支持,包括数据类型、函数、操作符和PL/SQL包,以及客户端工具的增强,使我们能够方便地在数据库中存储、查询和格式化查看JSON数据。无论你是开发人员还是数据库管理员,理解并掌握...

    Oracle的数据仓库设计与使用

    Common Warehouse Metadata(CWM)是 Oracle 提供的元数据标准,它允许不同工具和系统之间的元数据共享,增强了数据仓库的可扩展性和互操作性。 在分析应用工具方面,Oracle 提供了面向高层管理和业务分析人员的...

    Oracle数据操作和控制语言详解.rar

    Oracle数据操作和控制语言(Data Manipulation Language, DML)是Oracle数据库系统中用于处理数据的核心部分,包括插入、更新、删除以及查询等操作。在深入理解Oracle DML之前,我们首先需要对Oracle数据库有一个...

    VC 操作oracle数据的例子程序

    在这个场景中,我们有一个名为"VC 操作oracle数据的例子程序"的项目,它展示了如何使用Visual C++(VC)与Oracle数据库进行交互。Oracle数据库是一个功能强大的关系型数据库管理系统,广泛应用于企业级应用中,而VC...

Global site tag (gtag.js) - Google Analytics