96SEO 2026-08-03 16:29 20
大家好,我是大华!

MySQL 有很多高级但实用的功能,能让你的查询变得更简洁、更高效。但你是否遇到过这些问题,怎么说呢,
今天分享10个我在工作中经常使用的SQL技巧。不用死记硬背,掌握了就能立刻提高你的数据库操作水平!
痛点:嵌套子查询难以阅读和维护,逻辑混乱不堪!
-- 传统子查询,难以阅读
SELECT nickname
FROM system_users
WHERE dept_id IN (
SELECT id FROM system_dept WHERE `name` = 'IT部');-- 使用CTE,逻辑清晰
WITH ny_depts AS (
SELECT id FROM system_dept WHERE `name` = 'IT部'
)
SELECT u.nickname
FROM system_users u
JOIN ny_depts nd ON u.dept_id = nd.id;
解释:
WITH ny_depts AS 先创建一个临时结果集,叫 ny_depts里面只包含“IT部”的部门名称。SELECT u.nickname FROM system_users u JOIN ny_depts...再从使用者表中找出那些部门ID在ny_depts里的员工昵称。好处:把找部门和找人分成两步。逻辑更清楚,比嵌套子查询好读多了。
痛点:需要同时展示原始数据和统计结果时不得不分组或多次查询!
SELECT
name,department,salary。RANK OVER AS rank_in_dept,G OVER AS avg_salary
FROM employees;
p strong》对比 GROUP BY:GROUP BY会把多行合并成一行。而窗口函数保留原始行,同时加上统计值。/ strong》
h2>.条件聚合——一行查出多个统计/ h2》
p strong》痛点:需要多次运算或子查询才能得到不同状态的统计!/ strong》
pre code class="hljs language-sql" lang="sql">SELECT
YEAR AS year。COUNT AS total,COUNT AS completed,SUM AS revenue
FROM orders
GROUP BY YEAR;code>/ pre》
p strong》解释:/ strong》 ul》
li》YEAR:提取订单年份./ li》
li》COUNT:该年总订单数./ li》
li COUNT:如果状态是 completed。就返回,否则返回 NULL;COUNT只统计非NULL值。所以这行就是"完成的订单数"./ li》
li SUM:只对完成的订单求金额总和./ li_
/ ul_
p strong关键:不用写多个子查询,一条语句搞定全年报表!/ strong_
h2>.自连接——同一张表自己连自己/ h2_
p strong痛点:需要比较同表中不同记录间关系时无法直接实现!/ strong_
pre code class="hljs language-sql" lang="sql">SELECT e1.name,e2.name
FROM employees e1
JOIN employees e2 ON e1.department = e2.department AND e1.id lt;
老实说,e2.id AND ABS le;老实说,e1.salary *;code>/ pre_
p strong解释:/ strong_ ul_
li employees e1 JOIN employees e2:把员工表当成两个副本来连接./ li_
li e1.department = e2.department:只找同一个部门的人./ li_
lli id lt;e2.id避免重复配对./ lili ABS):计算两人薪水差是否le % . / lili_ _ _ _
/ ul_
p strong用途:/强调找"相似记录""配对关系""上下级等场景非常有用. _ /强调_/强化
h3.EXISTS替代IN——更高效的存在判断/h3_
p强化痛点:IN子查询性能低下且容易受NULL影响!老实说,/强化
precode class="hljs language-sql" lang="sql">SELECT name FROM customers c WHERE EXISTS;/pre
p強化解释: ull对每一位客户c,检查是否存在一笔订单满足:
ulli订单的customerid等于这个客户的id/ili订单金额gt;/i/u/liSELECT :这里不需要返回具体字段。只要知道“有没有”就行,so用最轻量./
_strong为什么快?:一旦找到一条匹配订单,就立刻停止搜索,不像IN可能要加载全部订单ID./
从注意来看,如果子查询可能返回NULL。IN会失效永远为UNKNOWN),而EXISTS不受影响./
h3.JSON函数——轻松读取JSON字段/h3_
p強化痛点:JSON数据解析繁琐且容易出错!/強化
pre_code class="hljs language-sql" lang="sql">SELECT name,profile->'$.address.city' AS city JSON_EXTRACTAS age FROM users WHERE profile->'$.city'='Beijing';code>/pre
说到p強化_解释,_ _ul__l_profile是一个JSON类型字段,_比如:{address:{city:"Beijing"}。age:}_/
l_profile->'$.address.city': l_strong_u_-gt;-gt,是简写,_等价于JSON_UNQUOTE)_/_l__l返回字符串Beijing_/
l_JSON_EXTRACT_:返回_/
l_WHERE profile->'$.city'='Beijing':筛选城市是北京的使用者._/
h3.生成列——数据库自动帮你算/h3_
从p強化_痛点来看。_重复计算导致性能浪费且容易出错!_/強化_
pre_code class="hljs language-sql" lang="sql">CREATE TABLE products。height DECIMAL,area DECIMALASSTORED);INSERT INTO products,);code>/pre
p強化_解释的观点是,_ _ul__l_area DECIMALAS./_/_u-/stron/l_i插入时只需给width和height_。area自动变成_.-_/_u/l_h3.多表更新——一条语句更新关联数据/h3__
p強力___痛点___跨表批量更新要循环处理或手动关联!__/
pre_code class=_"hljs language-sql"_lang=_"sql"_UPDATE customers c JOIN _AS total FROM orders GROUP BY customer_id_)o ON c.id=o.customer_id SET c.total_spent=o.total_;其实,__/
p強力___解释___:
-ul_
-
子查询o先按客户ID统计每个人的总消费.
把客户表和统计结果连接起来.
spent=o.total直接把统计值写回客户表.
/ul__
p強力___好处___不用在程序里循环“查一个、改一个”。减少网络开销,**保证原子性**.__
h3.GROUP_CONCAT——多行变一行/h3__
p強力___痛点___将多行聚合为标量值麻烦!__/
pre_code class=_"hljs language-sql"_lang=_"sql"_SELECT department GROUP_CONCATAS members FROM employees GROUP BY department_;__/
p強力___解释___:
-ul_
CONCAT把每个部门所有员工名字拼成一个字符串.
ul
p典型用途导出名单、展示标签、汇总明细等.
默认最多拼个字符,可通过SET SESSION groupconcatmax_len=.调大.
h3.INSERT...ON DUPLICATE KEY UPDATE——智能插入更新/h3__
p***强力____*_***痛点****UPSERT需手动先INSERT再UPDATE!*//****
***pre***_***码class***=_*"***"***"language-***"***-***sq"***"_**lang***=_*"***"***-**"*-**"*-"***-**"**-"***-**"*-"***-"*/**
INSERT INTO page_views
VALUES)
ON DUPLICATE KEY UPDATE view_count=view_count+;***/***/**
***/*/*/*/*/***
******/*/*/****
*****/*试图插入新记录页面/home今天日期访问次数为。*****如果因为唯一索引冲突导致插入失败:
*-就执行ON DUPLICATE KEY UPDATE部分**
*-把原有view_count加**
***/*
*****效果第一次访问创建记录之后每次访问自动+完美实现计数器!***/*
从**前提**来看,必须有主键或唯一索引否则不会触发更新.
blockquote*p这篇文章首发于公众号程序员刘大华专注前后端开发实战笔记关注我少走弯路共进步!
h4 data-idheading-📌往期精彩h4
*p《asyncawait到底要不要加try-catch?异步错误处理常用方法》《如何SpringBoot当前线程?种方法自己试过有效》《Java开发必看什么时候for什么时候Stream?》《别再乱newArrayList大Java容器选型案例篇看懂
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback