有趣的SQL执行顺序和3值逻辑

1 那些能看出SQL执行顺序蛛丝马迹的DEMO

sql执行顺序:from>where>group by>having>select(over>distinct>top)>order by
相同优先级的执行顺序:ANSI标准:同时执行;sqlserver实现:select部分同时执行(ALL-AT-ONCE OPERATION),where部分除去优先级(AND>OR)sqlserver会按照COST大小选择(COST小的先执行)

DEMO1 where>select>order

select name,sum(val) sval from test where sval<10 group by name --ERROR
select name,sum(val) sval from test group by name order by sval
/*order 可以引用别名,where 不行*/

DEMO2 group >select(over>distinct)

--查询name的值去重并标注上row_number
select distinct row_number() over(order by name) id,name from test --Distinct没有发挥作用
select row_number() over(order by name) id,name from test group by name

2 SQL中的三值逻辑

SQL中有三种逻辑,TRUE,FALSE,UNKNOWN(NULL)

SQL中对UNKNOWN的处理:

  1. where:TRUE,FALSE和UNKNOW被筛除;
  2. check约束:非FALSE,TRUE和UNKNOWN被接受;

SQL中对UNKNOWN的运算:

  1. NULL和任何运算符的运算结果都是NULL,运算NULL=NULL 的结果是UNKNOWN(NULL只能用IS NULL/IS NOT NULL检测)
  2. UNIQUE约束中认为NULL=NULL是TRUE(mysql认为不等)
    参考:http://blog.csdn.net/asktommorow/article/details/54411110
  3. order by 认为 NULL和NULL的大小相等(T-SQL认为NULL>NOT NULL)

小结:需要在编写每一条查询语句的时候都意识到正在使用三值谓词逻辑

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值