帝国CMS SQL查询语句教程

什么是SQL?为什么要在帝国CMS中使用它?

SQL (Structured Query Language),即结构化查询语言,是用于管理关系型数据库(如MySQL)的标准语言。

帝国cms sql查询语句教程
(图片来源网络,侵删)

在帝国CMS中,我们使用SQL主要有以下几个目的:

  1. 批量处理数据:当后台操作效率低下时(如修改上千篇文章的栏目、删除过期数据),SQL是最高效的工具。
  2. 数据统计与分析:快速统计某个栏目下的文章数、某个关键词的搜索次数等。
  3. 数据修复与迁移:修复因操作失误导致的数据不一致问题,或者将数据从一个系统迁移到另一个。
  4. 自定义调用:通过[ecmsinfo]等标签结合SQL,实现更灵活、更复杂的内容调用。

准备工作:在哪里执行SQL语句?

在帝国CMS中,执行SQL语句主要通过后台的“数据库备份与恢复”功能。

  1. 登录您的帝国CMS后台。
  2. 在顶部菜单栏,找到并点击“系统” -> “数据备份与恢复”。
  3. 在打开的页面中,选择“执行SQL语句”选项卡。

您将看到一个文本框,在这里可以输入您的SQL语句。

⚠️ 重要安全提示:

帝国cms sql查询语句教程
(图片来源网络,侵删)
  • 操作前务必备份! 在执行任何修改、删除类SQL语句前,请务必备份数据库,这是防止数据丢失的最后一道防线。
  • 从简单到复杂:不确定语句效果时,先用SELECT查询,确认无误后再执行UPDATEDELETE
  • 小心DELETEUPDATE:在没有WHERE子句的情况下,DELETE FROM table_name;会清空整个表!UPDATE不加WHERE会更新全表数据!

SQL核心语法详解

我们将围绕最常用的四个DML(数据操作语言)语句展开:SELECTINSERTUPDATEDELETE

SELECT - 查询数据 (最常用)

用于从数据库表中检索数据,是所有操作的基础。

基本语法:

SELECT column_name1, column_name2, ...
FROM table_name
WHERE condition
ORDER BY column_name
LIMIT offset, count;

帝国CMS常用表结构速查:

帝国cms sql查询语句教程
(图片来源网络,侵删)
表名 用途 关键字段
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的所有产品。

  1. 假设产品附加表是 phome_ecms_product_data_6
  2. 在需要调用的模板页面(如首页、栏目页)中,加入以下代码:
<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');

**五、 总结与最佳实践

  1. 备份、备份、再备份:这是铁律。
  2. 先查后改:执行UPDATEDELETE前,先用SELECT语句加上WHERE条件,确保查询到的结果正是你想要操作的目标。
  3. 注释你的SQL:在复杂的SQL语句前加上注释,-- 这是注释内容,方便日后回顾。
  4. 逐步执行:对于特别长的脚本,可以分段执行,每执行一段就检查结果。
  5. 理解表结构:花点时间了解帝国CMS核心表的结构,特别是主表和附加表的关系,这是高效使用SQL的关键。

希望这份教程能帮助您在帝国CMS的管理和开发中更加得心应手!祝您使用愉快!