仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 805|回复: 9
打印 上一主题 下一主题

[学习教程] SqlServer中or和and的优先级剖析

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:07:10 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
EXAMPLE存储引擎是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE存储引擎不支持编索引。本来一向都没有弄分明sqlserver中and和or的优先级干系,觉得他们的优先级都是一样,在实行的时分按呈现的按次从左到右实行。但明天我在写一个束缚,以下:
(number>0andprenumber>0)or(number<0andprenumber<0)
保留后体系老是主动将我的束缚修正以下:
number>0andprenumber>0ornumber<0andprenumber<0
就是往失落了我的括号,我想,怎样会如许呢?如许不就改动了我的语意了吗?呵呵,查询材料后得知,本来,下面两个束缚的意义是一样的。

缘故原由:在SqlServer中,and的优先级比or的优先级要高。地点,在下面的束缚中,会先实行or双方的and前提,再实行or前提。

上面,我们能够做一个测试。
创立表及数据以下:
if(object_id(table1)isnotnull)
begin
droptabletable1
end
go

createtabletable1
(
IDintidentity(1,1)primarykey,
num1intnotnull,
num2intnotnull
)

insertintotable1(num1,num2)
select-1,-1
unionall
select-1,2
unionall
select1,2
unionall
select0,0


然后我们实行sql
select*fromtable1wherenum1>0ornum2>0andnum1<0

假如or与and的优先级是一样的话,那末应当只能查出一条数据,即
IDnum1num2
2-12

但实践上,我们实行后发明,这有查出两条数据了,
IDnum1num2
2-12
312
这是由于它先实行了and的前提,再实行or的前提,即同等以下:
select*fromtable1wherenum1>0or(num2>0andnum1<0)

那末,假如我们必定要sql先实行or前提,就要利用()来改动前提的实行按次了。仍是下面的sql,假如我们要先实行or前提,能够修正sql以下:
select*fromtable1where(num1>0ornum2>0)andnum1<0
导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-16 10:53

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表