本文共 4638 字,大约阅读时间需要 15 分钟。
1.oracle中的exists 和not exists 用法:
exists (sql 返回结果集为真)
not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1 A1 2 A2 3 A3表B
ID AID NAME 1 1 B1 2 2 B2 3 2 B3表A和表B是1对多的关系 => B.AID
SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为 1 A1 2 A2 原因可以按照如下分析 SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1) —>SELECT * FROM B WHERE B.AID=1有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
—>SELECT * FROM B WHERE B.AID=2有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
—>SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因
SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B)NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)2.select 1 from … sql语句中的1代表什么意思?
我们都知道,用exists代替in可以提高sql语句的执行效率,例如如下两个例子:
检索部门所在地为 NEW YORK’的员工信息。使用IN
select * from scott.emp
where deptno in ( select deptno from scott.dept where loc=‘NEW YORK’); 1 2 3 使用 existsselect * from scott.emp
where exists ( select 1 from scott.dept where scott.dept.deptno=scott.emp.deptno and loc=‘NEW YORK’); 1 2 3 注意,这里出现了一个特殊用法select 1 ? 比如说,使用select 1 from table的结果是临时得到1列(列的值为1),其行数为表的记录数(行数),如果配合exists 语句则可以快速查询结果是否存在,而结果的具体数据不涉及到。 就像我上述提供的例子,它只查询验证dept表的字段deptno和emp的字段deptno是否有相等的情况,并且loc=‘NEW YORK’,而不需要知道dept表和emp表哪些记录存在那样的情况,也不需要知道相等情况下其他字段的值。在应用中,效率比select * 快。 扩展: select 1 from table;与select anycol(目的表集合中的任意一行) from table;与select * from table 从作用上来说是没有差别的,都是查看是否有记录,一般是作条件查询用的。select 1 from 中的1是一常量(可以为任意数值),查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。oracle的 listagg() WITHIN GROUP ()函数使用:
使用 ?listagg() WITHIN GROUP () ?将多行合并成一行:
SELECT
T .DEPTNO, listagg (T .ENAME, ‘,’) WITHIN GROUP (ORDER BY T .ENAME) names FROM SCOTT.EMP T WHERE T .DEPTNO = ‘20’ GROUP BY T .DEPTNOoracle的语法start with和connect by nocycle:
start with 是指从哪个节点开始递归查询connect by nocycle,是指查询下一行的条件,或者叫连接条件 其中nocycle是当递归出现环的时候终止该分支查询,这是oracle 10G中闲添加的功能,不适用nocycle,当查询时出现环时,oracle会报错
?创建序列:
create sequence hw_wis_ccp_t_s start with 1 increment by 1 minvalue 1 nomaxvalue nocycleOracle 中 decode 函数用法
含义解释: decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)该函数的含义如下:
IF 条件=值1 THEN RETURN(翻译值1) ELSIF 条件=值2 THEN RETURN(翻译值2) … ELSIF 条件=值n THEN RETURN(翻译值n) ELSE RETURN(缺省值) END IFdecode(字段或字段的运算,值1,值2,值3)
这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多
使用方法:
1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值 sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1 例如: 变量1=10,变量2=20 则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。2、此函数用在SQL语句中,功能介绍如下:
Decode函数与一系列嵌套的 IF-THEN-ELSE语句相似。base_exp与compare1,compare2等等依次进行比较。如果base_exp和 第i 个compare项匹配,就返回第i 个对应的value 。如果base_exp与任何的compare值都不匹配,则返回default。每个compare值顺次求值,如果发现一个匹配,则剩下的compare值(如果还有的话)就都不再求值。一个为NULL的base_exp被认为和NULL compare值等价。如果需要的话,每一个compare值都被转换成和第一个compare 值相同的数据类型,这个数据类型也是返回值的类型。
Decode函数在实际开发中非常的有用
结合Lpad函数,如何使主键的值自动加1并在前面补0
select LPAD(decode(count(记录编号),0,1,max(to_number(记录编号)+1)),14,‘0’) 记录编号 from tetdmiseg:
select decode(dir,1,0,1) from a1_interval
dir 的值是1变为0,是0则变为1
比如我要查询某班男生和女生的数量分别是多少?
通常我们这么写:
select count(*) from 表 where 性别 = 男;
select count(*) from 表 where 性别 = 女;
要想显示到一起还要union一下,太麻烦了
用decode呢,只需要一句话
select sum(decode(性别,男,1,0)),sum(decode(性别,女,1,0)) from 表
eg:
select sum(decode(siteno,‘LT’,1,0)),sum(decode(siteno,‘SZ’,1,0)) from facd605;
select sum(case siteno when ‘LT’ then 1 else 0 end),sum(case siteno when ‘SZ’ then 1 else 0 end) from facd605;
vinson
FND_GLOBAL.USER_ID(SERVER) RETURN NUMBER 返回登陆者的ID
FND_GLOBAL.LOGIN_ID RETURN NUMBER; 返回登陆ID/*
定时器:
Timer timer = new Timer();
timer.schedule(new TimerTask() { public void run() { // 逻辑代码 } }, 3600000);//一小时import java.text.ParseException;
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask;/**
*/
public class TestTask {? public static void main(String[] args) {
??? TimerTask task = new TimerTask() {
??? @Override ??? public void run() { ??? // task to run goes here ??? System.out.println(“Hello !!!”); ??? } ??? }; ??? Timer timer = new Timer(); ??? long delay = 0; ??? long intevalPeriod = 1 * 1000; ??? // schedules the task to be run in an interval ??? timer.scheduleAtFixedRate(task, delay, ??? intevalPeriod); ? }}
转载地址:http://akusi.baihongyu.com/