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

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

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 valORDER BY val DESCSEPARATOR ' | ') 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(产品名)
  • 需求:按日期分组,统计每天销售的不同产品数量和产品名称列表
解决方案
SELECTsell_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.dtcms.com/a/456969.html

相关文章:

  • 个人网站开发 怎么赚钱吗wordpress阿里图标库
  • 镇江网站推广排名有回定ip怎么做网站
  • Windows 11系统鼠标键盘被禁用问题的全面解决方案
  • 多字节串口收发IP设计(一)概述
  • python如何使用abd操作手机
  • PHP SimpleXML 深入解析与应用
  • C# MVC 修复DataTable时间排序以及中英文系统的时间筛选问题
  • 【netty实战】从零构建一个带GUI的简易聊天室
  • 阿里云无主体新增网站阿里云网站用什么做的
  • 做营销策划的上哪个网站好做房产的网站排名
  • 深入理解CSS BFC:块级格式化上下文
  • 226. 翻转二叉树 LeetCode 热题 HOT 100
  • Python人工智能编程从零开始掌握机器学习基础
  • Linux V4L2框架详解:Camera软件架构与驱动实现
  • javaweb--JavaScript
  • CachyOS:面向游戏的 Arch Linux 优化与安装配置指南
  • Encoder-Decoder架构的模型简介
  • 哪些网站适合花钱做推广房产网新房
  • OpenTiny 进阶学习指南:从全景到精微的高效成长之路
  • 制作网站电话如何在本地安装wordpress
  • 9-mysql编程
  • 十堰专业网站建设科技公司网站设计欣赏
  • [linux仓库]信号快速认识[进程信号·壹]
  • 【开题答辩实录分享】以《走失人口系统档案的设计与实现》为例进行答辩实录分享
  • 【智能体】Ch3-提升模型性能的定向学习(Enhancing model performance with targeted learning)
  • 【LLM】大模型vibe coding(cursor、copilot、comate)
  • 如何创建网站教程视频react做前台网站
  • Web 开发 24
  • 深入理解RNN及其变体:从传统RNN到LSTM、GRU(附PyTorch实战)
  • Linux 服务器常见的性能调优