当前位置: 首页 > news >正文

经典sql题(十四)炸裂函数的恢复

下面是一个关于 SELECT 语句的例子,该示例展示了如何使用 CONCAT_WSCOLLECT_LIST 函数来处理炸裂之后学生成绩的数据。假设我们有一个名为 test 的表,结构如下:

表结构 test

student_idstudent_nameclassscore
1AliceClass190
1AliceClass185
1AliceClass180
2BobClass275
2BobClass280

SQL 查询示例

下面的 SQL 查询将使用 CONCAT_WSCOLLECT_LIST 函数来合并数据:

SELECT student_id, student_name, CONCAT_WS(',', COLLECT_LIST(score)) AS scores,CONCAT_WS(' ', class) AS classes
FROM test
GROUP BY student_id, student_name;

查询结果

student_idstudent_namescoresclasses
1Alice90,85,80Class1
2Bob75,80Class2

说明

  • CONCAT_WS: 在这里我们使用 CONCAT_WS 来将 scores 列中的分数合并为一个以逗号分隔的字符串。COLLECT_LIST(score) 将所有分数作为列表收集。

  • GROUP BY: 使用 GROUP BY 子句按照 student_idstudent_name 进行分组,这样可以将每个学生的分数合并到一行中。

  • classes: 由于每个学生的班级是相同的,因此可以简单地用 CONCAT_WS 将班级信息合并。

下文将详细介绍 SQL 中的 CONCATCONCAT_WSCOLLECT_LISTCOLLECT_SET 函数,以及它们在实际应用中的区别和用法。

1. 数据合并函数对比

1.1 CONCAT

  • 功能: 用于将多个字符串连接成一个字符串。
  • 用法: 只支持字符串类型的输入。
示例:
SELECT CONCAT('A', 'B', 'C') AS result; 
-- 输出 'ABC'

1.2 CONCAT_WS

  • 功能: 用于将多个字符串连接成一个字符串,但可以指定分隔符。
  • 用法: 接收一个分隔符作为第一个参数,后续参数为要连接的字符串。
  • 注意: 仅适用于字符串类型。
示例:
SELECT CONCAT_WS(',', 'A', 'B', 'C') AS result; 
-- 输出 'A,B,C'

1.3 COLLECT_LIST

  • 功能: 将多行数据合并为一个数组,保留重复值。
  • 用法: 常用于分组查询中。
示例:
SELECT student_id, COLLECT_LIST(score) AS scores
FROM student_scores
GROUP BY student_id;

结果:

student_idscores
1[90, 85, 80]
2[75, 80]

1.4 COLLECT_SET

  • 功能: 将多行数据合并为一个集合,去重。
  • 用法: 仅保留唯一值,消除重复元素。
示例:
SELECT student_id, COLLECT_SET(score) AS scores
FROM student_scores
GROUP BY student_id;

结果:

student_idscores
1[90, 85, 80]
2[75, 80]

2. 主要区别总结

CONCAT vs CONCAT_WS:

  • CONCAT: 直接将字符串连接,不支持分隔符。
  • CONCAT_WS: 允许指定分隔符,使合并结果更具可读性。

COLLECT_LIST vs COLLECT_SET:

  • COLLECT_LIST: 会保留重复值,适用于需要保留所有数据的场景。
  • COLLECT_SET: 去重,只保留唯一值,适用于需要消除重复项的场合。

数据类型:

  • CONCATCONCAT_WS: 仅适用于字符串类型。
  • COLLECT_LISTCOLLECT_SET: 可用于任何数据类型。

3. 适用场景

  • 使用 CONCAT: 当你需要简单字符串连接而不需要分隔符时。
  • 使用 CONCAT_WS: 当你需要在连接字符串时加入特定分隔符以提高可读性时。
  • 使用 COLLECT_LIST: 当你需要合并多行数据并保留所有值(包括重复值)时。
  • 使用 COLLECT_SET: 当你需要合并多行数据并确保结果中只有唯一值时。

相关文章:

  • 资金晋阶司库|基于数字化标准建立的操作类应用
  • 生物医学光学第三章作业:归纳和总结生物发光的主要类型和特点
  • Linux 网络配置 (深入理解)
  • 网站建设公司如何选?2024专业网站建设公司哪家好TOP3
  • 解决json格式转换被特殊字符截断问题
  • EEPROM手册笔记
  • uniapp js向json中增加另一个json的全部数据,并获取json长度
  • 低空经济时代:无人机飞行安全要点详解
  • 探索自闭症表现研究报告:了解最新科研成果
  • 胤娲科技:AI界的超级充电宝——忆阻器如何让LLM告别电量焦虑
  • 【有啥问啥】大型语言模型的涌现能力(Emergent Abilities):新一代AI的曙光
  • 企业微信:客户联系自带群发工具和聊天工具
  • [Cocoa]_[初级]_[绘制文本如何设置断行方式]
  • asm技术简介
  • 中国联通(海外)数据中心资源:从基础设施运维服务到IDC机房增值服务
  • 《Java编程思想》读书笔记-对象导论
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Go 语言编译器的 //go: 详解
  • Javascript Math对象和Date对象常用方法详解
  • Less 日常用法
  • passportjs 源码分析
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • PHP面试之三:MySQL数据库
  • Python学习之路13-记分
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 前端工程化(Gulp、Webpack)-webpack
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 我看到的前端
  • 小李飞刀:SQL题目刷起来!
  • 鱼骨图 - 如何绘制?
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • !!java web学习笔记(一到五)
  • #微信小程序(布局、渲染层基础知识)
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (6)STL算法之转换
  • (C++20) consteval立即函数
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (排序详解之 堆排序)
  • (算法)硬币问题
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转) Android中ViewStub组件使用
  • ..回顾17,展望18
  • .NET 8.0 中有哪些新的变化?
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net 使用ajax控件后如何调用前端脚本
  • .net2005怎么读string形的xml,不是xml文件。
  • @EnableConfigurationProperties注解使用