SQL中如何用WHERE排除某些数据 WHERE子句数据排除技巧大全

where子句在sql中用于过滤数据,通过条件表达式选择满足条件的行。1.基础排除使用not操作符,如not in排除指定值;2.多条件排除可用and或or组合,注意括号确保优先级;3.null值需用is not null排除;4.范围排除用not between;5.模糊排除用not like配合通配符;此外还可结合distinct、group by、row_number()等实现去重,同时注意索引优化、避免函数和类型转换以提升性能。

SQL中如何用WHERE排除某些数据 WHERE子句数据排除技巧大全

直接说吧,WHERE子句在SQL里就是个过滤器,你想筛掉啥,就用它。

SQL中如何用WHERE排除某些数据 WHERE子句数据排除技巧大全

根据标题详细展开说明解决该问题

SQL中如何用WHERE排除某些数据 WHERE子句数据排除技巧大全

WHERE 后面跟的是条件表达式,只有满足条件的行才会被选中。排除数据,本质上就是构造一个“不满足”的条件。

基础排除:NOT 操作符

SQL中如何用WHERE排除某些数据 WHERE子句数据排除技巧大全

最直接的方式就是使用 NOT 操作符。比如,你想排除 id 为 1, 2, 3 的数据:

SELECT * FROM your_table WHERE NOT id IN (1, 2, 3);

这里,IN (1, 2, 3) 选择了 id 为 1, 2, 或者 3 的行,NOT IN 就反过来,选择了 id 不是 1, 2, 3 的行。

多条件排除:ANDOR 的巧妙运用

如果你的排除条件比较复杂,需要组合多个条件,ANDOR 就派上用场了。

比如,你想排除 status 为 ‘pending’ 并且 create_time 在 ‘2023-01-01’ 之前的数据:

SELECT * FROM your_table WHERE NOT (status = 'pending' AND create_time < '2023-01-01');

注意这里的括号,它确保了 AND 操作的优先级高于 NOT

或者,你想排除 status 为 ‘pending’ 或者 status 为 ‘rejected’ 的数据:

SELECT * FROM your_table WHERE status != 'pending' AND status != 'rejected';

这里不能直接用NOT (status = 'pending' OR status = 'rejected'),因为可能存在status为NULL的情况,导致结果不符合预期。

NULL 值的排除

NULL 值是个特殊的存在,不能直接用 = 或者 != 来判断。你需要使用 IS NULLIS NOT NULL

比如,你想排除 emailNULL 的数据:

SELECT * FROM your_table WHERE email IS NOT NULL;

范围排除:BETWEENNOT BETWEEN

如果你想排除某个范围的数据,可以使用 BETWEENNOT BETWEEN

比如,你想排除 price 在 10 到 100 之间的数据:

SELECT * FROM your_table WHERE price NOT BETWEEN 10 AND 100;

模糊排除:LIKENOT LIKE

如果你想排除包含某个模式的数据,可以使用 LIKENOT LIKE

比如,你想排除 name 包含 ‘test’ 的数据:

SELECT * FROM your_table WHERE name NOT LIKE '%test%';

% 是通配符,表示任意字符。

SQL排除重复数据的几种方法?

DISTINCT 关键字

最简单的方法就是使用 DISTINCT 关键字。它会返回指定列的唯一值。

SELECT DISTINCT column1, column2 FROM your_table;

但是,DISTINCT 只能作用于整个行,也就是说,只有当 column1column2 的值都相同时,才会被认为是重复行。

GROUP BY 子句

GROUP BY 子句可以将具有相同值的行分组在一起。然后,你可以使用聚合函数(比如 COUNTSUMAVG 等)来处理这些分组。

SELECT column1, column2, COUNT(*) FROM your_table GROUP BY column1, column2 HAVING COUNT(*) > 1;

这个查询会返回 column1column2 的值,以及它们的重复次数。HAVING COUNT(*) > 1 表示只返回重复的行。

ROW_NUMBER() 函数

ROW_NUMBER() 函数可以为结果集中的每一行分配一个唯一的序号。你可以使用这个序号来删除重复的行。

WITH RowNumCTE AS (    SELECT        *,        ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY (SELECT 0)) AS RowNum    FROM        your_table)DELETE FROM RowNumCTE WHERE RowNum > 1;

这个查询首先使用 ROW_NUMBER() 函数为每一行分配一个序号,然后删除序号大于 1 的行,也就是重复的行。PARTITION BY column1, column2 表示按照 column1column2 进行分组,ORDER BY (SELECT 0) 只是为了保证语法正确,实际上并不影响结果。

使用临时表

你可以先将唯一的数据插入到临时表中,然后清空原表,再将临时表的数据插入到原表中。

-- 创建临时表CREATE TEMPORARY TABLE temp_table AS SELECT DISTINCT column1, column2 FROM your_table;-- 清空原表TRUNCATE TABLE your_table;-- 将临时表的数据插入到原表INSERT INTO your_table SELECT * FROM temp_table;-- 删除临时表DROP TEMPORARY TABLE temp_table;

这种方法比较繁琐,但是可以处理一些特殊情况。

利用唯一索引

如果你的表中已经存在唯一索引,那么插入重复数据时会报错。你可以利用这个特性来删除重复数据。

-- 创建唯一索引CREATE UNIQUE INDEX unique_index ON your_table (column1, column2);-- 忽略插入错误INSERT IGNORE INTO your_table (column1, column2) SELECT column1, column2 FROM your_table;-- 删除重复数据DELETE FROM your_table WHERE id NOT IN (SELECT MIN(id) FROM your_table GROUP BY column1, column2);

这种方法的前提是你的表中已经存在唯一索引,或者可以创建唯一索引。

SQL中WHERE子句的性能优化技巧有哪些?

索引的使用

这是最基本也是最重要的优化技巧。在 WHERE 子句中使用的列,如果经常被查询,那么应该为其创建索引。

索引就像一本书的目录,可以帮助数据库快速找到需要的数据,而不需要扫描整个表。

CREATE INDEX index_name ON your_table (column_name);

但是,索引也不是越多越好。索引会占用额外的存储空间,并且在插入、更新、删除数据时,需要维护索引,会降低性能。所以,应该只为经常被查询的列创建索引。

避免在 WHERE 子句中使用函数

简篇AI排版 简篇AI排版

AI排版工具,上传图文素材,秒出专业效果!

简篇AI排版 554 查看详情 简篇AI排版

如果在 WHERE 子句中使用函数,会导致索引失效。因为数据库无法使用索引来查找函数的结果。

比如,你想查询 create_time 在 ‘2023-01-01’ 之后的数据:

-- 不好的写法SELECT * FROM your_table WHERE DATE(create_time) > '2023-01-01';-- 好的写法SELECT * FROM your_table WHERE create_time > '2023-01-01 00:00:00';

第一种写法使用了 DATE() 函数,会导致索引失效。第二种写法直接比较 create_time 的值,可以使用索引。

避免使用 OR 操作符

在某些情况下,使用 OR 操作符会导致索引失效。

比如,你想查询 status 为 ‘pending’ 或者 status 为 ‘rejected’ 的数据:

-- 不好的写法SELECT * FROM your_table WHERE status = 'pending' OR status = 'rejected';-- 好的写法SELECT * FROM your_table WHERE status IN ('pending', 'rejected');

第一种写法使用了 OR 操作符,可能会导致索引失效。第二种写法使用了 IN 操作符,可以使用索引。

当然,这并不是绝对的。在某些情况下,使用 OR 操作符的性能可能更好。你需要根据实际情况进行测试。

避免使用 != 或者 操作符

在某些情况下,使用 != 或者 操作符会导致索引失效。

比如,你想查询 status 不为 ‘pending’ 的数据:

-- 不好的写法SELECT * FROM your_table WHERE status != 'pending';-- 好的写法SELECT * FROM your_table WHERE status IS NULL OR status  'pending';

第一种写法使用了 != 操作符,可能会导致索引失效。第二种写法使用了 IS NULL 操作符,可以使用索引。

同样,这并不是绝对的。你需要根据实际情况进行测试。

使用 EXISTS 代替 IN

在某些情况下,使用 EXISTS 代替 IN 可以提高性能。

比如,你想查询 your_table 中存在于 another_table 中的数据:

-- 不好的写法SELECT * FROM your_table WHERE id IN (SELECT id FROM another_table);-- 好的写法SELECT * FROM your_table WHERE EXISTS (SELECT 1 FROM another_table WHERE another_table.id = your_table.id);

EXISTS 只会检查子查询是否返回任何行,而 IN 会将子查询的结果加载到内存中。所以,在子查询的结果集比较大的情况下,使用 EXISTS 的性能更好。

优化子查询

如果 WHERE 子句中包含子查询,那么应该尽量优化子查询。

比如,你可以使用 JOIN 代替子查询。

-- 不好的写法SELECT * FROM your_table WHERE column1 IN (SELECT column1 FROM another_table WHERE column2 = 'value');-- 好的写法SELECT your_table.* FROM your_table JOIN another_table ON your_table.column1 = another_table.column1 WHERE another_table.column2 = 'value';

JOIN 可以将两个表连接在一起,避免了多次查询数据库。

使用 LIMIT 限制结果集

如果只需要一部分数据,可以使用 LIMIT 限制结果集的大小。

SELECT * FROM your_table WHERE column1 = 'value' LIMIT 10;

这样可以减少数据库的负担,提高查询速度。

避免在WHERE条件中使用类型转换

当WHERE条件涉及不同数据类型的比较时,数据库可能会尝试进行隐式类型转换,这通常会导致索引失效。确保比较的数据类型一致,或者显式地进行类型转换,但要小心,显式转换也可能导致索引失效,需要具体情况具体分析。

SQL中WHERE子句与HAVING子句的区别

作用对象不同

WHERE 子句用于过滤行,它作用于表中的每一行,决定哪些行会被选中。

HAVING 子句用于过滤分组,它作用于 GROUP BY 子句创建的每个分组,决定哪些分组会被选中。

使用时机不同

WHERE 子句在分组之前进行过滤,也就是说,它在 GROUP BY 子句之前执行。

HAVING 子句在分组之后进行过滤,也就是说,它在 GROUP BY 子句之后执行。

可以使用的条件不同

WHERE 子句可以使用任何列作为条件,包括未分组的列。

HAVING 子句只能使用分组列或者聚合函数作为条件。

是否需要 GROUP BY 子句

WHERE 子句不需要 GROUP BY 子句。

HAVING 子句必须与 GROUP BY 子句一起使用。

举个例子,你想查询每个部门的平均工资,并且只返回平均工资大于 5000 的部门:

SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 5000;

在这个例子中,GROUP BY department 将员工按照部门进行分组,AVG(salary) 计算每个部门的平均工资,HAVING AVG(salary) > 5000 过滤掉平均工资小于等于 5000 的部门。

如果你想查询工资大于 3000 的员工,并且只返回这些员工所在的部门的平均工资大于 5000 的部门:

SELECT department, AVG(salary) FROM employees WHERE salary > 3000 GROUP BY department HAVING AVG(salary) > 5000;

在这个例子中,WHERE salary > 3000 过滤掉工资小于等于 3000 的员工,GROUP BY department 将剩余的员工按照部门进行分组,AVG(salary) 计算每个部门的平均工资,HAVING AVG(salary) > 5000 过滤掉平均工资小于等于 5000 的部门。

总结一下:WHERE 过滤行,HAVING 过滤分组。WHERE 在分组前执行,HAVING 在分组后执行。WHERE 可以使用任何列作为条件,HAVING 只能使用分组列或者聚合函数作为条件。

以上就是SQL中如何用WHERE排除某些数据 WHERE子句数据排除技巧大全的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/609173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
前端接收后端时间数据类型不一致怎么办?
上一篇 2025年11月11日 00:18:34
深研院潘锋团队在发展图论结构电化学与AI相融合应用于尿素电催化机理研究取得进展
下一篇 2025年11月11日 00:18:38

相关推荐

  • 如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    Optuna通过智能搜索与剪枝机制,显著提升AI大模型超参数优化效率。它以目标函数封装训练流程,利用TPE等算法智能采样,结合ASHA等剪枝策略,在分布式环境下高效搜索最优配置,同时提供可复现性与可视化分析,降低调参成本。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年9月23日 用户投稿
    000
  • Photopea中AI图片如何导出为PNG?快速保存图像的实用方法

    答案:在Photopea中导出AI生成图片为PNG,需点击“文件”→“导出为”→选择PNG,设置质量100%、勾选透明度并确认尺寸后保存;为平衡质量与文件大小,优先调整图像尺寸而非降低质量,高分辨率图片可缩放以优化;常见技巧包括使用高分辨率源图、保留图层非破坏性编辑;其他格式如JPEG适合无透明背景…

    2026年9月23日
    200
  • 如何使用Java制作简易的博客系统

    首先搭建Spring Boot后端,设计BlogPost实体类并用JPA实现数据持久化,通过BlogController处理页面请求,使用Thymeleaf模板引擎渲染index和create页面,配置H2内存数据库并启用控制台,最终实现文章的发布与展示功能。 用Java制作一个简易的博客系统,核心…

    2026年9月23日
    200
  • qq浏览器主页被篡改了如何修复_qq浏览器主页被篡改修复方法

    首先检查QQ浏览器设置中的主页地址并修正,接着查看桌面快捷方式目标路径是否被添加恶意网址并清理,然后使用腾讯电脑管家等工具扫描修复,最后可尝试重置浏览器或通过注册表编辑器锁定主页,防止再次被篡改。 QQ浏览器主页被篡改,通常是由恶意软件、插件或安全软件锁定导致的。修复的关键是检查多个可能被修改的位置…

    2026年9月23日
    100
  • 渗透测试|利用curl回传文件

    在处理低权限shell回传文件的问题时,如果无法使用scp命令且无法安装sshpass,可以考虑使用curl命令进行文件传输。以下是详细的伪原创内容: 至少我们曾经在一起过。 来自:一言 var xhr = new XMLHttpRequest();xhr.open(‘get’, ‘https://…

    2026年9月23日
    100
  • 《战地6》:我打《三角洲行动》吗

    《战地6》:我打《三角洲行动》吗《战地6》:我打《三角洲行动》吗《战地6》:我打《三角洲行动》吗《战地6》:我打《三角洲行动》吗

    《战地6》(简称bf6)已于昨晚正式解锁,登陆xbox、ps5、以及pc(steam、ea、epic)平台。作为《战地6》有力劲敌的《三角洲行动》,恰逢这几天因为对干员“深蓝”的大刀以及撤离点机制的修改而闹得节奏满天飞,直接导致隔壁的三国杀玩家经历了沉痛的一天——三角洲的差评超越了三国杀,成为新的差…

    2026年9月23日 用户投稿
    100
  • VSCode如何配置Scala开发环境 VSCode搭建Scala项目的完整教程

    首先安装jdk 11或17并正确配置java_home和path环境变量;2. 通过包管理器或官网安装sbt,用于项目构建与依赖管理;3. 在vscode中安装scala (metals)插件,以获得代码补全、错误检查等语言服务;4. 使用sbt new scala/scala-seed.g8创建项…

    2026年9月23日
    100
  • PHP面向对象高级特性_PHP高级OOP设计模式

    PHP高级OOP特性如命名空间、Traits、魔术方法等结合设计模式可提升代码质量。1. 命名空间避免类冲突,Traits实现横向复用,后期静态绑定支持运行时解析,魔术方法增强对象控制,抽象类与接口定义契约,Final防止继承修改。2. 单例确保唯一实例,工厂封装创建逻辑,依赖注入降低耦合,观察者实…

    2026年9月23日
    100
  • mysql如何输入二进制数据 mysql代码处理blob类型教程

    mysql如何输入二进制数据 mysql代码处理blob类型教程mysql如何输入二进制数据 mysql代码处理blob类型教程mysql如何输入二进制数据 mysql代码处理blob类型教程mysql如何输入二进制数据 mysql代码处理blob类型教程

    mysql中存储二进制数据可通过选择合适的blob类型并使用sql命令实现。1. 选择tinyblob、blob、mediumblob或longblob之一,依据存储容量需求;2. 使用insert语句结合unhex()函数插入十六进制表示的二进制数据;3. 通过编程语言如php简化转换过程,使用b…

    2026年9月23日 用户投稿
    400
  • Airtable的AI混合工具怎么用?快速管理数据的智能化操作步骤

    Airtable的AI混合工具通过将AI能力嵌入数据管理流程,实现自动化处理、分析与内容生成。首先明确AI需求,如总结反馈或生成文案;接着选择AI字段或在自动化中添加AI动作;然后配置模型与提示词,精准设计指令以确保输出质量;指定输入输出字段后进行测试迭代,优化提示词直至满意;最后部署并持续监控。该…

    2026年9月23日
    100
  • 华为 Mate 70 Air 手机上架电信终端产品库 eSIM 方案成悬念

    10 月 21 日消息,华为一款型号为 sup-al90 的新机——华为 mate 70 air,目前已上架中国电信终端产品库。产品信息显示,该机型将提供曜金黑、羽衣白、金丝银锦三款配色,并预装 harmonyos 5.0 操作系统。 产品库信息显示 Mate70 Air 采用一块 6.9 英寸大屏…

    2026年9月23日
    300
  • 高德地图离线地图怎么更新_高德地图离线数据更新步骤

    高德地图车机版离线地图更新方法包括:一、通过Wi-Fi在线更新,进入“离线数据”页面检测并下载新版地图;二、使用U盘导入,从官网下载解压后复制amapauto文件夹至U盘根目录,插入车机并选择更新;三、开启Wi-Fi自动更新功能,在设置中启用“Wi-Fi下自动更新离线数据”及“离线图面增量更新”,实…

    2026年9月23日
    100
  • PHP高效读取大型GZ文件:揭示Gzip的顺序访问限制与实践方法

    本教程深入探讨了php中处理大型gz压缩文件的核心挑战:其固有的顺序访问特性。我们将解释为何无法对gz文件进行随机跳转读取,以及这意味着您必须从头开始按序解压数据。文章将提供一种实用的分块读取策略,并附带php示例代码,帮助开发者高效、安全地处理超大gz文件,同时讨论潜在的跨块数据处理问题及内存管理…

    2026年9月23日
    200
  • 如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    RayTune通过分布式超参数优化解决大模型训练中的资源调度、搜索效率、实验管理与容错难题,其核心是利用并行化和智能调度(如ASHA、PBT)加速最优配置探索。首先,将训练逻辑封装为可调用函数,并在其中集成分布式训练(如PyTorch DDP);其次,定义超参数搜索空间与资源需求(如每试验2 GPU…

    2026年9月23日 用户投稿
    100
  • 鸿蒙3.0将删除谷歌代码,只是为让国产系统更纯粹

    鸿蒙3.0将删除谷歌代码,只是为让国产系统更纯粹鸿蒙3.0将删除谷歌代码,只是为让国产系统更纯粹鸿蒙3.0将删除谷歌代码,只是为让国产系统更纯粹鸿蒙3.0将删除谷歌代码,只是为让国产系统更纯粹

    作为“聚光灯下诞生的国产系统”,华为鸿蒙系统自诞生之日起就引发了激烈的争论。尽管鸿蒙系统已升级至3.0版本,但关于“鸿蒙系统是否是安卓套壳”的讨论依然是焦点。不过,这可能并不是问题的核心。 鸿蒙系统是套壳吗?对于如今的国内科技企业来说,开发一个系统并不困难。然而,为什么最终存活下来的只有MIUI、F…

    2026年9月23日 用户投稿
    100
  • mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql子查询常见类型包括标量子查询、行子查询和表子查询,分别返回一行一列、一行多列和多行多列数据;应用场景涵盖where作为过滤条件、from作为派生表、select作为标量列以及dml操作的数据提供。此外,根据与外部查询的关联性分为非关联子查询和关联子查询,前者独立执行一次,后者依赖外部查询每…

    2026年9月23日 用户投稿
    100
  • 硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新

    硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新

    谷歌最新视频生成模型 veo 3.1 来了!今日上手可用。 北京时间 10 月 16 日,谷歌在 Gemini API 中发布了 Veo 3.1 和 Veo 3.1 Fast 付费预览版。模型一上线,就受到了行业的高度关注。毕竟,和前不久发布的 Sora 2 一样,这次 Veo 3.1 也新增了音频…

    2026年9月23日 用户投稿
    200
  • Java Optional与集合结合使用方法

    Optional与集合结合可避免空指针异常。1. 用Optional.ofNullable包装可能为null的集合元素;2. Stream中filter后接findFirst返回Optional,安全查找;3. 对象属性为Optional时,通过flatMap展开提取值;4. 方法返回Optiona…

    2026年9月23日
    200
  • vivo X300 Pro首发定制2亿灭霸长焦 韩伯啸:长焦新王

    9月2日,vivo产品经理韩伯啸再次为即将发布的vivo x300系列预热,此次聚焦于旗舰机型vivo x300 pro的影像能力。 韩伯啸指出,X300 Pro搭载了独家深度定制的2亿HPB“灭霸”长焦镜头,标志着vivo在长焦技术上的又一次飞跃。这颗镜头是蓝厂真正意义上的第四代两亿像素长焦系统,…

    2026年9月23日
    100
  • Java ListIterator如何实现双向遍历

    Java中的ListIterator接口支持双向遍历,即可以从前往后,也可以从后往前遍历列表。这与普通的Iterator只能单向向后遍历不同。ListIterator提供了更灵活的操作方式,特别适用于需要反向访问或在遍历过程中修改列表的场景。 1. ListIterator的基本特性 ListIte…

    2026年9月22日
    100

发表回复

登录后才能评论
关注微信