数据库SQL批量语句教程

[复制链接]
查看1174 | 回复1 | 2023-4-20 23:37:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
首先,这些批量语句可以省下大量的手动工作,是新手制作游戏内容的好帮手,有心自己制作属于自己游戏的新人们,一定要仔细的阅读完,会对你们有很大得帮助(用修改器改装备通常会出很多问题,所以直接用N8修改是最靠谱的)。
第二,批量语句一定要学会举一反三,那么我们就不用懂编程,不用懂代码,不用懂语言就可以完成很多很多工作。
第三,怎么应用批量语句?
在你的世界表(就是N8左边那竖排)右键,然后点命令列界面,就出现一页空白,在这里就可以输入语句了.好的那么正式开始,

一:从简单做起,导入或者修改物品

我们先来看两个个例子
INSERT INTO `world`.`creature_area` (`guid`, `zone`, `area`) VALUES ('6', '1', '1');
这个语句就是一个将物品导入的语句,注意这句前面的INSERT INTO就是‘导入’的意思
UPDATE `world`.`creature_area` SET `guid`='6', `zone`='1', `area`='1' WHERE (`guid`='6');
这个语句就是一个将物品导入的语句,注意这句前面的UPDATE就是‘修改’的意思

这两种语句是我们最最常用的语句,那么我们来一个一个的解释
导入语句:
INSERT INTO `world`.`creature_area` (`guid`, `zone`, `area`) VALUES ('6', '1', '1');
INSERT INTO `world`.`creature_area`代表,你要导入到哪里,这里就是指的WORLD库里的creature_area表
(`guid`, `zone`, `area`)代表这个表里面的每一列,通常会有很多咧,会依次用逗号隔开
VALUES就是指数值的意思,前面要导入的每一列都会填入一个数值
('6', '1', '1');就是前面每一列填入的数值,对应着(`guid`, `zone`, `area`)的排列顺序。

修改语句:
UPDATE `world`.`creature_area` SET `guid`='6', `zone`='1', `area`='1' WHERE (`guid`='6');
前面已经讲了,UPDATE `world`.`creature_area` 就是修改哪个库的哪个表
SET 字面翻译,就是设置为,和导入语句不同的这是,一定要记住
`guid`='6', `zone`='1', `area`='1' 非常好理解了吧,就是某列设置为某值
WHERE (`guid`='6');这个非常重要,这个是判定你要修改那一行,这句的意思就是当guid`='6'的时候,进行前面的修改。

那么我们来举一反三
我们要修改item_template表的socketColor_1列为1,应该这么写
UPDATE item_template set socketColor_1 = 1;
细心的朋友发现了,这样会把整个表的socketColor_1列都修改为1,但是我只想修改武器的socketColor_1列怎么办?这就要加入判定了,就是前面教的WHERE x='y'
这样,我们就得出一下这句
UPDATE item_template set socketColor_1 = 1 where class='2';
有些同学疑问了,为什么我这里UPDATE item_template之间没有选择什么库,那是应为我直接在WORLD库右键点命令列界面,在这里我就不用判定导入什么库了,就默认为你选择的库。

好的,这是最基本的语句,下面我们再深入一些。

二:多重判定.与值的计算
多重判定:
有的同学问了,我们要修改的物品,只有一个判定是不够的,比如我们要修改装备等级大于100小于200的装备怎么办?这里存在了2个判定,那么这第二部分的重点就来了。
例句:UPDATE item_template SET socketColor_1 = 1 where itemlevel>'100' and itemlevel<'200';

同学们看懂了吗?我们只需要在第一个判定后面加入一个and,这样我们就可以有无限多的判定了,再练习一个,我们不但要等级大于100小于200的装备,还要只能是武器。
UPDATE item_template SET socketColor_1 = 1 where itemlevel>'100' and itemlevel<'200'and class='2';

值的计算:
可爱的同学们又提出问题了,我们这手动输入一个一个输入值好慢,我们要让他自动生成值怎么办?
OK,这里来个例子,我们要修改装备等级大于300小于500的装备的stat_value1列为原始的2倍,
UPDATE item_template SET stat_value1 = stat_value1*2 where itemlevel>'300' and itemlevel<'500';
很简单吧?
有的同学又提出问题了,我们要更自动化!全部放大倍数太简单了!我们要更有变化!
好的~再看个例子,我们要修改装备等级大于300小于500的装备的stat_value1列来按照装备提高等于装备等级的数值。
UPDATE item_template SET stat_value1 = stat_value1+itemlevel where itemlevel>'300' and itemlevel<'500';

很多同学喜欢给自己的装备加个个性的前缀名字,那么这个公式大家可以借鉴
UPDATE item_template set name=concat('超级牛逼的 ',name) where itemlevel>'200';
concat('超级牛逼的 ',name)就是在原始的名字前面加上引号里的数值,同样适用于数字,至于后面的判定,前面讲过了。


那么,同学们觉得肯定还不够,要更复杂的,好的,我们来更复杂一点
我们只想让装备等级等于300的装备的stat_value1完全随机在400-2500之间怎么办?
update item_template set stat_value1 = round(rand() * 2100) + 400 where itemlevel='300';
这里新出现新的公式: round(rand() * 2100) + 400 ,至于原理,乱七八糟很复杂,恩。。。(就算我死记硬背的,我也不会说出来!)但是有个简单的方式来计算
round(rand() * X) +Y   X=你需要的数值上限减去下限 Y=数值下限

好的,这些大家一定要学会举一反三,你到这里学会了的话已经可以做做看,你会发现比你用修改器快很多多多啊。。。。

三:从别的表导入现在的表和一个批量增加掉率的公式
1、通过前面学习,大家应该学会了,很多同学想到了把一个表复制好几个,然后执行不同的批量命令来生成好几个等级的装备,那么我们怎么把他们合并在一起呢

比如我们要把item_template_2合并到item_template
那么就这样写:
insert into item_template select * from item_template_2;



2、如果我们制作了很多装备在item_template_2,然后怎么让怪物掉落这些装备呢?那么这样写
insert into creature_loot_template
select distinct creature_template.entry, item_template_2.entry,
0.001, 0, 1, 1, 0, 0, 0
from item_template_2, creature_template, creature_loot_template
where
creature_template.entry = creature_loot_template.entry
and creature_template.entry = XXXXX;
粗看很复杂,那么我们来解释一下
creature_template.entry = XXXXX就是制定那个怪掉落,XXXX是怪物的entry列数值
0.001, 0, 1, 1, 0, 0, 0对应的是你的creature_loot_template表里从第三列开始的数值,你可以自行设置。(通常是这样的结构,Chance打头的就是掉率,注意,groupid相同的掉率总合不能超100%)

那么我们再来实践下,比如我们复制出来的表item_template_14里面有很多很多装备,我只想要怪物10000掉落装备等级大于200小于300的装备,每件掉率是0.55
insert into creature_loot_template
select distinct creature_template.entry, item_template_14.entry,
0.55, 0, 1, 1, 0, 0, 0
from item_template_14, creature_template, creature_loot_template
where
creature_template.entry = creature_loot_template.entry
and creature_template.entry = 10000 and item_template_14.itemlevel>'200' and item_template_14.itemlevel<'300';





四:自动批量写入
我们好懒,对吧?我们要自动写入一堆就可以开开心心的玩游戏了对吧?那么,这又带来一个死记硬背的公式!

DELIMITER $$
DROP PROCEDURE IF EXISTS WhileLoopProc$$

CREATE PROCEDURE WhileLoopProc()
       BEGIN
               DECLARE x  INT;
               SET x = 1;
               WHILE x <= 1034 DO
                  INSERT INTO `item_enchantment_template` (`entry`, `ench`, `chance`, `type`) VALUES ('10002', (22001+x), 0.016, 1);
                              SET x = x + 1;
               END WHILE;
       END$$
DELIMITER ;

call WhileLoopProc();

乱不乱?别问我,我也不懂,但是该改什么我告诉你!

SET x = 1代表一个基数
WHILE x <= 1034 DO 代表你要导入多少条,公式是你的数值城乘以你要导入的条数然后减去每次增加的数值.
(22001+x) 代表值的最小值,比如你要导入值最小为80000,那么就写入(80000+x)
SET x = x + 1 代表你每个值增加多少,这里是每一行增加1,如果你要增加100,那么就写入SET x = x + 100
那么我们来个例子,比如我们要导入刚才那个表的ench列从3333开始每值加321!一共911条怎么写?
DELIMITER $$
DROP PROCEDURE IF EXISTS WhileLoopProc$$

CREATE PROCEDURE WhileLoopProc()
       BEGIN
               DECLARE x  INT;
               SET x = 0;
               WHILE x <= 292110 DO
                  INSERT INTO `item_enchantment_template` (`entry`, `ench`, `chance`, `type`) VALUES ('10005', (3333+x), 0.016, 1);
                              SET x = x + 321;
               END WHILE;
       END$$
DELIMITER ;

call WhileLoopProc();



总结:这些基本足够应付你制作自己喜欢的一切了,大家一定要学会举一反三,楼主我是对这些代码完全不懂,都是找的资料自己学习,用着用着,就会熟练了!祝大家游戏愉快!



追加 替换语句
UPDATE item_template set name=replace(name,'|cFF917F69','|cFFB88943');
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则