语句2 Select * From Table1 Where (Field1='1' and field1 is null ) --这个条件永远false or (Field2 in (Select Field1 From testTable) ) === Select * From Table1 Where (Field2 in (Select Field1 From testTable) )
>>>优先级从高到低是 = , and ,or与in 并列 优先级从高到低是 = 与in 并列 , and ,or
晕,搂主概念混了Field1='1' field1 is null Field2 in (Select Field1 From testTable) 都是同一个级别的,是逻辑子句, 优先级应该只比较not and or
同一个级别的,是逻辑子句 不按照优先级比较吗 优先级应该只比较not and or
语句2与语句1产生不同的结果的原因因为运算优先级是 NOT AND OR 所以语句一相当于 Select * From Table1 Where Field1='1' or Field2 in (Select Field1 From testTable) and field1 is null 先算 AND Select * From Table1 Where Field1='1' or field1 is null 然后算 OR 语句一最后相当于 Select * From Table1 Where Field1='1' 语句二 Select * From Table1 Where Field1='1' and field1 is null or Field2 in (Select Field1 From testTable) 先算 AND Select * From Table1 Where field1 is null or Field2 in (Select Field1 From testTable) 然后算 OR 语句二最后相当于
Select * From Table1 Where Field2 in (Select Field1 From testTable) 语句一 Select * From Table1 Where Field1='1' 语句二 Select * From Table1 Where Field2 in (Select Field1 From testTable) 所以最后结果不一样
好像错了哦 语句一 Select * From Table1 Where Field1='1' and field1 is null 语句二 Select * From Table1 Where Field2 in (Select Field1 From testTable) and field1 is null
--语句一:Select * From Table1 Where (Field1='1') or ( (Field2 in (Select Field1 From testTable)) and (field1 is null) )
TO:海阔天空 > > > 优先级从高到低是 = , and ,or与in 并列 优先级从高到低是 = 与in 并列 , and ,or 是这样吗? 我看联机帮助里面是这样写的: 运算符的优先顺序 当一个复杂的表达式有多个运算符时,运算符优先性决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。运算符有下面这些优先等级。在较低等级的运算符之前先对较高等级的运算符进行求值。 +(正)、-(负)、~(按位 NOT) *(乘)、/(除)、%(模) +(加)、(+ 串联)、-(减) =, >, <, >=, <=, <>, !=, !>, !< 比较运算符 ^(位异或)、&(位与)、|(位或) NOT AND ALL、ANY、BETWEEN、IN、LIKE、OR、SOME =(赋值) 如果按你的 优先级从高到低是 = 与in 并列 , and ,or 这个说法我的问题2解决,但是如果按联机帮助里的说法,我的问题2还没解决??
嘿嘿~~~ 不好意识了 大家(Field2 in (Select Field1 From testTable)) and (field1 is null) 我全部看成是 field1 了不好意识
从联机帮助复制:搜索条件 是使用逻辑运算符 AND、OR 和 NOT 的一个或更多谓词的组合。语法 < search_condition > ::= { [ NOT ] < predicate > | ( < searth_condition > ) } [ { AND | OR } [ NOT ] { < predicate > |( < searth_condition > ) } ] } [ ,...n ]< predicate > ::= { expression { = | < > | != | > | > = | ! > | < | < = | ! < } expression | string_expression [ NOT ] LIKE string_expression [ ESCAPE 'escape_character' ] | expression [ NOT ] BETWEEN expression AND expression | expression IS [ NOT ] NULL | CONTAINS ( { column | * } , '< contains_search_condition >' ) | FREETEXT ( { column | * } , 'freetext_string' ) | expression [ NOT ] IN ( subquery | expression [ ,...n ] ) | expression { = | < > | != | > | > = | ! > | < | < = | ! < } { ALL | SOME | ANY} ( subquery ) | EXISTS ( subquery ) } 参数 <search_condition>指定 SELECT 语句、查询表达式或子查询的结果集内所返回的行的条件。对于 UPDATE 语句,指定要更新的行。对于 DELETE 语句,指定要删除的行。对 Transact-SQL 语句搜索条件中可以包含的谓词数量没有限制。 NOT 对由谓词指定的布尔表达式求反。有关更多信息,请参见 NOT。AND 组合两个条件并在两个条件都是 TRUE 时取值为 TRUE。有关更多信息,请参见 AND。 OR 组合两个条件并在任何一个条件是 TRUE 时取值为 TRUE。有关更多信息,请参见 OR。 < predicate >是返回 TRUE、FALSE 或 UNKNOWN 的表达式。 expression 是列名、常量、函数、变量、标量子查询,或者是由运算符或子查询连接的列名、常量和函数的任意组合。该表达式还可以包含 CASE 函数。= 是用于测试两个表达式是否相等的运算符。<> 是用于测试两个表达式彼此不相等的条件的运算符。!= 是用于测试两个表达式彼此不相等的条件的运算符。> 是用于测试一个表达式大于另一个的条件的运算符。>= 是用于测试一个表达式大于或等于另一个的条件的运算符。!> 是用于测试一个表达式不大于另一个的条件的运算符。< 是用于测试一个表达式小于另一个的条件的运算符。<= 是用于测试一个表达式小于或等于另一个的条件的运算符。!< 是用于测试一个表达式不小于另一个的条件的运算符。string_expression 是字符串和通配符。[NOT] LIKE 表示对后续字符串使用模式匹配。有关更多信息,请参见 LIKE。ESCAPE 'escape_character' 允许在字符串中搜索通配符而不是将其作为通配符使用。escape_character 是放在通配符前表示此特殊用途的字符。[ NOT ] BETWEEN 指定值的包含范围。使用 AND 将开始值和结束值分开。有关更多信息,请参见 BETWEEN。IS [NOT] NULL 根据所使用的关键字指定对空值或非空值的搜索。如果有任何操作数是 NULL,带位运算符或算术运算符的表达式将取值为 NULL。CONTAINS 在包含基于字符的数据的列中,搜索单个词和短语的精确或"模糊"(不精确)匹配项、一定间距内的近似词以及加权匹配项。只能与 SELECT 语句一起使用。有关更多信息,请参见 CONTAINS。 FREETEXT 通过在包含基于字符的数据的列中,搜索与含义而不是谓词中的精确词相匹配的值,提供简单形式的自然语言查询。只能与 SELECT 语句一起使用。有关更多信息,请参见 FREETEXT。[ NOT ] IN 根据表达式是包含在列表内还是排除在列表外,指定对表达式的搜索。搜索表达式可以是常量或列名,而列表可以是一组常量或更多情况下是子查询。将值列表放在圆括号内。有关更多信息,请参见 IN。subquery 可被看成是受限 SELECT 语句且与 SELECT 语句中的 <query_expresssion> 相似。不允许使用 ORDER BY 子句、COMPUTE 子句和 INTO 关键字。有关更多信息,请参见 SELECT。 ALL 与比较运算符和子查询一起使用。如果子查询检索的所有值满足比较运算,将给 <predicate> 返回 TRUE,或者如果不是所有值都满足比较运算或子查询没有给外部语句返回行,则返回 FALSE。有关更多信息,请参见 ALL。{ SOME | ANY } 与比较运算符和子查询一起使用。如果子查询检索的任何值都满足比较运算,将给 <predicate> 返回 TRUE,或者如果子查询内没有值满足比较运算或子查询没有给外部语句返回行,则返回 FALSE。否则,表达式是未知的。有关更多信息,请参见 SOME | ANY。EXISTS 与子查询一起使用,测试由子查询返回的行是否存在。有关更多信息,请参见 EXISTS。 注释 逻辑运算符的优先顺序是 NOT(最高),接着是 AND,最后是 OR。同一优先级上的取值顺序是从左到右。在搜索条件内,可使用圆括号替代此顺序。有关逻辑运算符如何在真实值上运算的更多信息,请参见 AND、OR 和 NOT。
语句2
Select * From Table1 Where
(Field1='1' and field1 is null ) --这个条件永远false
or
(Field2 in (Select Field1 From testTable) )
===
Select * From Table1 Where
(Field2 in (Select Field1 From testTable) )
field1 is null
Field2 in (Select Field1 From testTable) 都是同一个级别的,是逻辑子句,
优先级应该只比较not and or
优先级应该只比较not and or
Select * From Table1 Where
Field1='1'
or Field2 in (Select Field1 From testTable)
and field1 is null 先算 AND
Select * From Table1 Where
Field1='1' or field1 is null
然后算 OR 语句一最后相当于
Select * From Table1 Where
Field1='1' 语句二
Select * From Table1 Where
Field1='1' and field1 is null
or Field2 in (Select Field1 From testTable) 先算 AND
Select * From Table1 Where
field1 is null
or Field2 in (Select Field1 From testTable)
然后算 OR 语句二最后相当于
Select * From Table1 Where Field2 in (Select Field1 From testTable) 语句一
Select * From Table1 Where
Field1='1'
语句二
Select * From Table1 Where Field2 in (Select Field1 From testTable)
所以最后结果不一样
Select * From Table1 Where Field1='1' and field1 is null
语句二
Select * From Table1 Where Field2 in (Select Field1 From testTable) and field1 is null
--语句一:Select * From Table1 Where
(Field1='1')
or
(
(Field2 in (Select Field1 From testTable))
and
(field1 is null)
)
> > > 优先级从高到低是 = , and ,or与in 并列 优先级从高到低是 = 与in 并列 , and ,or 是这样吗?
我看联机帮助里面是这样写的:
运算符的优先顺序
当一个复杂的表达式有多个运算符时,运算符优先性决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。运算符有下面这些优先等级。在较低等级的运算符之前先对较高等级的运算符进行求值。 +(正)、-(负)、~(按位 NOT)
*(乘)、/(除)、%(模)
+(加)、(+ 串联)、-(减)
=, >, <, >=, <=, <>, !=, !>, !< 比较运算符
^(位异或)、&(位与)、|(位或)
NOT
AND
ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
=(赋值)
如果按你的
优先级从高到低是 = 与in 并列 , and ,or 这个说法我的问题2解决,但是如果按联机帮助里的说法,我的问题2还没解决??
and
(field1 is null)
我全部看成是 field1 了不好意识
是使用逻辑运算符 AND、OR 和 NOT 的一个或更多谓词的组合。语法
< search_condition > ::=
{ [ NOT ] < predicate > | ( < searth_condition > ) }
[ { AND | OR } [ NOT ] { < predicate > |( < searth_condition > ) } ]
} [ ,...n ]< predicate > ::=
{ expression { = | < > | != | > | > = | ! > | < | < = | ! < } expression
| string_expression [ NOT ] LIKE string_expression
[ ESCAPE 'escape_character' ]
| expression [ NOT ] BETWEEN expression AND expression
| expression IS [ NOT ] NULL
| CONTAINS
( { column | * } , '< contains_search_condition >' )
| FREETEXT ( { column | * } , 'freetext_string' )
| expression [ NOT ] IN ( subquery | expression [ ,...n ] )
| expression { = | < > | != | > | > = | ! > | < | < = | ! < }
{ ALL | SOME | ANY} ( subquery )
| EXISTS ( subquery )
} 参数
<search_condition>指定 SELECT 语句、查询表达式或子查询的结果集内所返回的行的条件。对于 UPDATE 语句,指定要更新的行。对于 DELETE 语句,指定要删除的行。对 Transact-SQL 语句搜索条件中可以包含的谓词数量没有限制。 NOT
对由谓词指定的布尔表达式求反。有关更多信息,请参见 NOT。AND
组合两个条件并在两个条件都是 TRUE 时取值为 TRUE。有关更多信息,请参见 AND。 OR
组合两个条件并在任何一个条件是 TRUE 时取值为 TRUE。有关更多信息,请参见 OR。
< predicate >是返回 TRUE、FALSE 或 UNKNOWN 的表达式。 expression
是列名、常量、函数、变量、标量子查询,或者是由运算符或子查询连接的列名、常量和函数的任意组合。该表达式还可以包含 CASE 函数。=
是用于测试两个表达式是否相等的运算符。<>
是用于测试两个表达式彼此不相等的条件的运算符。!=
是用于测试两个表达式彼此不相等的条件的运算符。>
是用于测试一个表达式大于另一个的条件的运算符。>=
是用于测试一个表达式大于或等于另一个的条件的运算符。!>
是用于测试一个表达式不大于另一个的条件的运算符。<
是用于测试一个表达式小于另一个的条件的运算符。<=
是用于测试一个表达式小于或等于另一个的条件的运算符。!<
是用于测试一个表达式不小于另一个的条件的运算符。string_expression
是字符串和通配符。[NOT] LIKE
表示对后续字符串使用模式匹配。有关更多信息,请参见 LIKE。ESCAPE 'escape_character'
允许在字符串中搜索通配符而不是将其作为通配符使用。escape_character 是放在通配符前表示此特殊用途的字符。[ NOT ] BETWEEN
指定值的包含范围。使用 AND 将开始值和结束值分开。有关更多信息,请参见 BETWEEN。IS [NOT] NULL
根据所使用的关键字指定对空值或非空值的搜索。如果有任何操作数是 NULL,带位运算符或算术运算符的表达式将取值为 NULL。CONTAINS
在包含基于字符的数据的列中,搜索单个词和短语的精确或"模糊"(不精确)匹配项、一定间距内的近似词以及加权匹配项。只能与 SELECT 语句一起使用。有关更多信息,请参见 CONTAINS。 FREETEXT
通过在包含基于字符的数据的列中,搜索与含义而不是谓词中的精确词相匹配的值,提供简单形式的自然语言查询。只能与 SELECT 语句一起使用。有关更多信息,请参见 FREETEXT。[ NOT ] IN
根据表达式是包含在列表内还是排除在列表外,指定对表达式的搜索。搜索表达式可以是常量或列名,而列表可以是一组常量或更多情况下是子查询。将值列表放在圆括号内。有关更多信息,请参见 IN。subquery
可被看成是受限 SELECT 语句且与 SELECT 语句中的 <query_expresssion> 相似。不允许使用 ORDER BY 子句、COMPUTE 子句和 INTO 关键字。有关更多信息,请参见 SELECT。 ALL
与比较运算符和子查询一起使用。如果子查询检索的所有值满足比较运算,将给 <predicate> 返回 TRUE,或者如果不是所有值都满足比较运算或子查询没有给外部语句返回行,则返回 FALSE。有关更多信息,请参见 ALL。{ SOME | ANY }
与比较运算符和子查询一起使用。如果子查询检索的任何值都满足比较运算,将给 <predicate> 返回 TRUE,或者如果子查询内没有值满足比较运算或子查询没有给外部语句返回行,则返回 FALSE。否则,表达式是未知的。有关更多信息,请参见 SOME | ANY。EXISTS
与子查询一起使用,测试由子查询返回的行是否存在。有关更多信息,请参见 EXISTS。
注释
逻辑运算符的优先顺序是 NOT(最高),接着是 AND,最后是 OR。同一优先级上的取值顺序是从左到右。在搜索条件内,可使用圆括号替代此顺序。有关逻辑运算符如何在真实值上运算的更多信息,请参见 AND、OR 和 NOT。
表达式运算符的优先级
和
逻辑表达式逻辑运算符和逻辑谓词的优先级
的区别在where搜索条件使用逻辑表达式
1、+(正)、-(负)、~(按位 NOT)
2、*(乘)、/(除)、%(模)
3、+(加)、(+ 串联)、-(减)
4、=, >, <, >=, <=, <>, !=, !>, !< 比较运算符
5、^(位异或)、&(位与)、|(位或)
6、NOT
7、AND
8、ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
9、=(赋值)另:虽然 or 和in 是在同一级,但Field1='1' or Field2 不构成有效逻辑表达式,所以Field2 in (Select Field1 From testTable) 构成组合