在第一篇内容中,我们已经搞定了SQL的两大基础模块:DDL数据定义语言(库表结构的搭建)、DML数据操作语言(数据的增删改)。而在人工智能开发的全流程中,80%以上的数据工作都围绕查询展开——训练数据集的筛选与提取、特征维度的统计与分析、模型效果的指标验证、脏数据的排查与清洗,核心都依赖SQL的DQL数据查询能力。
今天是SQL学习的第二天,我们将完整拆解DQL单表查询的全模块内容,从最基础的数据提取,到进阶的筛选、统计、分组、分页,把单表查询的底层逻辑和使用规则讲透,帮大家搭建起完整的SQL查询知识体系。
一、DQL的核心定位与完整执行逻辑
1.1 DQL的核心作用
DQL全称数据查询语言,是SQL中使用频率最高、功能覆盖最广的核心模块,唯一的作用就是从数据表中,提取、筛选、统计出我们需要的数据,不会对数据库、数据表的结构和原有数据造成任何修改,是数据处理、数据分析的核心工具。
1.2 单表查询的完整结构
一个完整的单表查询,有固定的书写结构,从上到下依次为:去重与列提取、数据来源表、组前筛选、分组字段、组后筛选、排序规则、分页限制。
每个部分各司其职,既可以组合使用完成复杂查询,也可以单独使用完成简单的数据提取。
1.3 SQL查询的执行顺序
绝大多数新手写查询出现错误,核心原因都是混淆了查询语句的书写顺序和数据库的执行顺序。数据库并不会按照我们书写的顺序从上到下执行,而是有固定的执行优先级,顺序如下:
- 先确认数据来源:确定要从哪张数据表中提取数据
- 组前筛选:对全表数据进行第一轮过滤,剔除不符合基础条件的数据
- 数据分组:将筛选后的数据,按照指定的字段进行分类分组
- 组后筛选:对分组完成后的结果,进行第二轮过滤
- 列提取与去重:确定最终要展示的列,对列做运算、别名设置,以及剔除重复数据
- 结果排序:对最终的查询结果,按照指定规则进行排序
- 结果限制:对最终返回的数据行数做限制,完成分页处理
理解这个执行顺序,是写出正确、高效查询语句的核心基础,后续所有模块的使用规则,都围绕这个执行顺序展开。
二、简单查询:数据提取的基础能力
简单查询是所有查询的基础,不涉及数据筛选,仅用于从数据表中提取我们需要的列内容,核心分为4种常用场景。
2.1 全内容查询
全内容查询,即提取数据表中所有列的全部数据,一般仅用于测试环境查看表内的基础数据,不推荐在正式项目和AI数据处理中使用,避免因数据量过大、列数过多造成性能浪费。
2.2 指定列查询
指定列查询,即仅提取数据表中我们需要的某几列内容,是实际工作中最常用的基础查询方式。
优势在于可以精准提取目标数据,减少不必要的数据传输,提升查询效率,同时避免无关列的干扰,比如在AI特征工程中,我们仅需要提取和模型训练相关的特征列,就可以通过指定列查询完成。
2.3 列别名设置
在提取列的过程中,我们可以给原有的列名设置一个新的别名,别名不会修改数据表的原有列名,仅在本次查询的结果中生效。
别名的核心作用有两个:一是简化复杂的列名,提升查询结果的可读性;二是给经过运算、统计处理的列设置清晰的名称,明确列的含义。
2.4 列的运算处理
对于数值类型的列,我们可以在提取的过程中,直接对列的数值进行基础的运算处理,处理后的结果会作为新的列展示在查询结果中,不会修改表内的原有数据。
这个能力在AI数据处理中非常常用,比如对特征列做数值缩放、单位转换、多特征的基础组合计算,都可以通过列运算直接完成。
三、条件查询:精准筛选目标数据
条件查询是数据精准提取的核心,通过where关键字设置筛选规则,仅保留符合规则的数据行,剔除不符合要求的数据,是筛选训练样本、过滤脏数据的核心能力。
条件查询的筛选规则,分为5大类,覆盖绝大多数筛选场景。
3.1 比较运算筛选
比较运算筛选,是最基础的筛选方式,通过大于、小于、大于等于、小于等于、等于、不等于这6种规则,对列的数值进行比较,筛选出符合比较结果的数据。
常用于数值范围的基础筛选,比如筛选年龄在指定区间的用户样本、筛选数值大于阈值的特征数据。
3.2 范围匹配筛选
范围匹配筛选分为两种场景,分别对应连续区间和非连续区间的筛选:
- 连续区间筛选:用于筛选某一列的数值在一个连续的闭区间内的数据,包含区间的两个端点,比如筛选成绩在60分到90分之间的样本,替代多个比较运算的组合,简化书写逻辑。
- 非连续区间筛选:用于筛选某一列的数值在几个不连续的指定值中的数据,比如筛选城市为北京、上海、广州的样本,无需写多个等于条件的组合,提升筛选效率。
3.3 多条件逻辑组合
当我们需要同时设置多个筛选条件时,就需要通过逻辑运算符来组合条件,核心有3种逻辑规则:
- 且逻辑:多个条件必须同时全部满足,该行数据才会被保留,只要有一个条件不满足,就会被过滤掉。
- 或逻辑:多个条件中只要满足任意一个,该行数据就会被保留,只有所有条件都不满足时,才会被过滤掉。
- 非逻辑:对已有的筛选条件取反,原本符合条件的数据会被过滤,原本不符合条件的数据会被保留。
这里需要注意,且逻辑的优先级高于或逻辑,如果不确定优先级,可通过分组的方式明确执行顺序,避免筛选结果出错。
3.4 模糊匹配查询
模糊匹配查询,用于对文本类型的列进行内容匹配筛选,不需要完全匹配文本内容,仅通过通配符匹配部分内容即可完成筛选。
核心有两个通配符,分别对应不同的匹配场景:
- 单字符通配符:用于匹配任意1个字符,常用于固定长度的文本匹配,比如匹配手机号中间几位、昵称固定字数的内容。
- 多字符通配符:用于匹配任意数量的字符,数量可以是0个到无数个,是最常用的模糊匹配方式,比如匹配账号以指定内容开头、昵称包含指定关键词的样本。
3.5 空值校验筛选
空值校验筛选,用于筛选某一列的内容为空、或者不为空的数据,是数据清洗中最常用的能力之一。
这里有一个高频踩坑点:空值的判断有固定的专用规则,不能用等于、不等于的比较运算来判断空值,必须使用专用的空值、非空值判断规则,否则会出现筛选结果不符合预期的问题。
在AI数据处理中,我们经常需要通过非空校验,剔除特征列为空的脏样本,避免影响模型训练效果。
四、聚合查询:数据统计的核心工具
聚合查询是数据统计分析的核心,用于对一列的所有数据做纵向的聚合计算,最终返回一个统计结果,是AI数据统计、特征分布分析、指标计算的核心能力。
4.1 聚合查询的核心特点
聚合查询的核心特点是针对某一列做纵向操作,也就是对该列的所有行数据做统一的统计计算,不会单独关注某一行的数据,最终只会返回一个统计后的结果,不会返回明细数据。
4.2 常用聚合统计能力
常用的聚合统计能力,覆盖了绝大多数数据统计场景,具体如下:
- 计数统计:用于统计表内符合条件的数据总行数,是最常用的聚合能力,比如统计训练样本的总数量、某一类别的样本数量。
- 最大值统计:用于计算指定列中的最大值,如果是文本类型的列,则会按照字符串的排序规则返回结果,常用于统计特征的极值、样本的最大数值。
- 最小值统计:用于计算指定列中的最小值,和最大值统计规则一致,常用于统计特征的极值、样本的最小数值。
- 求和统计:用于计算指定数值列的所有数值之和,如果列不是数值类型,计算结果会为0,常用于统计样本的数值总和、特征的累计值。
- 平均值统计:用于计算指定数值列的平均值,结果可能是小数,常用于统计特征的均值、样本的平均数值,是特征工程中最常用的统计能力之一。
4.3 新手易混淆的统计细节
在计数统计中,有几种不同的写法,对应的统计逻辑完全不同,新手很容易混淆:
- 全表计数:会统计表内的总行数,不会忽略空值,哪怕某一行的所有列都为空,也会被统计进去,是最常用的计数方式,能准确统计样本的总行数。
- 固定值计数:和全表计数的效果一致,同样会统计所有行数,性能和全表计数基本无差别。
- 指定列计数:只会统计该列中非空值的行数,会忽略该列为空的行,如果需要统计某一列有有效内容的样本数量,适合用这种方式。
五、分组查询:分类统计的进阶能力
分组查询是单表查询的进阶能力,和聚合查询配合使用,可以实现分类别的数据统计,是分析数据分布、类别特征的核心工具。
5.1 分组查询的核心作用
分组查询的核心作用,是将数据表中的数据,按照我们指定的一个或多个字段进行分类,字段内容完全相同的行会被分到同一个组中,之后聚合函数就会针对每个分组单独做统计计算,最终每个分组都会返回一个统计结果。
比如我们可以按照性别、年龄段、城市等字段对用户样本进行分组,统计每个分组的样本数量、特征均值,以此分析样本的分布情况,这在AI数据集的分析中非常常用。
5.2 分组查询的使用规则
分组查询有一个严格的使用规则:分组查询的结果中,只能包含分组字段,以及聚合函数统计的结果,不能包含其他非分组的明细字段。
这个规则的核心原因是,分组后每个分组只会返回一行统计结果,如果加入非分组的明细字段,数据库无法确定该字段应该返回分组中的哪一个值,会出现查询错误。
5.3 组前筛选where与组后筛选having
where和having都可以做数据筛选,也是新手最容易混淆的两个知识点,二者的核心区别有两点,完全对应我们之前讲的SQL执行顺序:
- 执行时机与功能不同:where是分组之前执行,先对全表数据做筛选,再对筛选后的数据进行分组,属于组前筛选;having是分组之后执行,仅对分组完成后的统计结果做筛选,属于组后筛选。
- 聚合函数的使用规则不同:where执行时,分组和聚合统计还没有完成,所以where后面不能跟聚合函数;having执行时,聚合统计已经完成,所以having后面可以正常使用聚合函数做筛选。
这里有一个核心的使用原则:能在where里完成的筛选,尽量不要放到having里,因为组前筛选可以提前剔除大量无效数据,减少分组和统计的计算量,大幅提升查询效率。
六、排序查询:结果的有序化处理
排序查询用于对最终的查询结果,按照我们指定的字段和规则进行排序,让数据按照我们需要的顺序展示,方便查看数据的分布、极值、排名情况。
6.1 排序查询的核心作用
排序查询可以让无序的查询结果,按照指定的规则变成有序的结果,无论是数值的大小排序、时间的先后排序,还是文本的字典序排序,都可以实现,常用于查看数据的排名、极值、趋势,比如按照样本的置信度排序、按照特征的数值大小排序。
6.2 排序查询的使用规则与细节
- 排序的位置:排序语句在整个查询结构中,书写位置仅早于分页限制,除了分页之外,排序是整个查询流程中最后执行的步骤。
- 排序方向:排序分为升序和降序两种,升序即从小到大排序,是默认的排序方向,可以省略不写;降序即从大到小排序,需要显式指定排序方向。
- 多字段排序:支持同时指定多个排序字段,排序规则为:先按照第一个排序字段进行排序,只有当第一个排序字段的数值相同时,才会按照第二个排序字段进行排序,以此类推。
七、分页查询:大数据量的分批处理
分页查询用于限制最终查询结果返回的行数,是处理大数据量查询的核心能力,无论是前端页面的分页展示,还是AI场景中大数据集的分批拉取,都离不开分页查询。
7.1 分页查询的核心价值
分页查询的核心优势有三点:
- 降低服务器的压力,每次只需要返回一小部分数据,无需一次性拉取全量数据,避免数据库性能过载。
- 降低数据处理的压力,尤其是在AI数据处理中,面对百万、千万级的数据集,一次性拉取全量数据很容易造成内存溢出,分批拉取可以有效规避这个问题。
- 提升查看和使用的体验,无需面对海量的全量数据,可以按需分批查看和处理数据。
7.2 分页查询的核心规则
- 索引规则:SQL表中的每一行数据,都有自己的行索引,索引编号从0开始,而不是从1开始,这是新手最容易踩坑的点。
- 格式规则:分页查询需要指定两个核心参数,第一个参数是起始索引,即从第几行数据开始返回;第二个参数是返回的数据条数,即最多返回多少行数据。
- 简化规则:如果只需要从第一行数据开始返回,也就是起始索引为0时,可以省略起始索引,只写返回的数据条数即可。
7.3 分页的通用计算逻辑
在实际的分页场景中,我们通常会提前确定每页展示的数据条数,以及要查看的页码,这里有固定的通用计算公式:
- 每页的起始索引 = (当前页码 - 1) × 每页的数据条数
- 总页数 = (数据总条数 + 每页的数据条数 - 1) ÷ 每页的数据条数
这里的总页数计算需要用整除的方式,避免出现小数,确保所有数据都能被覆盖。
八、去重查询:剔除重复干扰数据
去重查询用于剔除查询结果中的重复数据,仅保留不重复的唯一数据,常用于数据去重、类别统计、脏数据清洗。
8.1 去重查询的核心作用
去重查询的核心作用,是对查询结果中的数据做去重处理,当查询结果中有多行数据的内容完全一致时,仅保留其中一行,剔除其他重复的行。
在AI数据处理中,常用于统计数据集中有多少个不同的类别、剔除重复的样本数据,避免重复样本影响模型的训练效果。
8.2 去重查询的使用规则
去重查询是对查询的所有列做联合去重,只有当多行数据中,所有查询列的内容都完全相同时,才会被判定为重复数据;如果只有部分列的内容相同,其他列不同,不会被判定为重复数据。
如果只需要对某一个列做去重,仅查询该列,再加上去重规则即可。
九、逻辑图


1203

被折叠的 条评论
为什么被折叠?



