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:03
下一篇 2025年11月11日 00:18:50

相关推荐

  • Uniapp 中如何不拉伸不裁剪地展示图片?

    灵活展示图片:如何不拉伸不裁剪 在界面设计中,常常需要以原尺寸展示用户上传的图片。本文将介绍一种在 uniapp 框架中实现该功能的简单方法。 对于不同尺寸的图片,可以采用以下处理方式: 极端宽高比:撑满屏幕宽度或高度,再等比缩放居中。非极端宽高比:居中显示,若能撑满则撑满。 然而,如果需要不拉伸不…

    2025年12月24日
    400
  • 如何让小说网站控制台显示乱码,同时网页内容正常显示?

    如何在不影响用户界面的情况下实现控制台乱码? 当在小说网站上下载小说时,大家可能会遇到一个问题:网站上的文本在网页内正常显示,但是在控制台中却是乱码。如何实现此类操作,从而在不影响用户界面(UI)的情况下保持控制台乱码呢? 答案在于使用自定义字体。网站可以通过在服务器端配置自定义字体,并通过在客户端…

    2025年12月24日
    800
  • 如何在地图上轻松创建气泡信息框?

    地图上气泡信息框的巧妙生成 地图上气泡信息框是一种常用的交互功能,它简便易用,能够为用户提供额外信息。本文将探讨如何借助地图库的功能轻松创建这一功能。 利用地图库的原生功能 大多数地图库,如高德地图,都提供了现成的信息窗体和右键菜单功能。这些功能可以通过以下途径实现: 高德地图 JS API 参考文…

    2025年12月24日
    400
  • 如何使用 scroll-behavior 属性实现元素scrollLeft变化时的平滑动画?

    如何实现元素scrollleft变化时的平滑动画效果? 在许多网页应用中,滚动容器的水平滚动条(scrollleft)需要频繁使用。为了让滚动动作更加自然,你希望给scrollleft的变化添加动画效果。 解决方案:scroll-behavior 属性 要实现scrollleft变化时的平滑动画效果…

    2025年12月24日
    000
  • 如何为滚动元素添加平滑过渡,使滚动条滑动时更自然流畅?

    给滚动元素平滑过渡 如何在滚动条属性(scrollleft)发生改变时为元素添加平滑的过渡效果? 解决方案:scroll-behavior 属性 为滚动容器设置 scroll-behavior 属性可以实现平滑滚动。 html 代码: click the button to slide right!…

    2025年12月24日
    500
  • 如何选择元素个数不固定的指定类名子元素?

    灵活选择元素个数不固定的指定类名子元素 在网页布局中,有时需要选择特定类名的子元素,但这些元素的数量并不固定。例如,下面这段 html 代码中,activebar 和 item 元素的数量均不固定: *n *n 如果需要选择第一个 item元素,可以使用 css 选择器 :nth-child()。该…

    2025年12月24日
    200
  • 使用 SVG 如何实现自定义宽度、间距和半径的虚线边框?

    使用 svg 实现自定义虚线边框 如何实现一个具有自定义宽度、间距和半径的虚线边框是一个常见的前端开发问题。传统的解决方案通常涉及使用 border-image 引入切片图片,但是这种方法存在引入外部资源、性能低下的缺点。 为了避免上述问题,可以使用 svg(可缩放矢量图形)来创建纯代码实现。一种方…

    2025年12月24日
    100
  • 如何让“元素跟随文本高度,而不是撑高父容器?

    如何让 元素跟随文本高度,而不是撑高父容器 在页面布局中,经常遇到父容器高度被子元素撑开的问题。在图例所示的案例中,父容器被较高的图片撑开,而文本的高度没有被考虑。本问答将提供纯css解决方案,让图片跟随文本高度,确保父容器的高度不会被图片影响。 解决方法 为了解决这个问题,需要将图片从文档流中脱离…

    2025年12月24日
    000
  • 为什么 CSS mask 属性未请求指定图片?

    解决 css mask 属性未请求图片的问题 在使用 css mask 属性时,指定了图片地址,但网络面板显示未请求获取该图片,这可能是由于浏览器兼容性问题造成的。 问题 如下代码所示: 立即学习“前端免费学习笔记(深入)”; icon [data-icon=”cloud”] { –icon-cl…

    2025年12月24日
    200
  • 如何利用 CSS 选中激活标签并影响相邻元素的样式?

    如何利用 css 选中激活标签并影响相邻元素? 为了实现激活标签影响相邻元素的样式需求,可以通过 :has 选择器来实现。以下是如何具体操作: 对于激活标签相邻后的元素,可以在 css 中使用以下代码进行设置: li:has(+li.active) { border-radius: 0 0 10px…

    2025年12月24日
    100
  • 如何模拟Windows 10 设置界面中的鼠标悬浮放大效果?

    win10设置界面的鼠标移动显示周边的样式(探照灯效果)的实现方式 在windows设置界面的鼠标悬浮效果中,光标周围会显示一个放大区域。在前端开发中,可以通过多种方式实现类似的效果。 使用css 使用css的transform和box-shadow属性。通过将transform: scale(1.…

    2025年12月24日
    200
  • 为什么我的 Safari 自定义样式表在百度页面上失效了?

    为什么在 Safari 中自定义样式表未能正常工作? 在 Safari 的偏好设置中设置自定义样式表后,您对其进行测试却发现效果不同。在您自己的网页中,样式有效,而在百度页面中却失效。 造成这种情况的原因是,第一个访问的项目使用了文件协议,可以访问本地目录中的图片文件。而第二个访问的百度使用了 ht…

    2025年12月24日
    000
  • 如何用前端实现 Windows 10 设置界面的鼠标移动探照灯效果?

    如何在前端实现 Windows 10 设置界面中的鼠标移动探照灯效果 想要在前端开发中实现 Windows 10 设置界面中类似的鼠标移动探照灯效果,可以通过以下途径: CSS 解决方案 DEMO 1: Windows 10 网格悬停效果:https://codepen.io/tr4553r7/pe…

    2025年12月24日
    000
  • 使用CSS mask属性指定图片URL时,为什么浏览器无法加载图片?

    css mask属性未能加载图片的解决方法 使用css mask属性指定图片url时,如示例中所示: mask: url(“https://api.iconify.design/mdi:apple-icloud.svg”) center / contain no-repeat; 但是,在网络面板中却…

    2025年12月24日
    000
  • 如何用CSS Paint API为网页元素添加时尚的斑马线边框?

    为元素添加时尚的斑马线边框 在网页设计中,有时我们需要添加时尚的边框来提升元素的视觉效果。其中,斑马线边框是一种既醒目又别致的设计元素。 实现斜向斑马线边框 要实现斜向斑马线间隔圆环,我们可以使用css paint api。该api提供了强大的功能,可以让我们在元素上绘制复杂的图形。 立即学习“前端…

    2025年12月24日
    000
  • 图片如何不撑高父容器?

    如何让图片不撑高父容器? 当父容器包含不同高度的子元素时,父容器的高度通常会被最高元素撑开。如果你希望父容器的高度由文本内容撑开,避免图片对其产生影响,可以通过以下 css 解决方法: 绝对定位元素: .child-image { position: absolute; top: 0; left: …

    2025年12月24日
    000
  • 为什么自定义样式表在 Safari 中访问百度页面时无法生效?

    自定义样式表在 safari 中失效的原因 用户尝试在 safari 偏好设置中添加自定义样式表,代码如下: body { background-image: url(“/users/luxury/desktop/wallhaven-o5762l.png”) !important;} 测试后发现,在…

    2025年12月24日
    000
  • CSS 帮助

    我正在尝试将文本附加到棕色框的左侧。我不能。我不知道代码有什么问题。请帮助我。 css .hero { position: relative; bottom: 80px; display: flex; justify-content: left; align-items: start; color:…

    2025年12月24日 好文分享
    200
  • 前端代码辅助工具:如何选择最可靠的AI工具?

    前端代码辅助工具:可靠性探讨 对于前端工程师来说,在HTML、CSS和JavaScript开发中借助AI工具是司空见惯的事情。然而,并非所有工具都能提供同等的可靠性。 个性化需求 关于哪个AI工具最可靠,这个问题没有一刀切的答案。每个人的使用习惯和项目需求各不相同。以下是一些影响选择的重要因素: 立…

    2025年12月24日
    000
  • 如何用 CSS Paint API 实现倾斜的斑马线间隔圆环?

    实现斑马线边框样式:探究 css paint api 本文将探究如何使用 css paint api 实现倾斜的斑马线间隔圆环。 问题: 给定一个有多个圆圈组成的斑马线图案,如何使用 css 实现倾斜的斑马线间隔圆环? 答案: 立即学习“前端免费学习笔记(深入)”; 使用 css paint api…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信