1. 使用 GROUP_CONCAT 函数进行分组数据拼接
在日常工作中,我们经常需要使用 GROUP BY 对数据进行分组统计。例如,统计用户表中不同名称的用户数量:
SELECT name FROM `user` GROUP BY name;
但是,如果我们想把具有相同 name 的用户的 code 拼接成一个字符串,并显示在同一列中,可以使用 GROUP_CONCAT 函数:
SELECT name, GROUP_CONCAT(code) FROM `user` GROUP BY name;
执行结果:
通过 GROUP_CONCAT 函数,所有 name 相同的记录将被合并为一行,它们的 code 字段值会以逗号分隔的形式展示出来。
2. 使用 CHAR_LENGTH 函数获取并排序字符长度
当我们需要基于字段内容的长度对查询结果进行排序时,MySQL 提供了 CHAR_LENGTH 函数来计算字符的数量。例如,按照品牌名称的长度升序排列,并限制输出前五个结果:
SELECT * FROM brand WHERE name LIKE '%苏三%' ORDER BY CHAR_LENGTH(name) ASC LIMIT 5;
执行效果:
name 字段中包含关键字“苏三”的记录,按字符长度从小到大排序后返回最多五条记录。
3. 使用 LOCATE 函数定位子串位置
如果要确定某个关键词(如“苏三”)在一个字符串中的具体位置,可以使用 LOCATE 函数:
SELECT * FROM brand WHERE name LIKE '%苏三%' ORDER BY CHAR_LENGTH(name) ASC, LOCATE('苏三', name) ASC LIMIT 5, 5;
执行结果:
首先根据字符长度排序,当长度相同时,则根据“苏三”出现的位置从左至右排序。
此外,还有类似的 INSTR 和 POSITION 函数,它们的功能与 LOCATE 类似,用于查找子串的位置。
4. 使用 REPLACE 函数替换字符串内容
当需要替换字符串中的部分内容时,比如将所有的“A”替换为“B”,可以使用 REPLACE 函数:
UPDATE brand SET name = REPLACE(name, 'A', 'B') WHERE id = 1;
该函数也可以用来移除多余的空格或其他特定模式:
UPDATE brand SET name = REPLACE(name, ' ', '') WHERE name LIKE ' %' OR name LIKE '% ';
对于 JSON 数据格式的内容替换同样适用,这使得它成为一个非常强大的工具。
5. 使用 NOW() 函数获取当前时间
为了快速获取系统当前的时间戳,MySQL 提供了 NOW() 函数,它可以返回包含年月日及时分秒的信息:
SELECT NOW() FROM brand LIMIT 1;
若需精确到毫秒级别,可以使用 NOW(3):
SELECT NOW(3) FROM brand LIMIT 1;
6. 使用 INSERT INTO ... SELECT 插入大量数据
传统插入少量已知数据的方式是使用 VALUES 子句,但对于批量插入来自其他表的数据,推荐使用 INSERT INTO ... SELECT 语法:
INSERT INTO `brand` (`id`, `code`, `name`, `edit_date`) SELECT NULL, code, name, NOW(3) FROM `order` WHERE code IN ('004', '005');
这种方式能够高效地将源表的部分数据插入目标表中。
7. 使用 INSERT IGNORE 处理重复键冲突
为了避免因唯一键冲突而导致的插入失败,可以采用 INSERT IGNORE 语法。它会在遇到重复键时忽略错误并继续执行:
INSERT IGNORE INTO `brand` (`id`, `code`, `name`, `edit_date`) VALUES (123, '108', '苏三', NOW(3));
此方法确保即使存在重复项也不会抛出异常,而是简单地跳过这些记录。
8. 使用 SELECT ... FOR UPDATE 加悲观锁
在处理并发更新场景下(如用户积分扣减),可以通过 SELECT ... FOR UPDATE 来锁定行级资源,防止其他事务修改同一行数据直到当前事务提交:
BEGIN;SELECT * FROM `user` WHERE id = 1 FOR UPDATE;
-- 执行业务逻辑...
UPDATE `user` SET score = score - 1 WHERE id = 1;COMMIT;
重要的是确保锁定条件涉及主键或唯一索引,否则可能导致更广泛的锁定,如表锁。
9. 使用 ON DUPLICATE KEY UPDATE 处理插入更新
当需要在插入新记录的同时处理可能存在的重复键问题时,ON DUPLICATE KEY UPDATE 语法允许我们在检测到重复键时自动执行更新操作:
INSERT INTO `brand` (`id`, `code`, `name`, `edit_date`)VALUES (123, '108', '苏三', NOW(3))ON DUPLICATE KEY UPDATE name = '苏三', edit_date = NOW(3);
这种做法不仅避免了重复数据的问题,还能同步更新现有记录。
10. 使用 SHOW CREATE TABLE 查看表结构详情
想要全面了解某张表的创建语句及其所有属性(包括字段定义、索引信息等),可以直接使用 SHOW CREATE TABLE:
SHOW CREATE TABLE `order`;
执行结果:
输出完整的建表语句,其中包括表名、字段名、字段类型、长度、字符集、主键、索引及使用的存储引擎等详细信息,一目了然。