帝国CMS SQL查询语句教程
什么是SQL?为什么要在帝国CMS中使用它?
SQL (Structured Query Language),即结构化查询语言,是用于管理关系型数据库(如MySQL)的标准语言。

(图片来源网络,侵删)
在帝国CMS中,我们使用SQL主要有以下几个目的:
- 批量处理数据:当后台操作效率低下时(如修改上千篇文章的栏目、删除过期数据),SQL是最高效的工具。
- 数据统计与分析:快速统计某个栏目下的文章数、某个关键词的搜索次数等。
- 数据修复与迁移:修复因操作失误导致的数据不一致问题,或者将数据从一个系统迁移到另一个。
- 自定义调用:通过
[ecmsinfo]等标签结合SQL,实现更灵活、更复杂的内容调用。
准备工作:在哪里执行SQL语句?
在帝国CMS中,执行SQL语句主要通过后台的“数据库备份与恢复”功能。
- 登录您的帝国CMS后台。
- 在顶部菜单栏,找到并点击“系统” -> “数据备份与恢复”。
- 在打开的页面中,选择“执行SQL语句”选项卡。
您将看到一个文本框,在这里可以输入您的SQL语句。
⚠️ 重要安全提示:

(图片来源网络,侵删)
- 操作前务必备份! 在执行任何修改、删除类SQL语句前,请务必备份数据库,这是防止数据丢失的最后一道防线。
- 从简单到复杂:不确定语句效果时,先用
SELECT查询,确认无误后再执行UPDATE或DELETE。 - 小心
DELETE和UPDATE:在没有WHERE子句的情况下,DELETE FROM table_name;会清空整个表!UPDATE不加WHERE会更新全表数据!
SQL核心语法详解
我们将围绕最常用的四个DML(数据操作语言)语句展开:SELECT、INSERT、UPDATE、DELETE。
SELECT - 查询数据 (最常用)
用于从数据库表中检索数据,是所有操作的基础。
基本语法:
SELECT column_name1, column_name2, ... FROM table_name WHERE condition ORDER BY column_name LIMIT offset, count;
帝国CMS常用表结构速查:

(图片来源网络,侵删)
| 表名 | 用途 | 关键字段 |
|---|---|---|
phome_ecms_news |
新闻数据表 | id, classid, newstime, title, smalltext, titlepic |
phome_ecms_news_data_x |
新闻附加表 (x为栏目ID) | id, classid, newstime, infotags, newstext |
phome_enewsclass |
栏目表 | classid, classname, bclassid, classpath |
phome_enewsuser |
用户表 | userid, username, userfen |
phome_ecms_ad |
广告表 | adid, adname, adclass |
示例:
示例1:查询新闻ID为10的文章标题和发布时间
SELECT title, newstime FROM phome_ecms_news WHERE id = 10;
示例2:查询“帝国CMS教程”栏目下的所有文章ID和标题
-- 假设“帝国CMS教程”的栏目ID是 5 SELECT id, title FROM phome_ecms_news WHERE classid = 5;
示例3:查询标题中包含“帝国”关键词的所有文章
SELECT id, title FROM phome_ecms_news WHERE title LIKE '%帝国%';
LIKE用于模糊匹配。- 是通配符,代表任意数量的任意字符。
'%帝国%'表示“帝国”前后可以有任意内容。
示例4:查询点击量最高的10篇文章
-- 假设点击量字段是 onclick SELECT id, title, onclick FROM phome_ecms_news ORDER BY onclick DESC LIMIT 10;
ORDER BY onclick DESC表示按onclick字段降序排列(从高到低)。LIMIT 10表示只返回前10条结果。
示例5:查询附加表中的文章内容通常存放在附加表中,主表和附加表通过 id 关联。
-- 假设栏目ID为 5 的附加表是 phome_ecms_news_data_5 SELECT n.id, n.title, d.newstext FROM phome_ecms_news n JOIN phome_ecms_news_data_5 d ON n.id = d.id WHERE n.classid = 5;
JOIN ... ON ...用于将两个表连接起来,ON指定连接条件(这里是id相等)。
UPDATE - 更新数据
用于修改表中已存在的数据。
基本语法:
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
示例:
示例1:将ID为100的文章的标题修改为“新标题”
UPDATE phome_ecms_news SET title = '新标题' WHERE id = 100;
示例2:将“帝国CMS教程”栏目(classid=5)下所有文章的作者修改为“管理员”
UPDATE phome_ecms_news SET writer = '管理员' WHERE classid = 5;
示例3:批量替换标题中的关键词
UPDATE phome_ecms_news SET title = REPLACE(title, '帝国CMS', '帝国CMS 7.5');
REPLACE(old_string, new_string)是一个非常有用的字符串替换函数。
INSERT INTO - 插入数据
用于向表中插入新的行。
基本语法:
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
示例:
示例1:向新闻表中插入一条新文章
INSERT INTO phome_ecms_news (classid, userid, username, newstime, title, smalltext, titlepic, checked, istop) VALUES (5, 1, 'admin', NOW(), '测试文章', '这是一篇测试文章的简介', '', 0, 0);
NOW()是MySQL函数,用于获取当前时间。checked为0表示未审核,为1表示已审核。istop为0表示不置顶,为1表示置顶。- 注意:插入到主表的数据,如果需要内容,也必须同时插入到对应的附加表中。
DELETE - 删除数据
用于删除表中的行。
基本语法:
DELETE FROM table_name WHERE condition;
示例:
示例1:删除ID为200的文章
DELETE FROM phome_ecms_news WHERE id = 200;
- 重要:这只会删除主表中的记录,如果附加表中有对应数据,它们会变成“孤儿数据”,最好同时删除附加表中的记录。
- 安全做法:
-- 删除主表记录 DELETE FROM phome_ecms_news WHERE id = 200; -- 删除附加表记录 (假设栏目ID是5) DELETE FROM phome_ecms_news_data_5 WHERE id = 200;
示例2:删除某个栏目下的所有文章
-- 假设栏目ID是 5 DELETE FROM phome_ecms_news WHERE classid = 5; DELETE FROM phome_ecms_news_data_5 WHERE classid = 5;
高级技巧与实战
页模板中使用SQL (结合[ecmsinfo])
帝国CMS的[ecmsinfo]标签支持sql属性,可以直接执行SQL查询并返回结果。
语法:
[e:loop={"SELECT 字段 FROM 表名 WHERE 条件 ORDER BY 排序 条数",0,24,0}]
<a href="[!--news.url--]e/public/onclick/?classid=[!--classid--]&id=[!--id--]&enews=doadd">[!--title--]</a>
[/e:loop]
{"SELECT ...",0,24,0}:SELECT ...: 你的SQL查询语句。0: 显示条数,0表示不限制(但受限于系统设置)。24: 模板ID,这里用0表示使用循环内的默认样式。0: 0为使用程序设定的SQL查询,1为使用自定义SQL查询(此处通常为0)。
实战:调用“产品”栏目(classid=6)下价格(price字段在附加表)大于1000的所有产品。
- 假设产品附加表是
phome_ecms_product_data_6。 - 在需要调用的模板页面(如首页、栏目页)中,加入以下代码:
<h2>高价产品列表</h2>
<ul>
[e:loop={"SELECT a.id, a.title, b.price
FROM phome_ecms_product a
JOIN phome_ecms_product_data_6 b ON a.id = b.id
WHERE a.classid = 6 AND b.price > 1000
ORDER BY b.price DESC", 10, 24, 0}]
<li>
<a href="[!--news.url--]<?=$bqsr['titleurl']?>" target="_blank">
[!--title--] - 价格: <?=$bqr['price']?>元
</a>
</li>
[/e:loop]
</ul>
<?=$bqr['field']?>用于在循环中输出SQL查询返回的字段值。<?=$bqsr['titleurl']?>用于生成文章链接。
常用函数
COUNT(): 计数。-- 统计“帝国CMS教程”栏目下的文章数 SELECT COUNT(*) as total FROM phome_ecms_news WHERE classid = 5;
SUM(): 求和。-- 统计所有产品的总价 SELECT SUM(price) as total_price FROM phome_ecms_product_data_6;
MAX()/MIN(): 求最大/最小值。-- 找出点击量最高的文章的点击量 SELECT MAX(onclick) as max_clicks FROM phome_ecms_news;
DATE_FORMAT(): 日期格式化。-- 查询今天发布的文章 SELECT id, title FROM phome_ecms_news WHERE DATE_FORMAT(newstime, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d');
**五、 总结与最佳实践
- 备份、备份、再备份:这是铁律。
- 先查后改:执行
UPDATE或DELETE前,先用SELECT语句加上WHERE条件,确保查询到的结果正是你想要操作的目标。 - 注释你的SQL:在复杂的SQL语句前加上注释,
-- 这是注释内容,方便日后回顾。 - 逐步执行:对于特别长的脚本,可以分段执行,每执行一段就检查结果。
- 理解表结构:花点时间了解帝国CMS核心表的结构,特别是主表和附加表的关系,这是高效使用SQL的关键。
希望这份教程能帮助您在帝国CMS的管理和开发中更加得心应手!祝您使用愉快!
