分类目录归档:ORACLE

oracle minus使用

minus返回在第一个查询结果中与第二个查询结果不相同的那部分记录,minus的作用简单来说是对第一个表去同留异。

表A、表B,表A和表B有交集,我们要取表A中去掉交集后的所有记录。也就是下图中单独画红线的部分。

例如:
表t111内值为1、2、3,表t222内值为3、4。以t111为基表使用minus之后返回结果是:1、2。

代码:

drop table t111;
drop table t222;

create table t111
(
id varchar2(2)
);

create table t222
(
id varchar2(2)
);

insert into t111 values ('1');
insert into t111 values ('2');
insert into t111 values ('3');

insert into t222 values ('3');
insert into t222 values ('4');

(select * from t111)
MINUS
(select * from t222);

执行结果:

ID
----------
1
2

参考资料:
http://bbs.csdn.net/topics/270003462
http://www.cnblogs.com/chshnan/archive/2011/11/14/2248731.html
http://hi.baidu.com/wangzhiqing99/item/8281bae7c251bf2c6cabb82b

oracle in使用

oracle in可以用来筛选某个字段等于多个值的情况。

1、in对后面写数字的有1000个的数量限制,如果超过1000个要用:in(1000个数字) or in (剩余数字)
2、in后面跟子查询没有数量限制:in(select XXXXXXXXX)

简单的例子:
1)

select * from emp where deptno in ('20', '30');

–in后面是单引号引起来的值,有数量限制。

2)

select * from emp t0 where t0.deptno in (select t1.deptno from dept t1);

–in后面是一个子查询,没有数量限制。

3)

select * from emp where empno in
(
select rownum as id from dual connect by level <= 7500 );

--查询empno在7500范围内的记录。

oracle with as子句

oracle中with as子句相当于把一个子查询的语句块定义一个别名(临时表),在之后紧跟的select查询中可以重复使用。

格式:
WITH <alias_name> AS
(
subquery_sql_statement
)
SELECT <column_name_list> FROM <alias_name>;

要注意的是在with as子句后面只能跟一个select查询语句,with生成的临时表在select结束后就会被释放掉。
使用with的好处是使代码的结构更清晰。在多次对一个子查询使用时,效率更高。

例子:
–查询出部门的总工资

WITH DEPT_COSTS AS
(SELECT D.DNAME, SUM(E.SAL) DEPT_TOTAL
FROM DEPT D, EMP E
WHERE E.DEPTNO = D.DEPTNO
GROUP BY D.DNAME)
select * from DEPT_COSTS;

参考资料:
http://blog.itpub.net/11759632/viewspace-1060884/

oracle中update和for update

update
对表中一行记录的修改,修改时会加锁。

select … for update
对满足条件的select结果集加锁。
如果结果集只要有一行记录被另一个session加锁,那么就会阻塞,直到那个session最后commit或者rollback之后执行。

select … for update nowait
如果满足条件的结果集只要有一行已经加锁了,不等待立即返回错误:
ORA-00054: resource busy and acquire with NOWAIT specified

for update和for update nowait加上的是一个行级排它锁。update加上的是一个共享锁,也就是说在update的时候可以对记录查询,但是查询出的结果可能就是update之前的值了。

oracle spool命令

spool是sqlplus的内置命令,作用是将数据库中的字段导出为文本,一般都是通过shell脚本来实现。

举例:test.sh

#! /bin/sh

sqlplus -s scott/tiger<<EOF
	set head off
	set linesize 20000
	set echo off
	set feedback off
	set pagesize 0
	set termout off
	set trimout on
	set trimspool on
		spool /home/test.txt
			select empno || '|' || ename || '|' || job || '|' || 
			mgr || '|' || hiredate || '|' || sal || '|' || 
			comm || '|' || deptno from emp;
		spool off
		exit;
EOF


spool常用的设置:
set head off:输出域标题,缺省为on
set linesize 20000:linesize可以设置的大点,防止一行长度不够
set echo off:显示sqlplus中的每个sql命令本身,缺省为on
set feedback off:回显本次sql命令处理的记录条数,缺省为on
set pagesize 0:输出每页行数,缺省为24,为了避免分页,可设定为0
set termout off:显示脚本中的命令的执行结果,缺省为on
set trimout on:去除标准输出每行的拖尾空格,缺省为off
set trimspool on:去除重定向(spool)输出每行的拖尾空格,缺省为off

参考资料:
http://wallimn.iteye.com/blog/472182
http://wenku.baidu.com/link?url=UaJq13FHgH87D5wITX0zcS4XxB6GkPec8mkNIuDP5hWiPvmhk2L-5sEOgECU2xRAfosPnwh3bgPpPmHNTICtE1qxsTuxPaI4ktuu9EVQNcG

SQL中and和or优先级

优先规则

求值顺序  
1 算术运算
2 连字操作
3 比较操作
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 NOT 逻辑条件
7 AND 逻辑条件
8 OR 逻辑条件

使用圆括号改变优先规则

如果不带括号,where条件中and和or共存时,会以or来分割

在emp表中查询,薪水大于1500,部门号为10或者奖金大于0的记录:

select * from emp where sal >1500 and deptno = 10 or comm > 0;

上面一句结果会和预期不符,因为or优先级比and低,所以where后的条件分为sal >1500 and deptno = 10(条件一)或者comm > 0(条件二)。

遇到这种情况需要加括号:

select * from emp where sal >1500 and (deptno = 10 or comm > 0);

参考资料:
http://blog.163.com/xiaosanshaoli@126/blog/static/2979216320093294392425/

PL/SQL基础学习笔记(2)-游标、存储过程、函数、触发器

–1、游标
–cursor游标,游标是指向一个select语句结果集的指针

declare
  cursor c
  is select * from emp;
  v_emp c%rowtype;
begin
  open c;
  fetch c into v_emp;
    dbms_output.put_line(v_emp.ename);
  close c;
end;
/


说明:
1)首先声明游标指向一个结果集。
2)定义变量v_emp是游标所指向的结果集的记录类型。
3)open c,打开游标,只有打开游标后,PL/SQL才会执行声明游标的select语句。
4)fatch c into v_emp,把当前游标指向的这条记录放在v_emp变量里面。
fatch执行后游标自动向下移动一行记录。指向下一条记录。
5)用完游标后要close。
继续阅读PL/SQL基础学习笔记(2)-游标、存储过程、函数、触发器

PL/SQL基础学习笔记

PL SQL是在oracle里面的编程语言,用来写存储过程、触发器、函数等等。
PL SQL语言是SQL的补充。SQL没有分支,没有循环,是第四代编程语言,非过程的,只要求得结果。

PL SQL写程序非常的固定:
[DECLARE]
–声明部分,可选。声明各种变量游标
BEGIN
–执行部分,必须。从这儿开始,程序开始执行
[EXCEPTION]
–异常处理部分,可选。相当于catch到exception时执行的东西
END;
–结束,end后要有分号

–最简单的语句块

begin
  dbms_output.put_line('Hello World!');
end;
/


说明:
1)必须先执行

set serveroutput on;

才能看到输出
2)“/”表示执行,相当于输入了run;
继续阅读PL/SQL基础学习笔记

oracle数据库对象-视图

视图是数据库里的一个对象。视图是一个子查询,或者说就是一张表。视图里的表是虚表。
视图名称一般以vi或v$开头。

–为test_t表创建视图

create view vi_test_t as select id AAAA, no BBBB, t_name CCCC, s_name DDDD, score EEEE from test_t where score > 60;

–查询视图

select * from vi_test_t;

AAAA BBBB CCCC DDDD EEEE
2 2 Mary 李四 99
3 3 Tom 王五 76

。。。以下记录省略
继续阅读oracle数据库对象-视图

SQL union学习

union和union all都是将多个查询的结果集合并到一张表里。union缺省在合并结果集后消除重复项,union all指定在合并结果集后保留重复项。
union默认用第一个字段进行排序,当然也可以在最后一个结果集里用order by子句排序。

把TEST_T表重新改一下:

drop table test_t;

CREATE TABLE
TEST_T
(
ID NUMBER,
NO NUMBER,
T_NAME VARCHAR2(50),
S_NAME VARCHAR2(50),
SCORE NUMBER
);

insert into TEST_T VALUES(1, 1, 'Peter', '张三', 60);
insert into TEST_T VALUES(2, 2, 'Mary', '李四', 99);
insert into TEST_T VALUES(3, 3, 'Tom', '王五', 76);

继续阅读SQL union学习