Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL高级用法

一文分享10个常用的MySQL高级用法

作者:刘大华

MySQL 有很多高级但实用的功能,能让你的查询变得更简洁、更高效,今天分享 10 个我在工作中经常使用的 SQL 技巧,不用死记硬背,掌握了就能立刻提升你的数据库操作水平

MySQL 有很多高级但实用的功能,能让你的查询变得更简洁、更高效。

今天分享 10 个我在工作中经常使用的 SQL 技巧,不用死记硬背,掌握了就能立刻提升你的数据库操作水平!

1. CTE(WITH子句)——让复杂查询变清晰

-- 传统子查询,难以阅读
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;

解释:

好处:把找部门和找人分成两步,逻辑更清楚,比嵌套子查询好读多了。

2. 窗口函数 —— 不分组也能统计

SELECT 
    name,
    department,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_in_dept,
    AVG(salary) OVER (PARTITION BY department) AS avg_salary
FROM employees;

解释:

对比 GROUP BYGROUP BY 会把多行合并成一行,而窗口函数保留原始行,同时加上统计值。

3. 条件聚合 —— 一行查出多个统计

SELECT 
    YEAR(created_at) AS year,
    COUNT(*) AS total,
    COUNT(CASE WHEN status = 'completed' THEN 1 END) AS completed,
    SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS revenue
FROM orders
GROUP BY YEAR(created_at);

解释:

关键:不用写多个子查询,一条语句搞定全年报表!

4. 自连接 —— 同一张表自己连自己

SELECT e1.name, e2.name
FROM employees e1
JOIN employees e2 
  ON e1.department = e2.department
  AND e1.id < e2.id  
  AND ABS(e1.salary - e2.salary) <= e1.salary * 0.1;

解释:

用途:找“相似记录”“配对关系”“上下级”等场景非常有用。

5.EXISTS替代IN—— 更高效的存在判断

SELECT name FROM customers c
WHERE EXISTS (
    SELECT 1 FROM orders o 
    WHERE o.customer_id = c.id AND o.amount > 1000
);

解释:

注意:如果子查询可能返回 NULLIN 会失效(因为 x IN (..., NULL) 永远为 UNKNOWN),而 EXISTS 不受影响。

6. JSON 函数 —— 轻松读取 JSON 字段

SELECT 
    name,
    profile->>'$.address.city' AS city,
    JSON_EXTRACT(profile, '$.age') AS age
FROM users
WHERE profile->>'$.city' = 'Beijing';

解释:

适用场景:用户偏好、动态表单、日志等结构不固定的字段。

7. 生成列 —— 数据库自动帮你算

CREATE TABLE products (
    id INT PRIMARY KEY,
    width DECIMAL(10,2),
    height DECIMAL(10,2),
    area DECIMAL(10,2) AS (width * height) STORED
);

INSERT INTO products (id, width, height) VALUES (1, 5, 10);

解释:

优势:避免应用层重复计算,还能给 area 加索引加速查询!

8. 多表更新 —— 一条语句更新关联数据

UPDATE customers c
JOIN (
    SELECT customer_id, SUM(amount) AS total
    FROM orders
    GROUP BY customer_id
) o ON c.id = o.customer_id
SET c.total_spent = o.total;

解释:

好处:不用在程序里循环“查一个、改一个”,减少网络开销,保证原子性。

9.GROUP_CONCAT—— 多行变一行

SELECT 
    department,
    GROUP_CONCAT(name ORDER BY salary DESC SEPARATOR ', ') AS members
FROM employees
GROUP BY department;

解释:

典型用途:导出名单、展示标签、汇总明细等。

默认最多拼 1024 字符,可通过 SET SESSION group_concat_max_len = 1000000; 调大。

10.INSERT ... ON DUPLICATE KEY UPDATE—— 智能插入/更新

INSERT INTO page_views (page_url, view_date, view_count)
VALUES ('/home', CURDATE(), 1)
ON DUPLICATE KEY UPDATE 
    view_count = view_count + 1;

解释:

前提:表必须有主键或唯一索引,否则不会触发更新。

到此这篇关于一文分享10个常用的MySQL高级用法的文章就介绍到这了,更多相关MySQL高级用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文