mysql exists 使用的意义
java面试题网站:www.javaoffers.com
exists 方法 判断存在,
通常我们会碰到 这种 业务 需求,查询A表中的字段的时候,查询条件涉及到了 B 表中的字段,比如:
A表:
id username password age
1 dd 123 34
2 gg 234 23
3 hh 908 45
4 uu 987 30
。。。
B表
id sex userId
1 男 1
2 女 2
3 男 3
4 男 4
。。。
C表
id role userid
1 经理 1
2 老板 2
3 经理 3
A 表为主表, B表为 子表 外键 userid 与 主表关联,C表为子表 外键为 userid
已有的业务需求:查询 姓名 ,性别, 角色
select a.name ,(select b.sex from B b where b.userid = a.id) sex, (select c.role from C c where c.userid = a.id ) role from A a
我们在公司经常遇到在别人的sql进行修改, 真实的sql 很有可能几百行,很有 可能 会关联很多 表,此时突然加一人需求条件,根据 性别查询,此时 我们首先想到的是,原来的sql 尽量 不要大修改,因为很关关联关系也不是很明白,首先观察到 sex 字段是一个 子查询,在条件中 要按照 sex 进行过滤, 我们在where 后面不能直接 引用 sex 字段,这是也 不能在 from后面追加 B 表, 这时 exists 就可以拍到用场了 ,sql如下:
select a.name ,(select b.sex from B b where b.userid = a.id) sex, (select c.role from C c where c.userid = a.id ) role from A a where exists( select 0 from B b where b.userid = a.id and b.sex ='男')
我们在 实际开发中 很多的 时候 都会 用到 exists 关键字 进行优化sql,
通常情况为 两种: 一种是 select中 有子查询 加入 输出字段为 zcx , 并且在 在 条件中需要这个 字段进行判断, 这时我们可以 利用exists 进行过滤。这时很巧妙的。
第二种是: sql 进行优化的时候,两张表的 数据太大,本人在实际的开发中实际的编写sql 中 有两 张 表,我记得一张表为 一亿多的数据 ,这里七个别名 为 A ,另一张表为 6千万的数据,这里七个别名 为 B ,而 B表需要先查询一次, 并且按照外键 和A 表进行关联, 然后将查询的结果 看作另一张表,再和A表关联, 好啦逻辑有点复杂 直接把sql 贴出来:
with cbizvivew as(
(select min(decode(cbiz_event,
'FFOP_UME_WEB_SHIPPING_WAIT',
cbiz_event_time,
null)) as firstwait, ---第一次等待时间 用于前端判断条件
min(decode(cbiz_event,
'FFOP_UME_WEB_SHIPPING_ACCEPT',
cbiz_event_time,
null)) as firstaccpt, ----第一次确认时间 用于前端判断条件
min(decode(cbiz_event,
'FFOP_UME_WEB_SHIPPING_REJECT',
cbiz_event_time,
null)) as firstreject, ----第一次拒绝时间 用于前端判断条件
min(decode(cbiz_event,
'FFOP_UME_WEB_SHIPPING_WAIT',
cbiz_event_time,
'FFOP_UME_WEB_SHIPPING_ACCEPT',
cbiz_event_time,
'FFOP_UME_WEB_SHIPPING_REJECT',
cbiz_event_time,
null)) as minbktime, ----第一次设置订舱状态时间
min(decode(cbiz_event,
'FFOP_UME_WEB_SHIPPING_WAIT',
CBIZ_ID,
'FFOP_UME_WEB_SHIPPING_ACCEPT',
CBIZ_ID,
'FFOP_UME_WEB_SHIPPING_REJECT',
CBIZ_ID,
null)) as minid, ----第一次设置订舱状态时间
max(cbiz_event_time) as fourEvntFirstTime, ---4个事件中最新的那个时间
max(decode(cbiz_event,
'EWEB_ORDER_CHANGED',
cbiz_event_time,
null)) as endoc, -----最新的一次订舱修改的时间
max(decode(cbiz_event,
'FFOP_UME_WEB_SHIPPING_WAIT',
cbiz_event_time,
null)) as endwait, ---最新的一次等待时间
max(decode(cbiz_event,
'FFOP_UME_WEB_SHIPPING_ACCEPT',
cbiz_event_time,
null)) as endaccpt, ----最新的一次确认时间
max(decode(cbiz_event,
'FFOP_UME_WEB_SHIPPING_REJECT',
cbiz_event_time,
null)) as endreject, ---最新的一次拒绝时间
cbiz_consign_id as cbiz_consign_id --- 运编号
from cbiztrace a
where a.cbiz_org_id = '83'
and a.cbiz_event in ('FFOP_UME_WEB_SHIPPING_ACCEPT',
'FFOP_UME_WEB_SHIPPING_WAIT',
'FFOP_UME_WEB_SHIPPING_REJECT',
'EWEB_ORDER_CHANGED')
and exists
(Select 1
from fconsign fcsg
where fcsg.FCSG_ORG_ID = '83'
and a.cbiz_consign_id = fcsg.FCSG_CONSIGN_ID
and fcsg.FCSG_ETD> to_date('2018-07-17 18:10:05','yyyy-mm-dd hh24:mi:ss') -- E T D
and fcsg.FCSG_ETD< to_date('2018-08-17 18:10:05','yyyy-mm-dd hh24:mi:ss')
and fcsg.FCSG_CREATE_TIME > to_date('2018-07-17 18:10:05','yyyy-mm-dd hh24:mi:ss') --创建日期
and fcsg.FCSG_CREATE_TIME< to_date('2018-08-17 18:10:05','yyyy-mm-dd hh24:mi:ss')
/*and fcsg.fcsg_vessel_en = 'KOTA PERDANA' --船名航次
and fcsg.fcsg_voyage_en = '0003E'*/
)
group by cbiz_consign_id)
)
select
cbiz.firstaccpt, cbiz.firstwait ,cbiz.firstreject,
FCSG_CONSIGN_ID, --- 运编号
FCSG_BO_NO, --- 提单号 MB/ L NO 1
FCSG_BOOKING_AGENT, --- 订舱代理代码,对应前台的舱位公司 2
FCSG_VESSEL_EN, --- 英文船名 3
FCSG_ETD, --- 船期 预离日期(出口)或到港日期(进口) 4
FCSG_CUST_CSG_NO, --- 客户业务号 5
FCSG_CONSIGN_DEPT, -- 委托单位 客户供应商行信息编号,类型为客户 6
FCSG_PAYMODE_ID, --- 付款方式 7
FCSG_TERM_ID, --- 运输条款 8
FCSG_BOK_CONTRACT_NO, --- 订舱协议号 9
FCSG_VOYAGE_EN, --- 航次 10
FCSG_SHIPPING_LINE_TRADE, --- 船公司航线 11
---rst.CACC_BL_CUT_TIME, --- 提单截单时间 12
FCSG_DISCHARGE_PORT_CODE, --- 卸货港 13
FCSG_DELIVERY_PLACE_CODE, --- 交货地 14
hy_ff_utility_pkg.F_GET_CONSIGN_CNT_TYPE_QTY(fcsg.FCSG_CONSIGN_ID,
1) ctcn, ---FCTP_CNT_TYPE ||'*'|| FCTP_CNT_COUNT 箱型箱量 15
FCSG_CONTACTOR, --- 客户联系人 16
FCSG_CONSIGN_TYPE, --- 托运类型 17
(select FCCI_IS_DANGER
from fconsigncargoinfo fio
where fio.FCCI_CONSIGN_ID = fcsg.FCSG_CONSIGN_ID
and fio.FCCI_TYPE = 1
and rownum = 1) as FCCI_IS_DANGER, --- 是否危险品 18
(select FCTP_IS_SOC
from fcontainerprepare fp
where fp.FCTP_CONSIGN_ID = fcsg.FCSG_CONSIGN_ID
and rownum = 1) issoc, --- 是否SOC箱 19
FCSG_REMARK, --- 订舱备注 20
FCSG_CREATE_TIME, --- 创建时间 21
cbiz.minbktime AS first_one_set_time, --- 第 一次设置订舱状态时间 22
(select CREATOR
from cbiztrace cb
where cb.CBIZ_ID = cbiz.minid
and rownum = 1) AS CREATOR, ---创建人 23
---当创建时间≤15:00,且第一次设置订舱状态的日期=创建日期,则判定为Y
---当创建时间>15:00,且第一次设置订舱状态的日期=创建日期+1个工作日,则判定为Y
---当创建时间≤15:00,且第一次设置订舱状态的日期>创建日期,则判定为N
---当创建时间>15:00,且第一次设置订舱状态的日期>创建日期+1个工作日,则判定为N
(case
when to_char(FCSG_CREATE_TIME, 'hh24:mi:ss') <= '15:00' and
to_char(cbiz.minbktime, 'yyyy-mm-dd') =
to_char(FCSG_CREATE_TIME, 'yyyy-mm-dd') then
'Y'
when to_char(FCSG_CREATE_TIME, 'hh24:mi:ss') > '15:00' and
to_char(cbiz.minbktime, 'yyyy-mm-dd') =
to_char(FCSG_CREATE_TIME + 1, 'yyyy-mm-dd') then
'Y'
when to_char(FCSG_CREATE_TIME, 'hh24:mi:ss') <= '15:00' and
to_char(cbiz.minbktime, 'yyyy-mm-dd') >
to_char(FCSG_CREATE_TIME, 'yyyy-mm-dd') then
'N'
when to_char(FCSG_CREATE_TIME, 'hh24:mi:ss') > '15:00' and
to_char(cbiz.minbktime, 'yyyy-mm-dd') >
to_char(FCSG_CREATE_TIME + 1, 'yyyy-mm-dd') then
'N'
else
' '
end) WHETHER_FINAL_STATE_COMPLETED, ---是否在规定时间内完成状态设置 24
(case cbiz.fourEvntFirstTime
when cbiz.endaccpt then
'订舱确认'
when cbiz.endwait then
'订舱等待'
when cbiz.endreject then
'订舱失败'
when cbiz.endoc then
'订舱修改'
else
' '
end) AS FINALS_STATE --- 最终状态25
from FCONSIGN fcsg,cbizvivew cbiz
where cbiz.cbiz_consign_id = fcsg.FCSG_CONSIGN_ID
/*and cbiz.firstaccpt > to_date('2015-07-17 18:10:05','yyyy-mm-dd hh24:mi:ss') --订舱确认
and cbiz.firstaccpt < to_date('2018-08-17 18:10:05','yyyy-mm-dd hh24:mi:ss')
*/
/* and cbiz.firstwait > to_date('2015-07-17 18:10:05','yyyy-mm-dd hh24:mi:ss') --订舱等待
and cbiz.firstwait < to_date('2015-08-17 18:10:05','yyyy-mm-dd hh24:mi:ss')
and cbiz.firstreject > to_date('2015-07-17 18:10:05','yyyy-mm-dd hh24:mi:ss') --订舱失败
and cbiz.firstreject < to_date('2015-08-17 18:10:05','yyyy-mm-dd hh24:mi:ss')*/
大家注意 : 红色的 查询条件 被注释掉, 然后在蓝色的地方进行 使用exists 进行过滤,这里我们可以 知道 先用exists 进行过滤 掉一定的数据,并且是按照索引 ,效率 是非常的高的。而红色的地方,则在 cbizvivew 中会 进行全表扫描,这样的效率是 非常慢的。 所以 我们在 sql 中 要学会 用exists 进行优化。。。。。。。。。
mysql exists 使用的意义相关推荐
- mysql exists依赖查询_MySQL EXISTS 和 NOT EXISTS 子查询
MySQL EXISTS 和 NOT EXISTS 子查询语法如下: 1 SELECT ... FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据, ...
- [转载]MySQL exists的用法介绍
原文摘自:http://www.cnblogs.com/glory-jzx/archive/2012/07/19/2599215.html MySQL exists的用法介绍 有一个查询如下: 1 S ...
- mysql exists怎么用_Mysql exists用法小结
简介 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False. EXISTS 指定一个子查询,检测行的存在.语法:EXISTS subquer ...
- mysql exists in join_子查询、left join、 exists 替代 not in
如果要实现一张表有而另外一张表没有的数据时,我们通常会这么写: SELECT id FROM user WHERE id NOT IN (SELECT id FROM student) not in不 ...
- Mysql Exists与in_在MySQL里,有个和in一样的东东叫做exists,但是它比in更牛叉,你会么?...
我们在学习Yii2的时候,一定接触过这样的where输入 $query->where(["exists",xxxx]); User::find()->where([&q ...
- MySQL EXISTS 关键字使用
是什么? 这个问题其实很好理解,简单来说,EXISTS 就是mysql中的一个关键字. 能干啥? Exists关键字的主要作用就是检查SQL语句中的子查询是否至少会返回一行数据.使用EXISTS 关键 ...
- 【MySQL】带你了解MySQL 如何学习MySQL以及MySQL的用途以及意义
目录 1 MySQL的起源和发展 1.0.1 数据库管理系统 1.1 MySQL的起源 命名由来: 1.2 MySQL的发展历程 2 什么是MySQL? 2.1 数据库 2.1.1 我们之前存储数据的 ...
- php mysql exists语句_mysql子查询 exists,not exists,all和any
(1)实现让结果集A - 结果集B:--利用not exists,合并则可用union . exists,not exists:用于判断且获取结果集A是否存在地结果集B中! ==========结果集 ...
- mysql exists例子_mysql exists用法
在mysql中,有个关键字exists比较难理解,今天就来搞明白其含义和应用 exists的使用总是跟子查询关联起来,一种是不相关子查询,对于exists来说更常用的是相关子查询 不相关子查询:子查询 ...
最新文章
- 简述安装Tsurugi Linux发行版
- python 列表、字典多排序问题
- spring mvc对异步请求的处理
- Android 完全退出程序,以及再按一次返回键退出程序
- android备忘录_苹果备忘录怎样把内容置顶?有置顶功能的备忘录便签
- 二维分类教案_二维分类大班教案
- 无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)
- 12864 C语言程序 带详细注解
- 下行文格式图片_正确的公文格式图片.doc
- 基于tcp文件传输协议C语言,文件传输协议的(C语言)实现
- 本地微信公众号授权登录获取code步骤
- (一)SLAM拓扑地图(地图的生成和显示)
- 二进制转化成ascll_怎样将二进制转ascii码
- C#自定义控件添加到工具箱:
- React+ant中的Form表单的刷新
- Java多功能计算器小程序
- eco淘客机器人-ECO云返利系统淘客
- 5分钟弄懂程序员的如何升级到架构师。
- 中国电信IPTV标准研究之机顶盒
- 多激光雷达外参标定算法与源码解析(一):基于BLAM的建图模块
热门文章
- Linux中修改用户UID和组GID的方法
- 《学Unity的猫》——第一章:故事开始
- 舰c2018换html5,[ 转] HTML/HTML5 download属性及其兼容性的探讨
- nginx php .htaccess,Linux下nginx支持.htaccess文件实现伪静态的方法
- 腾讯T2亲自教你!java开发项目分工
- 内存耗用:VSS/RSS/PSS/USS 介绍
- 关于NIST随机数测试软件报错问题的补充
- CH3NH3PbBr2I(MAPbBr2I ) 甲胺铅溴碘盐1472068-58-8
- 对特征值和特征向量的理解
- 彻底解决不要脸的360更改浏览器主页【转载】