Sql 学习查询多种条件(记录自己常用一些方法,本人学习用)
Sql 学习查询多种条件(记录自己常用一些方法,本人学习用)
- 根据 PROCDEFID 对表 BO_ACT_MPDL_PROCESS 最后就行查重 查出多余重复的数据
- 1、in和exists
- 方式二:遍历使用
- 2、not in 和not exists
- 4.exists防止插入重复记录
- 5.关于exists更多说明
- 文章 书本笔记
关联查询 查询BO_ACT_MPDL_PROCESS的appid为cwgj时候WFC_PROCESS 的ID,和BO_ACT_MPDL_PROCESS的bindid相等的数据
select * from WFC_PROCESS w where EXISTS (select 1 from BO_ACT_MPDL_PROCESS where appid='com.awspaas.user.apps.cwgl' and bindid=w.id)
查询appid 为cwgl的数据
select * from BO_ACT_MPDL_PROCESS where appid='com.awspaas.user.apps.cwgl'
查询a.appid不在 BO_ACT_DICT_KV_ITEM.CNNAME中的数据
SELECT * FROM BO_ACT_MPDL_PROCESS as a WHERE a.appid NOT IN (SELECT CNNAME FROM BO_ACT_DICT_KV_ITEM);
根据 PROCDEFID 对表 BO_ACT_MPDL_PROCESS 最后就行查重 查出多余重复的数据
select * from BO_ACT_MPDL_PROCESS
where PROCDEFID in (select PROCDEFID from BO_ACT_MPDL_PROCESS group by PROCDEFID having count(PROCDEFID) > 1);
删除重复的数据 BO_ACT_MPDL_PROCESS表名 PROCDEFID查出多出字段为唯一 id为最小的保存的数据
–删除表中多余的重复记录,重复记录是根据单个字段(id)来判断,只留有rowid最小的记录
delete from BO_ACT_MPDL_PROCESS
where PROCDEFID in (select PROCDEFID from BO_ACT_MPDL_PROCESS group by PROCDEFID having count(PROCDEFID) > 1)
and id not in (select min(id) from BO_ACT_MPDL_PROCESS group by PROCDEFID having count(PROCDEFID)>1)
查询多个字段关联的数据 查重
SELECTa.*
FROMBO_ACT_MPDL_TASK a,( SELECT PROCDEFID, TASKID FROM BO_ACT_MPDL_TASK GROUP BY PROCDEFID, TASKID HAVING COUNT ( 1 ) > 1 ) AS b
WHEREa.PROCDEFID= b.PROCDEFID AND a.PROCDEFID= b.PROCDEFID
查出重复的数据 然后把重复得数据展示下 重复的展示的时候只展示一个
SELECTa.*
FROMBO_ACT_MPDL_TASK a,( SELECT PROCDEFID, TASKID FROM BO_ACT_MPDL_TASK GROUP BY PROCDEFID, TASKID HAVING COUNT ( 1 ) > 1 ) AS b
WHEREa.PROCDEFID= b.PROCDEFID AND a.TASKID= b.TASKID
删除表 BO_ACT_MPDL_TASK 中字段 A、B、C 同时重复的数据,并保留一条
–删除重复记录(保留最新记录) https://www.csdn.net/tags/MtTaEg3sNDk4MDg1LWJsb2cO0O0O.html
DELETE FROM BO_ACT_MPDL_TASK
WHERE EXISTS
(
SELECT * FROM (
SELECT
MAX(ID) ID,
PROCDEFID,TASKID,NAME
FROM BO_ACT_MPDL_TASK
GROUP BY PROCDEFID,TASKID,NAME
HAVING COUNT(1)>1) T
WHERE BO_ACT_MPDL_TASK.PROCDEFID=T.PROCDEFID
AND BO_ACT_MPDL_TASK.TASKID=T.TASKID
AND BO_ACT_MPDL_TASK.NAME=T.NAME
AND BO_ACT_MPDL_TASK.ID<T.ID
)
Convert(decimal(18,1) 保留一位 sumtime的和除counttimes sum和(数据和)
SELECT Convert(decimal(18,1),sum(sumtime)/sum(counttimes)) FROM BO_EU_BPA_F_T_TGET_SUBTOTAL_M WHERE TARGETS='zhangxiang' AND Y='2022' AND M='04'
top 10 前10条所有的数据
select top 10 * from WFC_TASK;
找到唯一的数据且不为空不重复
SELECT DISTINCT(EXT4) FROM ORGDEPARTMENT WHERE ISNULL(EXT4,'')<>'';
查到关联条件数据
查询SELECT *
FROM WFC_TASK
WHERE WFC_TASK.TASKTITLE='-[百思得发票申请][]'
AND EXISTS (SELECT 1 FROM WFC_PROCESS WHERE WFC_TASK.PROCESSINSTID = WFC_PROCESS.ID );删除DELETE
FROM WFC_TASK, WFC_PROCESS
WHERE WFC_TASK.TASKTITLE='填报88888888'
and WFC_TASK.PROCESSINSTID = WFC_PROCESS.ID
查询WFC_TASK 包含【】- 并且长度小于15的数据
SELECT * FROM WFC_TASK WHERE CHARINDEX ('[]',TASKTITLE)>0 and CHARINDEX ('-',TASKTITLE)>0 and len(TASKTITLE)<15
–查出TASKTITLE 包含[] 并且第一位是 -
SELECT * FROM WFC_TASK WHERE CHARINDEX('[]',TASKTITLE)>0 and TASKTITLE like'-%'
下面对关键字进行详细解读:
1、in和exists
in是把外表和内表作hash(字典集合)连接,而exists是对外表作循环,每次循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的,如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in。
例如:表A(小表),表B(大表)
方式一:索引使用
1)select * from A where id in(select id from B) -->效率低,用到了A表上id列的索引2)select * from A where exists(select id from B where id=A.id) -->效率高,用到了B表上id列的索引3)select * from B where id in(select id from A) -->效率高,用到了B表上id列的索引4)select * from B where exists(select id from A where id=B.id) -->效率低,用到了A表上id列的索引
方式二:遍历使用
1)in()只执行一次,它查出B表中的所有id字段并缓存起来。然后检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录。
它的查询过程类似于以下代码的执行过程:
List resultSet = {};Array A=(select * from A);Array B=(select id from B);for(int i=0;i<A.length;i++) {for(int j=0;j<B.length;j++) {if(A[i].id==B[j].id) {resultSet.add(A[i]);break;}}}return resultSet;
可以看出,当B表数据较大时不适合使用in(),因为它会把B表数据全部遍历一次。
如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差。
如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次,遍历次数大大减少,效率大大提升。
结论:in()适合B表比A表数据小的情况
2)exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是其内查询语句的结果集空或者非空,空则返回false,非空则返回true。
它的查询过程类似于以下代码的执行过程:
List resultSet={};Array A=(select * from A);for(int i=0;i<A.length;i++) {if(exists(A[i].id) { //执行select id from B where B.id=A.id是否有记录返回resultSet.add(A[i]);}}return resultSet;
当B表比A表数据大时适合使用exists(),因为它没有那么多遍历操作,只需要再执行一次查询就行。
如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等。
如:A表有10000条记录,B表有100000000条记录,那么exists()还是执行10000次,因为它只执行A.length次,可见B表数据越多,越适合exists()发挥效果。
再如:A表有10000条记录,B表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快。
结论:exists()适合B表比A表数据大的情况。
当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用。
2、not in 和not exists
not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的bug。
请看下面的例子:
create table A1 (c1 int,c2 int);create table A2 (c1 int,c2 int);insert into A1 values(1,2);insert into A1 values(1,3);insert into A2 values(1,2);insert into A2 values(1,null);select * from A1 where c2 not in(select c2 from A2); -->执行结果:无(null)select * from A1 where not exists(select c2 from A2 where A2.c2=A1.c2); -->执行结果:1 3
正如所看到的,not in出现了不期望的结果集,存在逻辑错误。使用not in(它会调用子查询),而使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非空限制,这时可以使用not in。
如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。
3、in 和 等于号(=)
select name from employee where name in('张三','李四','王五');与select name from employee where name='张三' or name='李四' or name='王五';的结果是相同的。
4.exists防止插入重复记录
有时需要插入非重复记录,在Mysql中可以使用ignore关键字来忽略已有记录,但是其只能通过主键忽略,不能根据自定义条件忽略。
其语法为:insert ignore into tableName (column1,column2,……) values (value1,value2,……);
但是其他数据库不一定提供类似ignore关键字,所以可以使用exists条件句防止插入重复记录。
insert into A (name,age) select name,age from B where not exists (select 1 from A where A.id=B.id);
5.关于exists更多说明
exists用于检查子查询返回的结果集是否为空,该子查询实际上并不返回任何数据,而是返回值true或false。
语法: exists subQuery
参数: subQuery 是一个受限的 select 语句 (不允许有 compute 子句和 into 关键字)。
结果类型: boolean 如果子查询包含行,则返回 true ,否则返回 false 。
结论:select * from A where exists (select 1 from B where A.id=B.id);
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果集非空,则exists子句返回true,这一行方可作为外查询的结果行,否则不能作为结果。
--------以上sql内容根据网上提供的资料整理出的结果,均适用与Mysql、Sql
文章 书本笔记
摘录自身边朋友
Sql 学习查询多种条件(记录自己常用一些方法,本人学习用)相关推荐
- SQL Server遍历表中记录的2种方法
SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录.本文将介绍利用使用表变量和游标实现数据库中表的遍历. 表变量来实现表 ...
- SQL Server 数据库查找重复记录的几种方法
http://www.hanyu123.cn/html/c61/6790.html 一.查某一列(或多列)的重复值.(只可以查出重复记录的值,不能查出整个记录的信息) 例如:查找stuid,stuna ...
- sql 如何查询上次的记录_学会SQL并不难,小白学习记录之五(多表查询)
1.表的加法 加法(union) 将两个表的数据按行合并在一起 两个表中重合部分会删除 union all 会保留重复行 2.表的联结 联结(join) 通过表和表之间的关系,将两个表合并在一起: 交 ...
- 【Python 标准库学习】多种操作系统接口和常用路径操作库 — os 与 os.path
欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ os 模块简介:主流操作系统有 Windows.UNIX.Mac OS 等,os ...
- SQL 基础查询和条件查询
select&from 用户信息表中的所有数据 id device_id gender age university province 1 2138 male 21 北京大学 Beijing ...
- SQL:查询重复出现记录
select user_name,count(*) as count from user group by user_name having count>1; 转载于:https://www.c ...
- 如何在mysql查询结果集中得到记录行号_获取MySQL查询结果集中记录行号的方法...
如果需要在查询语句返回的列中包括一列以指示整个结果集中记录的行号,则ISO SQL: 2003标准建议的方法是提供ROW_NUMBER()/ RANK()函数. Oracle可以使用标准方法(版本8i ...
- mysql 设置的黑名单_在SQL中实现多条件任意组合黑名单的方法
最近的一个项目中,在对故障工单进行自动语音督办的时候,需要在某个时段对某种组合条件下的工单不督办.如在实时督办中,对所有区域告警ID为"FF--1057361341"工单,白天不督 ...
- OpenCV3学习(4.2)——图像常用滤波方法(方框、均值、高斯、中值、双边)
滤波处理分为两大类:线性滤波和非线性滤波.OpenCV里有这些滤波的函数,使用起来非常方便,现在简单介绍其使用方法. 线性滤波: 1.方框滤波:模糊图像 2.均值滤波:模糊图像 3.高斯滤波:信号的平 ...
最新文章
- php字符串转换表达式,php处理字符串格式的计算表达式
- 不是“重复”造轮子,百度飞桨框架2.0如何俘获人心
- 评分9.7!这本Python书彻底玩大了?程序员:真香!
- 零基础学习大数据开发需要多久能工作?
- cf534D 枚举握手次数
- C++decltype关键字
- c程序编写x的y次方的方法
- 【转】VNC不同软件之间的联系与区别
- 批处理详细教程(五)
- 腐蚀国内稳定服务器_工控机箱和服务器机箱区别在哪里
- 信息学奥赛C++语言:求n个数的和
- 大数据学习笔记:Hadoop生态系统
- python输出一行10个_python 如何将一系列数字十个一行输出【】
- MyBatis 一级缓存二级缓存详解
- vs 2015查看动态库
- L. Leverage MDT
- java xml解析 jdom_Java XML解析工具 JDOM介绍及使用实例
- diskpart命令_Windows Diskpart命令教程
- 区块链+医疗:隐藏的百亿级市场?
- C2 - Pokémon Army (hard version)(思维+差分/线段树+dp)详解