Skip to content

like 查询 ​

LIKE 查询是 SQL 中用于执行模糊匹配的重要操作符,常用于在 WHERE 子句中查找符合特定模式的记录。以下是关于如何进行 LIKE 查询的详细介绍,包括其基本用法、常见场景以及在 Java 中的实现示例。

1. 基本语法 ​

sql
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;
  • column_name:要进行匹配的列。
  • pattern:用于匹配的模式,可以包含通配符。

2. 通配符 ​

LIKE 查询中常用的通配符有:

  • %:匹配零个或多个任意字符。

    • 例如,'A%' 可以匹配以字母 A 开头的任何字符串,如 Apple、Azure。
  • _:匹配单个任意字符。

    • 例如,'A_' 可以匹配 Al、An 等两个字符的字符串,以 A 开头。
  • []:匹配括号内的任意一个字符(某些数据库支持)。

    • 例如,'[AB]%' 可以匹配以 A 或 B 开头的字符串。
  • [^] 或 !:匹配不在括号内的任意字符(某些数据库支持)。

    • 例如,'[^A]%' 可以匹配不以 A 开头的字符串。

3. 示例解析 ​

SQL 查询示例 ​

sql
--# bot_channel.like_channel_name
SELECT
  channel_name,
  channel_url,
  channel_count,
  channel_type,
  rank_num
FROM
  bot_channel
WHERE
  channel_name LIKE ?
  • channel_name LIKE ?:使用参数化查询,通过 ? 占位符传入匹配模式。

Java 实现示例 ​

java
import java.util.List;

import org.junit.Test;

import nexus.io.db.activerecord.Db;
import nexus.io.db.activerecord.Row;
import nexus.io.telegram.bot.config.AdminAppConfig;
import nexus.io.template.SqlTemplates;
import nexus.io.tio.boot.testing.TioBootTest;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class BotChannelServiceTest {
  @Test
  public void test() {
    TioBootTest.runWith(AdminAppConfig.class);
    String sql = SqlTemplates.get("bot_channel.like_channel_name");
    List<Row> rows = Db.find(sql, "%开发%");
    log.info("row size:{}", rows.size());
  }
}
  • SqlTemplates.get("bot_channel.like_channel_name"):获取预定义的 SQL 模板。
  • Db.find(sql, "%开发%"):执行 SQL 查询,"%开发%" 作为参数传递给 LIKE 条件中的 ?。
    • "%开发%":匹配包含“开发”字样的 channel_name。

4. 注意事项 ​

4.1 性能考虑 ​

  • 索引失效:使用前导 %(如 '%开发%')会导致数据库无法使用索引,从而进行全表扫描,影响查询性能。尽量避免在大量数据中使用前导 %,或考虑使用全文索引(如 MySQL 的全文搜索)。
  • 优化建议:
    • 尽量减少使用前导 %,如 '开发%' 可以使用索引。
    • 使用全文搜索引擎(如 Elasticsearch)处理复杂的模糊查询需求。

4.2 大小写敏感性 ​

  • 数据库差异:不同数据库对 LIKE 查询的大小写敏感性不同。例如,MySQL 的 utf8_general_ci 字符集下,LIKE 不区分大小写,而 PostgreSQL 则区分。
  • 解决方法:
    • 使用函数统一大小写,如 LOWER(channel_name) LIKE LOWER(?)。
    • 根据数据库特性调整查询逻辑。

4.3 转义特殊字符 ​

  • 特殊字符:如果搜索模式中包含 % 或 _,需要进行转义,以避免被误解为通配符。
  • 转义方式:
    • 使用 ESCAPE 子句指定转义字符,例如:
      sql
      WHERE channel_name LIKE '%\%%' ESCAPE '\'
    • 在 Java 代码中对用户输入进行预处理,转义特殊字符。

5. 高级用法 ​

5.1 多条件匹配 ​

可以结合多个 LIKE 条件使用 OR 或 AND 进行更复杂的匹配。

sql
WHERE (channel_name LIKE '%开发%' OR channel_name LIKE '%测试%')

5.2 与其他条件组合 ​

LIKE 可以与其他条件组合使用,以实现更精确的查询。

sql
WHERE channel_type = '技术' AND channel_name LIKE '开发%'

5.3 动态构建查询 ​

在实际应用中,常根据用户输入动态构建 LIKE 查询。例如,在 Java 中,可以根据不同的搜索条件拼接 SQL。

java
String baseSql = "SELECT * FROM bot_channel WHERE 1==1";
if (searchName != null && !searchName.isEmpty()) {
    baseSql += " and channel_name LIKE ?";
    params.add("%" + searchName + "%");
}
List<Row> rows = Db.find(baseSql, params.toArray());

6. 总结 ​

LIKE 查询在 SQL 中提供了强大的模糊匹配能力,适用于多种搜索场景。通过合理使用通配符和结合其他查询条件,可以实现灵活且高效的数据检索。在实际应用中,需注意性能优化和安全性,尤其是在处理用户输入时,务必使用参数化查询以防止 SQL 注入攻击。

希望以上介绍能够帮助您更好地理解和使用 LIKE 查询。如有进一步的问题,欢迎继续交流!