博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.oracle中的exists 和not exists 用法:
阅读量:4102 次
发布时间:2019-05-25

本文共 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无值返回真所以没有数据

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 * from scott.emp

where deptno in (
select deptno from scott.dept where loc=‘NEW YORK’);
1
2
3
使用 exists

select * 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 .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);//一小时

import java.text.ParseException;

import java.text.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);
? }

}

转载地址:http://akusi.baihongyu.com/

你可能感兴趣的文章
MySQL-分布式架构-MyCAT
查看>>
设计模式六大原则(6):开闭原则
查看>>
阿里面试总结--JAVA
查看>>
Servlet的生命周期
查看>>
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
【设计模式】—-(2)工厂方法模式(创建型)
查看>>
有return的情况下try catch finally的执行顺序(最有说服力的总结)
查看>>
String s1 = new String("abc"); String s2 = ("abc");
查看>>
JAVA数据类型
查看>>
Xshell 4 入门
查看>>
SoapUI-入门
查看>>
Oracle -常用命令
查看>>
JAVA技术简称
查看>>
ORACLE模糊查询优化浅谈
查看>>
2016——个人年度总结
查看>>
2017——新的开始,加油!
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.1、类和实例
查看>>