Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在SQL语句中组合and和OR_Mysql_Sql - Fatal编程技术网

Mysql 如何在SQL语句中组合and和OR

Mysql 如何在SQL语句中组合and和OR,mysql,sql,Mysql,Sql,我有以下SQL语句: SELECT * FROM `table` WHERE type = 3 OR type = 5 OR type = 4 and table.deleted = 1; 我已经读到我可以用括号来完成这一点,但我想知道这是否有效: SELECT * FROM `table` WHERE (type = 3 OR type = 5 OR type = 4) and table.deleted = 1; 或 这两种方法都是有效的,但它们的含义不同: 第一个带括号的查询将拾取类

我有以下SQL语句:

SELECT * FROM `table` WHERE type = 3 OR type = 5 OR type = 4 and table.deleted = 1;
我已经读到我可以用括号来完成这一点,但我想知道这是否有效:

SELECT * FROM `table` WHERE (type = 3 OR type = 5 OR type = 4) and table.deleted = 1;


这两种方法都是有效的,但它们的含义不同:

  • 第一个带括号的查询将拾取类型为3、4、5的已删除行
  • 您的第二个括号查询将选择类型为3、5的所有行,以及类型为4的已删除行;这与没有括号的原始查询中的含义相同
通过在中使用运算符
,可以完全避免混淆,如下所示:

SELECT * FROM `table` WHERE type IN (3, 4, 5) AND table.deleted = 1;
或者如果你想要第二个意思

SELECT * FROM `table` WHERE type IN (3, 5) OR (type = 4 AND table.deleted = 1)

这两种方法都是有效的,但它们的含义不同:

  • 第一个带括号的查询将拾取类型为3、4、5的已删除行
  • 您的第二个括号查询将选择类型为3、5的所有行,以及类型为4的已删除行;这与没有括号的原始查询中的含义相同
通过在
中使用运算符
,可以完全避免混淆,如下所示:

SELECT * FROM `table` WHERE type IN (3, 4, 5) AND table.deleted = 1;
或者如果你想要第二个意思

SELECT * FROM `table` WHERE type IN (3, 5) OR (type = 4 AND table.deleted = 1)

您需要的是类似于操作员的

SELECT * FROM `table` 
WHERE type IN ( 3, 5, 4) and deleted = 1;

您需要的是类似于操作员的

SELECT * FROM `table` 
WHERE type IN ( 3, 5, 4) and deleted = 1;

的值高于
,因此第一个和第三个过滤器相当于:

type = 3 OR type = 5 OR (type = 4 and table.deleted = 1)
您的第二个筛选器可以使用()中的
IN
等效表示:


的值高于
,因此第一个和第三个过滤器相当于:

type = 3 OR type = 5 OR (type = 4 and table.deleted = 1)
您的第二个筛选器可以使用()中的
IN
等效表示:


有一种简单的方法可以测试您的SQL是否有效-尝试执行它。有一种简单的方法可以测试您的SQL是否有效-尝试执行它。感谢您的回复,实际上我想要的是首先确保我选择了被删除的SQL(在未来的项目中,我必须首先检查是否已删除=0,因此我只选择未删除的项目)然后我检查类型。根据你关于优先级的说法,似乎我在句首或句尾将AND deleted=1放在哪里并不重要,对吗?eggyal说的是@dasblinkenlight吗?我也认为它们的顺序正确。@eggyal的“第一个查询”是指“第一个括号内的查询”,因此正在进行一些重新编号。我编辑以使其明确。@SaulOrtega这可能令人困惑。我编辑以解释“第一”和“第二”的含义。对于第一个查询,它将首先检查行是否已删除=1,然后检查类型,因为您说过它具有更高的优先级,对吗?谢谢您的回答,实际上我想要的是首先确保选择已删除的行(在未来的项目中,我必须首先检查是否已删除=0,因此我只选择未删除的项目)然后我检查类型。根据你关于优先级的说法,似乎我在句首或句尾将AND deleted=1放在哪里并不重要,对吗?eggyal说的是@dasblinkenlight吗?我也认为它们的顺序正确。@eggyal的“第一个查询”是指“第一个括号内的查询”,因此正在进行一些重新编号。我编辑以使其明确。@SaulOrtega这可能令人困惑。我编辑以解释“第一”和“第二”的含义。对于第一个查询,它将首先检查行是否被删除=1,然后检查类型,因为您说过它具有更高的优先级,对吗?谢谢eggyal,我认为它们是向后正确的?第一个用于第二个查询,第二个用于第一个查询,对吗?@SaulOrtega:您的#1和#3与我的#1相同。您的#2和我的#2是t他是一样的。谢谢eggyal,我认为他们是反向正确的?第一个是第二个,第二个是第一个查询,对吗?@SaulOrtega:你的1和3与我的1相同。你的2和我的2相同。