MySQL作为常用的关系型数据库,数据检索、查询和全文本搜索是日常操作的核心内容,不同的操作对应不同的使用场景,掌握这些能力能大幅提升数据处理效率。

一、基础数据检索
最基础的数据检索使用SELECT语句,用于从表中获取指定列或全部列的数据。基础语法如下:
-- 检索表中所有列 SELECT * FROM 表名; -- 检索指定列,多列用逗号分隔 SELECT 列名1, 列名2 FROM 表名; -- 检索并去重,使用DISTINCT关键字 SELECT DISTINCT 列名 FROM 表名;
需要注意DISTINCT关键字会作用于所有选中的列,只要其中一列的值不同,该行就会被保留。
二、常用查询操作
实际业务中很少需要检索全表数据,通常会结合条件、排序、分组等操作筛选需要的数据。
1. 条件查询
使用WHERE子句设置过滤条件,支持多种运算符:
- 比较运算符:=、!=、<、>、<=、>=
- 逻辑运算符:AND、OR、NOT
- 范围查询:BETWEEN...AND...、IN (值列表)
- 空值判断:IS NULL、IS NOT NULL
示例代码如下:
-- 查询年龄大于18且小于30的用户
SELECT 用户名, 年龄 FROM 用户表 WHERE 年龄 > 18 AND 年龄 < 30;
-- 查询地址是北京或上海的用户
SELECT 用户名, 地址 FROM 用户表 WHERE 地址 IN ('北京', '上海');
-- 查询邮箱不为空的用户
SELECT 用户名, 邮箱 FROM 用户表 WHERE 邮箱 IS NOT NULL;
2. 排序与分页
使用ORDER BY对结果排序,LIMIT实现分页:
-- 按年龄降序排序,年龄相同按注册时间升序排序 SELECT 用户名, 年龄, 注册时间 FROM 用户表 ORDER BY 年龄 DESC, 注册时间 ASC; -- 分页查询,每页10条,查询第2页数据(偏移量为10) SELECT 用户名, 年龄 FROM 用户表 LIMIT 10 OFFSET 10; -- 等价于 SELECT 用户名, 年龄 FROM 用户表 LIMIT 10, 10;
3. 分组查询
使用GROUP BY对数据进行分组,结合聚合函数统计每组数据,HAVING用于过滤分组后的结果:
-- 统计每个城市的用户数量,只保留用户数大于100的城市 SELECT 城市, COUNT(*) AS 用户数 FROM 用户表 GROUP BY 城市 HAVING 用户数 > 100;
三、全文本搜索
当需要在大量文本中搜索包含特定关键词的内容时,使用LIKE进行模糊查询效率很低,此时适合使用全文本搜索。
1. 创建全文本索引
全文本搜索需要依赖FULLTEXT索引,创建表时或后续添加都可以:
-- 创建表时添加全文本索引
CREATE TABLE 文章表 (
文章ID INT PRIMARY KEY AUTO_INCREMENT,
标题 VARCHAR(200),
内容 TEXT,
FULLTEXT (标题, 内容)
) ENGINE=InnoDB;
-- 已存在的表添加全文本索引
ALTER TABLE 文章表 ADD FULLTEXT 索引名 (标题, 内容);
注意只有MyISAM和InnoDB引擎支持全文本索引,InnoDB从MySQL 5.6版本开始支持。
2. 使用全文本搜索
使用Match()和Against()函数执行全文本搜索,Match指定要搜索的列,Against指定搜索关键词:
-- 搜索标题或内容中包含MySQL关键词的文章
SELECT 标题, 内容 FROM 文章表 WHERE Match(标题, 内容) Against('MySQL');
-- 带查询扩展的搜索,会搜索和结果相关的其他内容
SELECT 标题, 内容 FROM 文章表 WHERE Match(标题, 内容) Against('MySQL' WITH QUERY EXPANSION);
-- 布尔模式搜索,支持更灵活的规则,比如必须包含某个词,排除某个词
SELECT 标题, 内容 FROM 文章表 WHERE Match(标题, 内容) Against('+MySQL -Oracle' IN BOOLEAN MODE);
3. 全文本搜索和LIKE的差异
| 对比项 | LIKE模糊查询 | 全文本搜索 |
|---|---|---|
| 适用场景 | 少量数据、简单模糊匹配 | 大量文本数据、关键词搜索 |
| 效率 | 数据量大时性能差,全表扫描 | 依赖索引,性能更高 |
| 搜索能力 | 只支持简单的通配符匹配 | 支持关键词权重、查询扩展、布尔模式等高级功能 |
四、注意事项
全文本搜索有最小搜索长度限制,默认MyISAM是4个字符,InnoDB是3个字符,小于该长度的关键词不会被搜索到。如果需要调整,可以修改ft_min_word_len(MyISAM)或innodb_ft_min_token_size(InnoDB)参数。另外全文本搜索会忽略常见的停用词,比如"的"、"是"等,这些词不会被纳入索引。
在实际开发中,需要根据数据量和查询需求选择合适的查询方式,小表简单条件用基础查询即可,大量文本搜索优先使用全文本搜索,避免盲目使用LIKE导致性能问题。