exists (sql 返回结果集为真)
not exists (sql 不返回结果集为真)
如下:
表A
ID NAME
1 A1
2 A2
exists的用法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⽆值返回真所以没有数据
NOT EXISTS 就是反过来
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
执⾏结果为
3 A3
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 * p
where deptno in (
select deptno from scott.dept where loc=‘NEW YORK’);
1
2
3
使⽤ exists
select * p
where exists (
select 1 from scott.dept where scott.dept.p.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 .DEPTNO
oracle的语法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
nocycle
Oracle 中 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 IF
decode(字段或字段的运算,值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 tetdmis
eg:
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
/*
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
String dateStr = sdf.format(new Date()); for (CcpdItemsVO ccpdItemsVO
: ccpdItems) { ccpdItemsVO.setLastUpdateDate(dateStr); }
*/
定时器:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
// 逻辑代码
}
}, 3600000);//⼀⼩时
ParseException;
SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
Timer:可以调度任务
TimeTask:在run()⽅法中实现具体的任务
@author duanhongyan
*/
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);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论