Mysql的Where条件,加括号和不加括号的区别。求指导。。。。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql的Where条件,加括号和不加括号的区别。求指导。。。。。相关的知识,希望对你有一定的参考价值。

因为sql比较长。大概缩短就是 SELECT * FROM PAY WHERE 1 = 1 AND ( PAYMENT_METHOD_CD = '0'
OR PAYMENT_METHOD_CD = '1'
OR PAYMENT_METHOD_CD = '2 ') 当然用 PAYMENT_METHOD_CD IN ('0','1','2');也是可以的。我之前写的是 下面这句:SELECT * FROM PAY WHERE 1 = 1 AND PAYMENT_METHOD_CD = '0'OR PAYMENT_METHOD_CD = '1'OR PAYMENT_METHOD_CD = '2 ' 不带括号。为什么带不带括号结果差好多啊。而且不带括号查询的结果是错的。但是我感觉没啥区别呢?正常语句不应该是 select * from A where a = '1' and b = '2' 吗?? 为啥加括号呢?求指教

mysql 是先执行and后执行or的,如果你没加括号,系统会先判断1 = 1 AND PAYMENT_METHOD_CD = '0'符不符合,或者PAYMENT_METHOD_CD = '1'或者 PAYMENT_METHOD_CD = '2 ' 符不符合,只要这三个满足一个就可以达成,后面两个是没有1=1恒成立这个条件的 参考技术A 优先级问题吧,and 比 or具有更高的优先级
所以不加括号他就从左到右开始判断
-------------------------------------
想不加括号的话,试试
SELECT * FROM PAY WHERE
PAYMENT_METHOD_CD = '0'
OR PAYMENT_METHOD_CD = '1'
OR PAYMENT_METHOD_CD = '2' :追问

但是我不加括号,结果是错的。查询结果不是我想要的。而且我前面还有条件。所以要用where 1=1 AND 来做。

追答

假设整个集合为U,经过你前面的查询条件得到一个结果集合为A,其中A包涵了PAYMENT_METHOD_CD为‘0’,‘1’,'2','3','4'的所有记录。
那么现在就是看加括号和不加括号的区别。
1)不加括号:A且'0'或'1'或‘2’ 这么个形式
第一步,A且'0' ,从A中找到为'0'的集合A1,处理A1或'1'或‘2’
第二步,A1或‘1’,A1里只有为'0'的记录,得到的结果还是A1,处理A1或'2'
第三步,同第2步,最后得到A1,就是交易方式为'0'的记录
2)加括号:A且(‘0’或‘1’或‘2’)
第一步,(‘0’或‘1’或‘2’),因为有括号,具有较高优先级,从整个集合U中找出为'0'或'1'或'2'的记录,得到集合B。处理A且B
第二步,A且B,得到正确结果集合C。

参考技术B

真是服了你了!!!

单独的

SELECT * FROM PAY WHERE (PAYMENT_METHOD_CD = '0' 
OR PAYMENT_METHOD_CD = '1' 
OR PAYMENT_METHOD_CD = '2 ') 

SELECT * FROM PAY WHERE PAYMENT_METHOD_CD = '0' 
OR PAYMENT_METHOD_CD = '1' 
OR PAYMENT_METHOD_CD = '2 '

是没有区别的

但是你这里,还有convert(employee_cd,signed)=convert('80',singned)这个条件,

不加括号的话,就会被认为

SELECT * FROM PAY WHERE (convert(employee_cd,signed)=convert('80',singned) and PAYMENT_METHOD_CD = '0' )
OR PAYMENT_METHOD_CD = '1' 
OR PAYMENT_METHOD_CD = '2 '

这不就跟小学加减乘除混合运算一个逻辑嘛

参考技术C SELECT * FROM PAY WHERE 1 = 1 AND PAYMENT_METHOD_CD in (0,1,2)
这不是贼简单嘛,为什么要加or,这样还能用到索引,你用的or索引不就废了么
参考技术D 当你想一个确定值和好几个不确定值在一个条件里就用到括号了
1=1 and (a=2 or a=3 or a=4 ) 括号可以当做真或者假

调用类时,加括号和不加括号的区别

class ListNode:
def __init__(self, x):
self.val = x
self.next = None


a = ListNode
a.val = 1
print(ListNode.val) # 返回 1

class ListNode2:
val = 1
def __init__(self, x):
self.val = x
self.next = None

print(ListNode2.val) # 返回 1

b = ListNode(3) # 这是在实例化对象,调用 init 对 对象本身定制 val 的值
print(b.val) # 返回 3

print(id(ListNode)) # 1324811791128
print(id(a)) # 1324811791128
print(id(b)) # 1324843200864




调用类时,不加括号。那么这个变量a 或者 b 都将时类本身。 进而对他进行的任何操作都是对类本身进行操作。 也不会经过__init__。
对val进行操作的时候, 也就是给类 增加了一个属性。

而加上括号之后。那么变量b 就是类实例化出的对象。这是再调用val的时候。 根据类的查找原则, 对象会先到自己的命名空间中找,也就是__init__定制的内容中。
如果找到了val就返回。也就是 3 了。
如果__init__ 中没有定制val这个属性。那么就会去类中找,就会返回 1 了!

下面这个例子,更清楚的反映了。加括号就是调用__init__
class clsTest():
y = None
def __init__(self):
self.y = ‘你‘

x = clsTest
print(x.y) # None

x = clsTest()
print(x.y) # 你












































以上是关于Mysql的Where条件,加括号和不加括号的区别。求指导。。。。。的主要内容,如果未能解决你的问题,请参考以下文章

Python调用函数加括号和不加括号的区别

typeof加括号和不加括号的区别

调用类时,加括号和不加括号的区别

每日一练 for循环 break 加括号和不加括号的区别 break跳出循环

关于vue ,v-on 绑定事件时,函数名加括号和不加括号的区别

闭包函数之函数加括号和不加括号的意义