gpt4 book ai didi

mysql - 刚刚学习了一段MySQL语法的艰辛方法-为什么这样做有效,这意味着做什么?

转载 作者:行者123 更新时间:2023-12-04 13:36:01 24 4
gpt4 key购买 nike

我正在使用MySQL 5.6。我公司的内部应用程序可以使用SET SQL_SAFE_UPDATES = 0;(我知道)。我以前提过这个,但是被告知要顺其自然。

今天,我不小心写了这个DELETE FROM table WHERE id - 11235,用-代替=,然后lo看到所有已删除的行。我知道在关闭安全更新的情况下删除所有行是允许的,但是为什么不抛出一些语法错误呢? id - 11235在SQL中甚至意味着什么?

最佳答案

这在MySQL中有效,因为MySQL对于SQL bool 表达式而言是非标准的。

bool 表达式的计算结果必须为truefalse。但是在MySQL中,false只是整数0,true是整数1,除0以外的任何其他整数也被视为true。

因此,这很奇怪,并且不符合ANSI SQL,但是任何算术表达式也可以用作 bool 表达式,反之亦然。

这使我们可以执行以下巧妙的技巧:

SELECT SUM( name = 'Harry' ) FROM mytable

bool 表达式的结果是整数值(0或1),具体取决于字符串比较。有效地对这些值进行求和将返回表达式为true的行的计数,就像我们运行过的行一样:
SELECT COUNT(*) FROM mytable WHERE name = 'Harry'

但是SUM技巧使我们可以通过一次遍历表来“计数”多个条件:
SELECT SUM(name = 'Harry'), SUM(name = 'Ron'), SUM(name = 'Hermione') FROM mytable

您不能使用COUNT(*)和WHERE子句来做到这一点。

同样,这仅在MySQL中有效,因为MySQL使 bool 值和整数相同。它在SQL的其他实现中不起作用。

在您的查询中,在id = 11235的行上 id - 11235为0,而在其他所有行上,其均为非零。非零的行将被视为true,因此将应用删除。

至少在您的情况下,这是不幸的,因为输入错误会导致删除所有数据。

关于mysql - 刚刚学习了一段MySQL语法的艰辛方法-为什么这样做有效,这意味着做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59583848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com