实用指南:【MYSQL】SQL学习指南:从常见错误到高级函数与正则表达式

news/2025/11/5 12:08:51/文章来源:https://www.cnblogs.com/gccbuaa/p/19193240

SQL学习指南:从常见错误到高级函数与正则表达式

本文将通过一个具体的SQL报错案例,带你逐步深入理解SQL查询、聚合函数和正则表达式的使用。内容涵盖错误分析、函数详解和实战示例,适合SQL初学者和需要查漏补缺的开发者。

文章结构概览

在这里插入图片描述

一、Unknown column ‘sell_date’ in ‘field list’ 错误解析

错误含义

这个报错直译为:“字段列表中找不到名为’sell_date’的列”。意思是SQL语句中引用了一个不存在的列名。

常见原因分析

原因说明示例
拼写错误列名拼写不正确写成了sel1_date(数字1代替字母l)
大小写问题数据库区分大小写表中是sellDate却写了sell_date
字段位置错误把列名放在了错误的位置count()中放入了分组列

实际问题案例

看这个有问题的SQL:

select distinct(self_date), count(self_date), product Activities

这个SQL存在多个问题:

  • count(self_date), product Activities 是非法语法
  • self_date 可能是 sell_date 的拼写错误
  • product Activities 部分语法完全错误

正确写法

假设你想统计每天卖了多少种不同的产品:

SELECT sell_date, COUNT(DISTINCT product) AS product_count
FROM Activities
GROUP BY sell_date
ORDER BY sell_date;

实用建议

在写SQL前,先用以下命令查看表结构:

DESCRIBE Activities;
-- 或
SHOW COLUMNS FROM Activities;

二、GROUP_CONCAT函数详解

什么是GROUP_CONCAT?

GROUP_CONCAT是MySQL的专属聚合函数,作用是将分组后的多行数据中的某个字段值拼接成一个字符串,类似于Excel中的TEXTJOIN或Python中的",".join(list)

完整语法

GROUP_CONCAT([DISTINCT] 列名[ORDER BY 排序列 ASC|DESC][SEPARATOR '分隔符']
)

使用示例

示例数据表t
idval
1A
1B
1A
2C
1. 简单拼接
SELECT id, GROUP_CONCAT(val) AS vals
FROM t
GROUP BY id;

结果:

idvals
1A,B,A
2C
2. 去重 + 排序 + 自定义分隔符
SELECT id,
GROUP_CONCAT(DISTINCT val
ORDER BY val DESC
SEPARATOR ' | ') AS vals
FROM t
GROUP BY id;

结果:

idvals
1B
2C

注意事项

要点说明
默认长度限制默认拼接结果最长1024字符,超长会被截断
修改长度限制SET SESSION group_concat_max_len = 1000000;
跨数据库兼容SQL Server用STRING_AGG,PostgreSQL用STRING_AGG,Oracle用LISTAGG

实战应用:销售数据分组统计

题目要求
  • 表:Activities
  • 字段:sell_date(日期),product(产品名)
  • 需求:按日期分组,统计每天销售的不同产品数量和产品名称列表
解决方案
SELECT
sell_date,
COUNT(DISTINCT product) AS num_sold,
GROUP_CONCAT(DISTINCT product ORDER BY product SEPARATOR ',') AS products
FROM Activities
GROUP BY sell_date
ORDER BY sell_date;
输出示例
sell_datenum_soldproducts
2020-05-302Basketball,Headphone
2020-06-012Bible,Pencil
2020-06-021Mask

三、COUNT(DISTINCT) 函数深度解析

COUNT()的三种常见用法

写法作用是否忽略NULL
COUNT(*)统计所有行数不忽略NULL
COUNT(列名)统计该列非NULL的行数忽略NULL
COUNT(DISTINCT 列名)统计该列去重后非NULL值的个数忽略NULL

为什么用COUNT(DISTINCT product)而不是COUNT(sell_date)?

需求分析
要统计什么用什么列原因
每天按sell_date分组分组依据
卖了多少种不同的产品COUNT(DISTINCT product)需要统计产品种类数
示例数据
sell_dateproduct
2020-06-01Apple
2020-06-01Apple
2020-06-01NULL
2020-06-01Banana
查询与结果
SELECT COUNT(DISTINCT product) AS num_sold
FROM Activities
WHERE sell_date = '2020-06-01';

结果: 2

  • Apple重复,只算1次
  • NULL被忽略
  • 所以结果是2(Apple和Banana)

COUNT(*) vs COUNT(DISTINCT product)

数据示例
sell_dateproduct
2020-06-01Apple
2020-06-01Apple
2020-06-01Banana
对比结果
SQL结果含义
SELECT COUNT(*) FROM Activities WHERE sell_date = '2020-06-01'3这一天有3条销售记录
SELECT COUNT(DISTINCT product) FROM Activities WHERE sell_date = '2020-06-01'2这一天卖过2种产品

四、正则表达式REGEXP_LIKE详解

函数语法

REGEXP_LIKE(被匹配字符串, 正则模式 [, 匹配模式])

参数说明

参数含义示例
第1个要匹配的列或字符串mail
第2个正则表达式1[a-zA-Z0-9._-]*@leetcode\.com$’
第3个可选标志位‘c’(区分大小写)、‘i’(忽略大小写)

实际案例解析

REGEXP_LIKE(mail, '^[a-zA-Z][a-zA-Z0-9._-]*@leetcode\\.com$', 'c')
正则模式分解
片段含义
^字符串开始
[a-zA-Z]第一个字符必须是字母
[a-zA-Z0-9._-]*后面跟任意个字母、数字、点、下划线、短横
@leetcode\\.com字面量@leetcode.com
$字符串结束
'c'区分大小写匹配
匹配示例
邮箱结果原因
user_123@leetcode.com合法
User@leetcode.com合法
123user@leetcode.com首字符不是字母
user@leetcode.com大小写敏感,.Com ≠ .com
user@leetcode.com.cn后缀多余

正则表达式基础知识

常用元字符
符号说明记忆技巧
.任意单字符(换行除外)dot = "点"通配
^行首小箭头朝上
$行尾小箭头朝下
\d数字[0-9]digit
\D非数字[^0-9]大写 = 反义
\s空白字符[\t\n\r]space
\S非空白大写 = 反义
\w单词字符[A-Za-z0-9_]word
量词说明
符号说明示例
*0次或多次a*匹配"", “a”, “aa”
+1次或多次a+匹配"a", “aa”
?0次或1次a?匹配"", “a”
{n}恰好n次a{3}匹配"aaa"
{n,}至少n次a{2,}匹配"aa", “aaa”

为什么用双反斜杠"\."?

转义机制解释

在SQL字符串中使用正则表达式时需要经过两层转义:

你写的SQL解析后正则引擎看到含义
'@leetcode\\.com'@leetcode\.com@leetcode.com字面量点
'@leetcode.com'@leetcode.com@leetcode.com任意字符

如果只用单反斜杠\.,SQL会把它当成未知转义序列,直接扔掉反斜杠,导致正则引擎看到的是普通点号,匹配任意字符。

结论: 在MySQL字符串中,要给正则表达式传递字面量点号,必须写成\\.

常用正则模板

场景正则模式说明
手机号校验^1[3-9]\d{9}$中国大陆11位手机号
提取数字-?\d+提取第一个整数(支持负数)
压缩空白\s+将连续空白压缩成单个空格
邮箱校验^[a-zA-Z][\w.-]*@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$通用邮箱格式

五、总结

通过本文的学习,我们掌握了:

  1. SQL错误调试:学会分析"Unknown column"类错误,掌握查看表结构的方法
  2. 高级聚合函数
    • GROUP_CONCAT:字符串拼接利器,支持去重、排序和自定义分隔符
    • COUNT(DISTINCT):精确统计唯一值数量
  3. 正则表达式
    • REGEXP_LIKE函数的使用方法和参数含义
    • 常用正则元字符和量词
    • SQL中的转义机制

记住,SQL学习是一个循序渐进的过程。遇到错误不要慌张,学会查阅文档、理解错误信息,并多用示例数据进行测试验证。希望这篇文章能帮助你在SQL学习的道路上走得更稳更远!


本文基于实际SQL问题和解决方案整理而成,适用于MySQL数据库。不同数据库系统可能有所差异,请根据实际环境调整。


  1. a-zA-Z ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/956694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月高压氧舱源头厂家哪家好专业指南

摘要 高压氧舱行业在2025年11月迎来技术革新和市场扩张,本文基于权威数据深度解析中国高压氧舱源头厂家的排行榜单,聚焦行业发展趋势、厂家实力对比和选择指南。榜单综合技术领先性、口碑评分和服务成果,为读者提供…

黑帽大会与DefCon29演讲:UEFI固件供应链与RISC-V芯片故障注入技术

本文介绍了在黑帽大会2021和DefCon29上的两场重要演讲,聚焦UEFI生态系统固件供应链安全问题和RISC-V芯片故障注入攻击技术,涉及硬件漏洞挖掘和系统底层安全研究领域。我的黑帽大会2021和DefCon29演讲 今年我将展示一…

2025年11月中国高压氧舱供应厂家权威推荐榜单

文章摘要 随着健康产业快速发展,高压氧舱作为前沿健康科技产品,在2025年迎来爆发式增长。本文基于行业数据和技术分析,为您推荐当前最具实力的高压氧舱供应厂家,其中安徽鼎亿康健康科技有限公司凭借创新技术和卓越…

2025年高压氧舱源头厂家哪家好深度分析

文章摘要 高压氧舱行业在2025年迎来快速发展,广泛应用于医疗、康复和健康管理领域。本文基于权威行业数据和用户调研,发布2025年中国高压氧舱源头厂家前十排名榜单,旨在为采购商和用户提供参考。榜单综合考量技术实…

gnuradio(一) 模块 signal source

gnuradio(一) 模块 signal source Signal Source - GNU Radio复数 可以转换 成 IQ

打印机---重新安装驱动

最近在折腾公司的打印机,做个记录。 由于打印机驱动程序不匹配,可能导致打印机打印速度慢,声音大的问题。 重新安装打印机驱动: 第一步:搜索【设备管理器】找到【打印队列】删除原来的打印机第二步:搜索【打印机…

题解:P7468 [NOI Online 2021 提高组] 愤怒的小 N

题意:有一个由以下方式生成的字符串:初始为 \(s=a\),每次令 \(s\) 令 \(s\) 中 \(a\rightarrow b,b\rightarrow a\),然后令 \(s=s+s\),重复无限次该操作。然后给出一个数 \(n\) 和一个 \(k\) 项的多项式 \(f(x)\)…

MATLAB实现TDOA麦克风阵列声源定位

一、系统设计 1. 硬件配置参数 % 麦克风阵列参数 c = 343; % 声速(m/s) fs = 48000; % 采样率(Hz) mic_pos = [0,0; 0.1,0; 0.1,0.05; 0,0.1]; % 四麦克风正方形阵列坐标2. 信号流图 声源 → 麦克风1 → 预…

深入解析:极简学习工具产品蓝图、路线图、甘特图、交付清单

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:[Web网页] LAMP 架构与环境搭建

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年杭州专业代运营公司权威推荐榜单:直播代播/直播代运营/找电商代运营源头公司精选

电商与内容平台加速融合的背景下,杭州作为"中国电商之都",其代运营行业已进入技术驱动与全域运营的新阶段。据行业数据显示,杭州代运营公司数量已超过300家,占据全国电商代运营市场近40%的份额。2025年,…

2025.11.3 NOIP 模拟赛

前言 T3挂没了,此记。 A AT_chokudai_S002_k 考虑建图,发现如果一个联通块存在环就可以全部贡献,否则只能贡献联通块大小 \(-1\)。 直接算就行。 B P10116 拆贡献,依次对每个出现的位置的方案进行累加。 发现无论序…

2025年透水地坪实力厂家权威推荐榜单:透水路面/透水砼/透水混凝土增强剂源头厂家精选

在生态城市与海绵城市建设持续推进的背景下,透水地坪凭借其优异的透水性能与生态效益,已成为市政工程、园林景观及商业空间的重要铺装材料。据行业报告显示,2025年全球透水园林地坪铺设系统行业市场规模保持稳健增长…

2025 最新推荐移民服务机构排行榜:精选靠谱中介,提供专业澳洲美国欧洲等国移民方案葡萄牙 / 新西兰 / 新加坡 / 投资 / 购房移民公司推荐

引言 随着全球化发展,移民需求持续增长,移民服务机构数量激增,但行业质量参差不齐,选择靠谱机构成为难题。为此,国际移民服务行业协会开展专项测评,结合近 3 年机构服务数据、客户满意度调查(有效样本超 2 万份…

vue项目中使用sm4加密 ,gm-crypto

参考地址 https://www.npmjs.com/package/gm-crypto安装插件命令 npm i gm-crypto使用 import {SM4} from "gm-crypto"const key="xxxxx324324前后端统一的key" const text="需要加密的文本&…

字符串截取方法测试。

package com.example.string;/** * 从字符串中截取指定范围的子字符串或字符。Extract the string. * substring 的起始索引是 0,从索引 0 开始就是从第一个字符开始往后查找并截取到截止索引处。 * 从索引 1 开始就是…

结构(2)If语句和For循环

结构(2)If语句和For循环结构(2)If语句和For循环 If语句 package com.kun.struct;import java.util.Scanner;public class IfDemo01 {public static void main(String[] args) {Scanner scanner = new Scanner(Syst…

B. Fox And Two Dots

https://codeforces.com/problemset/problem/510/B 题意:给定一个n*m的的矩阵,矩阵只包含26个大写字母,矩阵中相邻并且相同的字符可以联通,问矩阵中是否存在数量>=4的环。 思路:视每个位置为一个node,进行编号…

Zotero文件夹中的文献自动更新到LaTeX文件夹中的.bib文件

在Zotero中创建一个你这个论文对应的参考文献的文件夹,如paper1; 在Zotero中选中整个paper1文件夹下的所有的参考文献条目,右键选择导出条目; 弹出对话框中,格式选择Better BibTeX即可,注意框选保持更新选项,如下…

OTA远程升级实现记录

OTA远程升级实现记录STM32程序更新实现 MCU程序更新逻辑是:STM32的flash地址从0x0x0800 0000开始,将flash中分出三个分区,分别作为BootLoader、APP1、APP2,每个区都可能存储着各自的代码程序 MCU上电、复位后从 0x…