sql如何写循环语句

SQL 中没有传统的循环。
递归 CTE 可以做到这一点。

粗略地说,CTE 会自行连接。
先给我一个起点,然后根据情况往前走。

上周我刚刚看了一个使用 CTE 生成 1 到 1 0 数字的案例。
这是一个例子。

WITHRECURSIVEnumbersAS(SELECT1 ASiterationUNIONALLSELECTiteration+1 FROMnumbersWHEREiteration<1>就这么简单。

日期的顺序是相似的。
从 01 /01 /2 02 3 到 1 0 的那个。

WITHRECURSIVEdate_rangeAS(SELECT'DATE(&3 9 ;2 02 3 -01 -01 &3 9 ;)'ASdateUNIONALLSELECTdate+INTERVAL1 DAYFROMdate_rangeWHEREDate<'2 02 3 -01 -1 0')SELECTdateFROMdate_range;
你看。
只要推动自己。

但是要小心。
终止条件必须是硬编码的。
不然真的会跑掉。

此处仅支持 My SQL 8 .0+。
旧版本将无法工作。

生产力也很重要。
大量数据速度很慢。
尽量不要这样做。

替代方案?在临时表或程序中运行。
美好的。

你自己看看。
如何选择。

mysql 中的insert into 语句怎么进行循环插入信息

哎呀,这段代码好像是C++和数据库操作的混合体,有点复杂。
先说一下我看到这个符号时的感受。
老实说,一开始我并不明白这段代码的用途。
我们得一点一点地分析。

首先,这段代码定义了几个变量:一个char类型的名字数组、整型的time、gender、id、age。
名称数组的大小为1 0,可用于存储名称。
time、gender、id、age分别为时间、性别、id、年龄。

然后是一个从1 到4 0的for循环。
在这个循环中,程序会要求用户输入时间、姓名、性别、身份证号和年龄。
这里使用 Cin 来获取用户输入。

接下来,我看到了sprintf函数,它用于将格式化数据写入szSqlText字符串。
在这里,它将时间、姓名、性别、ID 和年龄的值格式化为 SQL 语句,该语句看起来像是插入到数据库表中。

看下面,有一个if语句来检查执行mysql_query函数的结果。
该函数执行 SQL 语句。
如果发生错误,将返回错误消息。
然后程序将打印消息“数据无法插入表中”并关闭数据库连接,返回错误。
如果插入成功,将打印“Insert OK”。

但是这里有一个问题,就是sprintf中的SQL语句是静态的,与用户输入的数据无关。
所以这段代码的逻辑有问题。
它必须使用用户输入的数据来创建 SQL 语句。

例如,用户输入时间为2 02 3 年1 月1 日,姓名为“张三”,性别为1 (男),身份证号为1 2 3 4 5 6 7 8 9 01 2 3 4 5 6 7 8 ,年龄为3 0,则SQL语句应如下:
cpp sprintf(szSqlText, "INSERT INTO mytable (时间, 姓名, 性别, ID, 年龄) 值 (%d, '%s', %d, %ld, %d)", 时间, 姓名, 性别, ID, 年龄);
这里注意,我用%d表示整型变量,%s表示字符串,%ld表示长整型。
然后我们用用户输入的数据替换原来的固定值。

至于这段代码是否有问题,老实说我也不确定。
由于涉及到数据库操作,如果SQL注入问题处理不当,可能会带来安全风险。
因此,正式使用前最好进行全面的测试和检查。

MySQL 中为用户分配行的无限赋值方法

上周一位客户问我 MySQL 如何将员工分配给候选人。
我向他解释说,没有那么多复杂的方法。
主要是根据员工数量来确定计划。

如果员工数量较少,只需使用SQL来管理即可。
例如,去年我在上海的一个购物中心项目中使用 MySQL 5 .7 时,只有 5 名候选人和 2 名员工(John 和 Buce)。
操作非常简单: SQL 更新候选人 加入( 选择 1 AS id,“John”AS 名称 联合选择 2 ,“布鲁斯” ) 员工 ON MOD(候选人.id, 2 ) + 1 = 员工.id SET Candidates.staff = Staff.name, Candidates.date_signup = CURDATE();
你看这个MOD(candidates.id, 2 ) + 1 ,候选人ID除以2 加1 的余数,可以按照自然循环进行分配。
员工总数为 2 运行此 SQL 后,候选人和员工将进行一对一匹配,并且 date_signup 也将填充为今天的日期。

如果我使用MySQL 8 .0,我更喜欢使用CTE来编写: SQL 与个人(ID,姓名)AS( 选择 1 ,“约翰” 联合选择 2 ,“布鲁斯” ) 更新人员 JOIN 候选人 c ON MOD(c.id, 2 ) + 1 = Staff.id SET c.staff = Staff.name, c.date_signup = CURDATE();
我觉得这种写法比较直观。
首先将staff设置为临时表,然后更新它。
代码看起来很清爽。

但是如果你说员工很多或者员工变动频繁,那么用SQL来更新就很愚蠢了。
我曾经在深圳搭建过一个招聘系统,有几百名员工,每次分配都可以动态调整,所以需要PHP来实现: php $staffs = array("约翰", "马克", "腹部", "里克", "汤姆", "哈利"); $query = "更新候选人 SET Staff=?, date_signup=CURDATE() WHERE MOD(id,?)=?"; $stmt = $pdo->准备($query); foreach ($staffs as $i => $name) { $staff_count = 计数($staffs); $stmt->execute([$name, $staff_count, $i]);
就这么简单。
将员工姓名保存在表中,然后迭代该表并为每个员工运行 UPDATE。
MOD(id,?) 计算剩下的部分,原理与SQL中相同,但用PHP编写更灵活。
如果员工名单发生变化,直接编辑表格即可。

我遇到的陷阱是我一开始没有创建单独的员工表。
每个分配都直接在候选人表中进行。
结果一旦调整了范围,SQL就得完全重写。
后来吸取教训,创建了一个人员表来存储员工信息,然后通过JOIN更新: SQL 更新候选人 JOIN 员工 ON MOD (candidates.id, Staff.id) + 1 = Staff.id SET Candidates.staff = Staff.name, Candidates.date_signup = CURDATE();
你看,它灵活多了。
员工信息单独保存,分配逻辑写在JOIN中。
以后员工的添加、删除、修改等操作将不再需要使用UPDATE语句。
查询性能也不错。
数据库本身优化JOIN的速度比硬件数据处理快得多。

反正你看,就是这些方法,关键看你的情况。
如果您的员工人数较少,请使用 SQL,如果您的员工人数较多,请使用 PHP。
如果要长期使用,需要创建员工表并单独管理。