SQL学习四、过滤、数据筛选

article/2025/9/17 4:17:50

数据过滤,即按照条件筛选数据,找出符合条件的数据。这可以说是SQL学习和使用时最核心的地方了。

1、使用简单WHERE 子句

WHERE 子句在表名(FROM 子句)之后给出
比如我们需要在 adjunctlist 中查询 flaw_id = 201902的数据的add_time

SELECT add_time FROM adjunctlist WHERE flaw_id = 201902

筛选数据

注意:SQL 过滤与应用过滤
我们应该在查询的时候就使用SQL对数据做好过滤,而不是交给应用去进行数据过滤,这样做是非常不好的,不仅会传输多余数据,还会影响应用的性能和扩展性。


2、WHERE 子句操作符

不同的DBMS对这些操作符的支持可能不同

操作符说明
=等于
!= 、<>不等于
< 、!>小于(不大于)
> 、!<大于(不小于)
<=小于等于
>=大于等于
BETWEEN在指定的两个值之间
IS NULL为NULL值
  • BETWEEN 的使用

使用 BETWEEN 时,必须指定两个值——所需范 围的低端值和高端值。这两个值必须用 AND 关键字分隔。BETWEEN 匹配 范围中所有的值,包括指定的开始值和结束值。

例如,我们查找 flaw_id 在 201901 和 201904 之间数据的 add_time 和 flaw_id 值

SELECT add_time,flaw_id FROM adjunctlist WHERE flaw_id BETWEEN 201901 AND 201904

BETWEEN

  • 空值检查
    在创建表的时候可以指定某一字段是否可以为空(即不包含值,无值no value)
    当我们利用SQL检索数据时,判断某个字段值是否为空,不能简单地检查是否= NULL,而应该使用 IS NULL 子句来进行判断。
SELECT 
add_time 
FROM 
adjunctlist 
WHERE 
flaw_id IS NULL

3、利用操作符 ,组合WHERE 子句

我们可以在WHERE 子句中加入多个条件,使用 AND、OR等操作符连接,进行数据筛选 。

  • AND
    我们筛选必须满足条件 flaw_id >201904 和 条件 add_time >‘2018-03-23 00:00:00’ 的数据,AND前后的条件必须同时满足,取交集
SELECT * FROM adjunctlist WHERE flaw_id > 201904 AND add_time > '2018-03-23 00:00:00'

同时满足条件


  • OR
    我们筛选满足条件 flaw_id >201904 或者 满足条件 add_time >‘2018-03-23 00:00:00’ 的数据,AND前后的条件只要满足一条即可,取并集
SELECT * FROM adjunctlist WHERE flaw_id > 201904 OR add_time > '2018-03-23 00:00:00'

最少满足一个条件


  • 关于 AND 和 OR 的优先级
    AND 的优先级是高于OR的,为了防止筛选出错,最好在使用 AND 和 OR的时候加上圆括号进行优先级限定。

例如,我们想查询 flaw_id > 201904 或者 task_id > 1028 ,且user_id = 26 的任务点
按照顺序书写的SQL:

SELECT * FROM taskpoint WHERE flaw_id > 201904 OR task_id > 1028 AND user_id = 26

我们会发现查询出来的结果并不是我们想要的结果
查询结果

这就是因为AND 的优先级是高于OR造成的,其实上面的这条SQL 实际相当于
查询 flaw_id > 201904 的任务点 或者 task_id > 1028 且user_id = 26 的任务点

SELECT * FROM taskpoint WHERE flaw_id > 201904 OR (task_id > 1028 AND user_id = 26)

正确的SQL应该这样写

SELECT * FROM taskpoint WHERE (flaw_id > 201904 OR task_id > 1028) AND user_id = 26

正确的查询结果

所以我们写SQL的时候最好加上圆括号,这样不易出错,且让人一目了然。


  • IN
    IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。

比如我们想查询task_id = 1029 或者 task_id = 1028 的任务点,我们使用OR 可以这么写:

SELECT * FROM taskpoint WHERE task_id = 1029 OR task_id = 1028

用IN 我们可以这样写:

SELECT * FROM taskpoint WHERE task_id IN (1029 , 1028)

关于执行的效率,IN 操作符一般比一组 OR 操作符执行得更快


  • NOT
    NOT 操作符是 WHERE 子句中用来否定其后条件的关键字。

比如,我们想查询task_id >2010 但是不能为2018 或者2017 的任务点

SELECT * FROM taskpoint WHERE task_id > 2010 AND NOT task_id IN (2018 , 2017)

查询结果


4、利用通配符进行过滤

1、通配符一般会结合LIKE 操作符进行使用
2、通配符本身实际上是 SQL的 WHERE 子句中有特殊含义的字符
3、通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用 通配符搜索。

  • 百分号(%)通配符

这是SQL中最常用的通配符了,在搜索串中,%表示任何字符出现任意次数。

1、匹配开头字符,需要使用word%进行匹配
比如我们查询任务点里面以工井开头的任务点名称。

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '工井%'

工井开头

2、匹配任意位置的字符,需要使用%word%进行匹配
比如我们查询任务点里面包含的任务点名称。

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '%井%'

名称包含井

3、匹配结束字符,需要使用%word进行匹配
比如我们查询任务点里面以18结束的任务点名称。

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '%18'

18结尾

4、匹配开始和结束的字符,需要使用word%word进行匹配
比如我们查询任务点里面以设备开头,以18结尾的任务点名称

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '设备%18'

匹配开始和结束的字符

注意
1、有些DBMS会使用空格来填补字段内容,可能对结束字符的匹配造成影响,这时我们需要使用函数去掉空格。
2、通配符%可以匹配空字符串,但是不能匹配NULL


  • 下划线(_)通配符
    1、用途和%一样,但是下划线()只匹配单个字符,而不是多个字符
    2、DB2不支持下划线(
    )通配符
    3、Access需要使用?而不是_

下面我们来测试一下,使用下面的三条SQL语句

//匹配任务点中包含`井`的任务点名称
SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '%井%'
//匹配任务点中第二个字符为`井`的任务点名称
SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '_井%'
//匹配任务点中第三个字符为`井`的任务点名称
SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '__井%'

1、匹配任务点中包含的任务点名称

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '%井%'

包含井的任务点名称

2、匹配任务点中第二个字符为的任务点名称

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '_井%'

第二个字符为井的任务点名称

3、匹配任务点中第三个字符为的任务点名称

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '__井%'

第三个字符为井的任务点名称

通过上述SQL的对比,我们就可以发现下划线(_)只匹配单个字符


  • 方括号( [ ] )通配符

方括号( [ ] )通配符用来指定一个字符集,它必须匹配指定位置的一个字符。

只有Access 和 SQL Server 支持使用,其他DBMS使用时需要先查阅相关文档,确认是否支持

使用:
比如,匹配任务点中以J或者M开头的任务点名称

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '[JM]%'

另外,方括号( [ ] )通配符可以使用前缀字符^(脱字号)来否定,但是 Access中需要用!而不是^来否定一个集合
比如,我们需要匹配任务点中不是以J或者M开头的任务点名称

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '[^JM]%'

而在Access中我们就需要这样写了

SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '[!JM]%'

当然我们也可以使用 NOT 操作符实现相同的查询。


5、通配符的使用技巧

**注意:**通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间,所以
1、不要过度使用通配符,如果其他操作符能达到相同的目的,应该使用其他操作符
2、在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的,应该先利用明确的条件缩小数据查找的范围,最后再使用通配符在最小的范围内进行查找


http://chatgpt.dhexx.cn/article/XGQjyLXc.shtml

相关文章

SQL学习——窗口函数

1.窗口函数 窗口函数&#xff1a;应用在窗口的函数&#xff0c;限定一个空间范围 窗口&#xff1a;记录集合&#xff0c;满足某种条件的记录集合上执行的特殊函数 基本用法&#xff1a; 函数名&#xff08;[expr]&#xff09; over 子句 函数&#xff08;&#xff09; over(…

数据分析初学入门——22本SQL学习书籍推荐

很多数据分析初学者都被推荐学SQL&#xff0c;SQL是最基础且是必备的技能之一&#xff0c;但是不知道该从何学起&#xff0c;很多课程讲了很多知识点&#xff0c;但是初学的朋友没有对这一领域整体框架的认识&#xff0c;不知道该学哪些知识、有哪些知识、实际工作需要到什么程…

Sql学习

Sql学习 一、SQL简介 SQL 是一种 ANSI&#xff08;American National Standards Institute 美国国家标准化组织&#xff09;标准的计算机语言。 是结构化查询语言&#xff08;Structured Query Language&#xff09;&#xff0c;可以访问和处理数据库&#xff0c;SQL 对大小写…

SQL学习笔记1

* 以下内容是我在学习SQL&#xff08;http://www.w3school.com.cn/sql/index.asp&#xff09;的时候的学习笔记 * 学习时使用的数据库软件是MySQL数据库可视化工具SQLyogEnt * 如果大家有发现什么不对的地方请告诉我。谢啦!!☆⌒(*&#xff3e;-゜)v * 在这里需要注意的是&…

史上最全SQL学习指南(教程+实例+练习题)

报告称&#xff0c;未来10年数据细分岗位将扩张5倍&#xff0c;大数据19w的人才缺口将继续增加。国内外一线互联网公司纷纷开设了数据分析岗位。 数据分析岗位中用的最频繁的工具就是SQL了。不论是满足业务日常取数需求&#xff0c;还是自己做分析&#xff0c;都离不开SQL。 …

SQL入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

导读&#xff1a; SQL语言有40多年的历史&#xff0c;从它被应用至今几乎无处不在。我们消费的每一笔支付记录&#xff0c;收集的每一条用户信息&#xff0c;发出去的每一条消息&#xff0c;都会使用数据库或与其相关的产品来存储&#xff0c;而操纵数据库的语言正是 SQL &…

SQL零基础入门必知必会!

&#x1f4da; 前言 SQL语言有40多年的历史&#xff0c;从它被应用至今几乎无处不在。我们消费的每一笔支付记录&#xff0c;收集的每一条用户信息&#xff0c;发出去的每一条消息&#xff0c;都会使用数据库或与其相关的产品来存储&#xff0c;而操纵数据库的语言正是 SQL &am…

redis:redis缓冲区溢出怎么办

引入 什么是缓冲区&#xff1a;用一块内存空间来暂时存放命令数据&#xff0c;以免出现因为数据和命令的处理速度慢与发送速度而导致的数据丢失和性能问题但是问题是&#xff0c;因为缓冲区的内存空间是有限的&#xff0c;如果往里面写入数据的速度大于从里面读取数据的速度&a…

【缓冲区溢出】堆溢出原理

一、操作系统中堆和栈的区别 堆内存申请&#xff0c;释放&#xff0c;操作&#xff0c;特点&#xff1a; 1. 堆内存申请环境:堆内存需要程序员在程序中申请 &#xff0c;动态分配&#xff0c;申请的大小有程序决定。 2. 堆内存申请方法&#xff1a;C语言中的malloc&#xff08;…

本地缓冲区溢出

本地缓冲区溢出 【实验目的】 1、掌握缓冲区溢出的基本原理&#xff1b; 2、熟练利用jmp.egp指令实现缓冲区溢出&#xff1b; 3、掌握缓冲区溢出的危害及其防范手段。 【实验环境】 登录Linux靶机环境&#xff0c;在无root权限的情况下&#xff0c;通过编译运行程序&#x…

关于缓冲区溢出(Buffer Overflow)

接触黑客的同志们经常遇到&#xff0c;使用一些扫描工具扫描的时候&#xff0c;会得到一些缓冲区溢出的漏洞&#xff0c;但是怎么利用自己是一团雾水 网上很少有相关的工具&#xff0c;也很少有相关的文章&#xff0c;下面我们就说说这个“窿西”吧 [蛋痛]文章丢失了一次&…

高并发缓存队列防止溢出解决方案

目录 1 背景介绍1.1 设计分析微信抢红包1.2 红包定时导入缓存队列 2 队列术限流2.1 高并发场景分析2.2 队列削峰实战 3 设计原则3.1 动静分离3.2 微服务化3.3 负载均衡3.4 异步消息3.5 缓存预热 4 Nginx通过LUA脚本访问RabbitMQ消息队列 1 背景介绍 并发量非常大的系统&#x…

【2021.12.12】缓冲区溢出利用

文章目录 1.1 实验环境和开发工具1.2 任务描述1.3 分析过程1.4 结论1.4.1 利用漏洞1.4.2 修复漏洞 1.1 实验环境和开发工具 处理器 i5-8300H 内存&#xff08;RAM&#xff09; 8G 硬盘 476G 软件环境&#xff1a; Windows 10 开发工具: Visual studio 2019 IDA PRO7.5 1.2 …

本地缓冲区溢出分析

栈溢出是缓冲区溢出中最为常见的一种攻击手法&#xff0c;其原理是&#xff0c;程序在运行时栈地址是由操作系统来负责维护的&#xff0c;在我们调用函数时&#xff0c;程序会将当前函数的下一条指令的地址压入栈中&#xff0c;而函数执行完毕后&#xff0c;则会通过ret指令从栈…

关于缓冲区溢出的对策

从编译器的角度出发 以下两种方法均是编译器采取的关于缓冲区溢出的对策 Stackshield 主要思想是在函数调用之前&#xff0c;将return address的副本保存在一个安全的地方&#xff0c;函数返回时将返回地址与预先保存的返回地址比较&#xff0c;以判断缓冲区溢出是否发生。 …

浅析缓冲区溢出

最近一直在学习缓冲区溢出漏洞的攻击&#xff0c;但是关于这一块的内容还是需要很多相关知识的基础&#xff0c;例如编程语言及反汇编工具使用。所以研究透彻还需要不少的时间&#xff0c;这里简单的做一个学习的总结&#xff0c;通过具体的实验案例对缓冲区溢出进行简要的解析…

缓冲区溢出原理详解

下面将有实例引入缓冲区溢出的介绍&#xff1a; void main() { int i0; int a[]{1,2,3,4,5,6,7,8,9,10}; for(i0;i<10;i) { a[i]0;printf("Hello World!\n");} } 首先&#xff0c;这段代码会出现死循环&#xff0c;为什么&#xff1f;因为数组溢出了&…

C语言 缓存区溢出 3221225725

目录 问题描述解决办法&#xff1a; 问题描述 DEV-C报错 Process exited after 4.03 seconds with return value 3221225725 原因 数组定义的容量太大 - 五十万起步的样子 而且每次循环都会再定义一次&#xff0c;导致缓存区溢出 解决办法&#xff1a; 思路来源&#xff1a…

什么是缓冲区溢出?有什么危害?原因是什么?

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量&#xff0c;溢出的数据覆盖在合法数据上。 危害有以下两点&#xff1a; 1、程序崩溃&#xff0c;导致拒绝服务 2、跳转并且执行一段恶意代码 原因&#xff1a;造成缓冲区溢出的主要原因是程序中没有仔细检查用…

什么是缓冲区溢出?有说明危害?

缓存溢出 缓存溢出(Buffer overflow) &#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满-一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以…