如何在MySQL中测试IF语句?

如何在MySQL中测试IF语句?,mysql,sql,if-statement,Mysql,Sql,If Statement,如何在MySQL中测试IF语句 我需要知道,当查询进入IF语句时,如果它什么也不返回(选择了0行),会发生什么 换句话说,SELECT查询在选择no行时返回什么?它是否返回NULL?如果是,那么这是否会引发错误如果为空,则…?或者在这种情况下,如果不执行,则只执行该的语句 实际上,我有这样一个代码: IF ( SELECT banned FROM users WHERE id=new.user_id ) THEN // do stuff 注意:禁止列包含0或1 我想知道的是,当查询不返回任

如何在MySQL中测试IF语句

我需要知道,当查询进入
IF
语句时,如果它什么也不返回(选择了0行),会发生什么

换句话说,
SELECT
查询在选择no行时返回什么?它是否返回
NULL
?如果是,那么这是否会引发错误<代码>如果为空,则…?或者在这种情况下,如果不执行,则只执行该
的语句


实际上,我有这样一个代码:

IF ( SELECT banned FROM users WHERE id=new.user_id ) THEN 
// do stuff
注意:
禁止
列包含
0
1

我想知道的是,当查询不返回任何行时,我的代码是否安全?我的意思是,它会抛出一个错误还是什么都不会发生(如果
语句没有执行,就只会发生


注意到我想自己测试它,但我不知道如何在MySQL中测试
IF
语句。例如,我想通过以下代码对其进行测试:

BEGIN
    IF ( SELECT banned FROM users WHERE id=new.user_id ) THEN 
       SELECT 'test';
    ENDIF;
END

但上面的代码甚至没有运行。这就是我问这个问题的原因。

如果可以在MySQL存储程序(过程、函数或触发器)的上下文中测试
IF
语句,MySQL不支持匿名块

要测试
IF
语句,可以创建一个过程

DELIMITER $$

CREATE PROCEDURE foo
BEGIN
  IF ( some_condition ) THEN
     SELECT 'evaluation of some_condition returned TRUE' AS msg;
  ELSE
     SELECT 'evaluation of some_condition did NOT return TRUE' AS msg;
  END IF;
END$$    

DELIMITER ;

CALL foo;

可以在MySQL存储程序(过程、函数或触发器)的上下文中测试
IF
语句。MySQL不支持匿名块

要测试
IF
语句,可以创建一个过程

DELIMITER $$

CREATE PROCEDURE foo
BEGIN
  IF ( some_condition ) THEN
     SELECT 'evaluation of some_condition returned TRUE' AS msg;
  ELSE
     SELECT 'evaluation of some_condition did NOT return TRUE' AS msg;
  END IF;
END$$    

DELIMITER ;

CALL foo;
我需要知道,当一个查询进入IF语句时,它什么也不返回(选择了0行),会发生什么

实际上,这里要问的是一个标量子查询

标量子查询只返回一列和一行或零行。返回
NULL
和匹配的零行是等效的,两者都不会抛出错误。在这两种情况下,子查询返回的“值”都是
NULL

但是,如果您试图编写一个返回多行的标量子查询(例如,当您忘记子查询中的
WHERE
时),您将抛出一个错误。但是,零行是完全有效的

IF
测试真实性,以及
为真的任何内容
…这在技术上意味着这两个
都不为假的任何表达式
都不为空
——满足
IF
。如果返回值为
(0)或
NULL
则将遵循
ELSE
分支(如果存在)

我突出显示了上面的关键字短语,如
不是FALSE
,以强调这是SQL中的逻辑运算符

请尝试类似以下查询:
SELECT 0为FALSE
(返回1,因为它为FALSE)或
SELECT NULL不为TRUE
(返回1,因为它不是TRUE)或
SELECT NULL不为FALSE
(也返回1,因为它不是)
SELECT NULL为FALSE
(返回0,因为它不是),以了解我的意思

我需要知道,当一个查询进入IF语句时,它什么也不返回(选择了0行),会发生什么

实际上,这里要问的是一个标量子查询

标量子查询只返回一列和一行或零行。返回
NULL
和匹配的零行是等效的,两者都不会引发错误。在这两种情况下,子查询返回的“值”都是
NULL

但是,如果您试图编写一个返回多行的标量子查询(例如,当您忘记子查询中的
WHERE
时),您将抛出一个错误。但是,零行是完全有效的

IF
测试真实性,以及
为真的任何内容
…这在技术上意味着这两个
都不为假的任何表达式
都不为空
——满足
IF
。如果返回值为
(0)或
NULL
则将遵循
ELSE
分支(如果存在)

我突出显示了上面的关键字短语,如
不是FALSE
,以强调这是SQL中的逻辑运算符


请尝试以下查询:
SELECT 0为FALSE
(返回1,因为它为FALSE)或
SELECT NULL不为TRUE
(返回1,因为它不是TRUE)或
SELECT NULL不为FALSE
(也返回1,因为它不是)
SELECT NULL为FALSE
(返回0,因为它不是FALSE)看看我的意思。

SQL中没有IF语句。你可以编写存储过程,但这些存储过程是MySQL特有的,不会在任何其他关系数据库中运行。@duffymo好的,谢谢你。你所说的解释了我的代码不起作用的原因。你能告诉我当子查询不返回任何内容,并且它进入
IF语句?它会抛出错误还是只执行
ELSE
块?SQL中没有IF语句。您可以编写存储过程,但这些存储过程是特定于MySQL的,不会在任何其他关系数据库中运行。@duffymo好的,谢谢您。您所说的解释了我的代码不工作的原因。您能告诉我当n子查询不返回任何内容,并且进入
IF
语句?它会抛出错误还是只执行
ELSE
块?谢谢..upvote..但我的主要问题是,当子查询不返回任何内容而进入
IF
语句时会发生什么?它会抛出错误还是只执行
ELSE
块?我的误解是安定。我以为你在问如何测试IF语句。好吧,没关系。我自己会测试它。还有一件事,一个过程是临时的或强制性的?我的意思是当我写
CREATE procedure foo
时,一个过程将永远被创建?我可以随时使用
foo
吗?
删除procedure foo;
是的,procedure
foo
将被保留,直到它被删除。如果只是临时测试,请删除该过程,但保留scri