WHERE 子句用于从数据库表中筛选出满足特定条件的记录,当条件涉及文字时,我们需要掌握一些关键的语法和技巧。

核心要点:文字需要用单引号或双引号包围
在 SQL 中,文字字符串(也称为字面量或字符串字面量)必须用引号括起来,在大多数数据库(包括 Dedecms 使用的 MySQL)中,单引号 () 是标准且最常用的。
错误示例:
SELECT * FROM `dede_archives` WHERE title = 简单教程
这会导致 SQL 语法错误,因为数据库会尝试将 简单教程 识别为一个列名或变量。
正确示例:

SELECT * FROM `dede_archives` WHERE title = '简单教程'
这里的 '简单教程' 就是一个明确的字符串值。
常见的文字比较操作符
结合 WHERE 子句,我们可以使用多种操作符来处理文字。
精确匹配 ()
查找字段值与指定文字完全相同的记录。
示例: 查找标题为“织梦CMS入门”的所有文章。
SELECT * FROM `dede_archives` WHERE title = '织梦CMS入门';
模糊匹配 (LIKE)
这是最常用的模糊查询,通常与通配符一起使用。
- (百分号):代表任意数量的任意字符(包括零个字符)。
_(下划线):代表单个任意字符。
示例 1:查找标题中包含“教程”的文章
SELECT * FROM `dede_archives` WHERE title LIKE '%教程%';
%教程% 表示“教程”这两个字可以出现在标题的任何位置。
示例 2:查找以“Dede”开头的文章
SELECT * FROM `dede_archives` WHERE title LIKE 'Dede%';
示例 3:查找第二个字是“梦”的文章(如“织梦Dede”)
SELECT * FROM `dede_archives` WHERE title LIKE '_梦%';
_ 匹配一个任意字符,梦 匹配“梦”, 匹配“梦”之后的所有字符。
不匹配 (<> 或 )
查找字段值不等于指定文字的记录。
示例: 查找所有标题不是“公告”的文章。
SELECT * FROM `dede_archives` WHERE title <> '公告'; -- 或者使用 SELECT * FROM `dede_archives` WHERE title != '公告';
在一组值中 (IN)
查找字段值存在于指定列表中的记录,这比使用多个 OR 更简洁高效。
示例: 查找标题为“公告”、“活动”或“首页推荐”的文章。
SELECT * FROM `dede_archives` WHERE title IN ('公告', '活动', '首页推荐');
区间判断 (`BETWEEN ... AND ...)
虽然主要用于数字,但也可以用于文字,表示按字母或字典顺序在某个范围内。
示例: 查找标题首字母在 'a' 到 'm' 之间的文章。
SELECT * FROM `dede_archives` WHERE title BETWEEN 'a' AND 'm';
注意: 这种比较是区分大小写和字符集的,在中文环境下使用较少。
在 Dedecms 后台中的实际应用
在 Dedecms 后台,我们通常不会直接手写 SQL,而是通过系统提供的功能间接执行,了解上述 SQL 语法能帮助你更好地理解和使用这些功能。
场景1:使用“SQL命令行工具”
这是最直接执行自定义 SQL 的地方。
路径: 后台首页 -> 系统 -> SQL命令行工具
示例任务: 将所有标题包含“旧”的文章标题,更新为“[已归档]”+原标题。
- 进入
SQL命令行工具。 - 选择“运行SQL命令行”。
- 在文本框中输入以下代码:
UPDATE `dede_archives` SET title = CONCAT('[已归档]', title) WHERE title LIKE '%旧%'; - 点击“确定”执行。
代码解释:
UPDATE ... SET ...:更新语句。CONCAT('[已归档]', title):MySQL 字符串连接函数,将[已归档]和原标题拼接起来。WHERE title LIKE '%旧%':筛选条件,只处理标题包含“旧”的记录。
场景2:使用“文档关键词维护”
这个功能可以帮你批量替换文章内容或标题中的文字。
路径: 后台首页 -> -> 文档关键词维护
示例任务: 将所有文章内容中的“织梦CMS”替换为“DedeCMS”。
- 进入“文档关键词维护”。
- 点击“增加新关键词”。
-
织梦CMS - 替换为:
DedeCMS - 替换范围: 选择你想要替换的范围,文章内容”或“文章标题”。
- 点击“确定”保存,系统会自动执行替换操作,其底层就是一条
UPDATESQL 语句。
重要注意事项
-
大小写敏感性
- 在 MySQL 中,
LIKE默认是大小写不敏感的(取决于数据库的collation排序规则,通常是utf8_general_ci,ci代表 case-insensitive)。 - 如果你需要进行大小写敏感的查询,可以使用
BINARY关键字。-- 查找 title 为 'Dede'(D大写)的记录,不匹配 'dede' SELECT * FROM `dede_archives` WHERE title = BINARY 'Dede';
- 在 MySQL 中,
-
SQL注入风险
- 当 SQL 语句中的文字内容来自用户输入(如搜索框、表单)时,存在极高的 SQL 注入风险。
- 绝对不要直接拼接用户输入到 SQL 语句中。
- 安全做法: 使用 Dedecms 提供的函数或参数化查询来处理,在二次开发中,使用
$dsql->SetQuery()和$dsql->Execute()时,DedeCMS 的底层会进行一定的安全处理。 - 示例(危险):
$keyword = $_GET['keyword']; $sql = "SELECT * FROM dede_archives WHERE title = '$keyword'"; // 危险!
- 示例(相对安全,使用DedeCMS方法):
$keyword = $dsql->GetOne("SELECT title FROM dede_archives WHERE id=1"); // 假设从安全的地方获取 // 或者使用其过滤函数 $keyword = FilterSearch($keyword); // 假设存在这样的过滤函数 $sql = "SELECT * FROM dede_archives WHERE title LIKE '%{$keyword}%'";
-
特殊字符处理
-
如果文字中本身就包含了单引号 (),会导致 SQL 语句提前结束,产生语法错误。
-
解决方案: 将单引号进行转义,即在单引号前再加一个单引号 ()。
-
示例: 查找标题为
Tom's book的文章。-- 错误写法 -- SELECT * FROM dede_archives WHERE title = 'Tom's book'; -- 正确写法 (转义) SELECT * FROM `dede_archives` WHERE title = 'Tom''s book';
-
在 PHP 代码中,最好使用
mysqli_real_escape_string()或addslashes()函数来自动处理。
-
| 需求 | SQL 操作符 | 示例 |
|---|---|---|
| 精确查找 | WHERE title = '公告' |
|
| 包含文字 | LIKE '%...%' |
WHERE title LIKE '%教程%' |
| 以...开头 | LIKE '...%' |
WHERE title LIKE '织梦%' |
| 以...结尾 | LIKE '%...' |
WHERE title LIKE '%教程' |
| 排除某文字 | <> 或 |
WHERE title <> '公告' |
| 匹配多个值 | IN (...) |
WHERE title IN ('公告', '活动') |
| 批量更新 | UPDATE ... SET ... WHERE |
UPDATE ... SET title = CONCAT('[新]',title) WHERE ... |
掌握这些基本用法,你就可以在 Dedecms 中灵活地进行各种基于文字的数据查询和修改了。
