登录 |  注册
首页 >  数据库 >  SQL >  SQL运算符优先级及逻辑处理顺序

SQL运算符优先级及逻辑处理顺序

运算符是保留字或主要用于SQL语句的WHERE子句中的字符,用于执行操作.

例如:比较和算术运算。 这些运算符用于指定SQL语句中的条件,并用作语句中多个条件的连词。

常见运算符有以下几种:

  • 算术运算符

  • 比较运算符

  • 逻辑运算符

  • 否定条件运算符

SQL 运算符优先级:

运算符.png

SQL算术运算符

假设变量 a 的值是:10,变量 b 的值是:20,以下为各运算符执行结果:

运算符描述例子

+

加法,执行加法运算。

a + b 得到 30

-

减法,执行减法运算。

a - b 得到  -10

*

乘法,执行乘法运算。

a * b 得到  200

/

用左操作数除右操作数。

b / a 得到  2

%

用左操作数除右操作数并返回余数。

b % a 得到  0


SQL比较运算符

假设变量 a 的值是:10,变量 b 的值是:20,以下为各运算符执行结果:

运算符描述例子
=检查两个操作数的值是否相等,如果是,则条件为真(true)。
(a = b) is false.
!=检查两个操作数的值是否相等,如果值不相等则条件为真(true)。
(a != b)  is  true.
<>检查两个操作数的值是否相等,如果值不相等则条件为真(true)。(a <> b) is true.
>检查左操作数的值是否大于右操作数的值,如果是,则条件为真(true)。
(a > b) is false.
<检查左操作数的值是否小于右操作数的值,如果是,则条件为真(true)。(a < b) is true.
>=检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真(true)。(a >= b) is false
<=检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真(true)。(a <= b) is true.
!<检查左操作数的值是否不小于右操作数的值,如果是,则条件变为真(true)。(a !< b) is false.
!>检查左操作数的值是否不大于右操作数的值,如果是,则条件变为真(true)。(a !> b) is true.

SQL逻辑运算符:

这是在SQL所有的逻辑运算符的列表。

运算符描述
ALLALL运算符用于将值与另一个值集中的所有值进行比较。
ANDAND运算符允许在SQL语句的WHERE子句中指定多个条件。
ANYANY运算符用于根据条件将值与列表中的任何适用值进行比较。
BETWEENBETWEEN运算符用于搜索在给定最小值和最大值内的值。
EXISTSEXISTS运算符用于搜索指定表中是否存在满足特定条件的行。
ININ运算符用于将值与已指定的文字值列表进行比较。
LIKELIKE运算符用于使用通配符运算符将值与相似值进行比较。
NOTNOT运算符反转使用它的逻辑运算符的含义。 例如:NOT EXISTS, NOT BETWEEN, NOT IN等等,这是一个否定运算符。
OROR运算符用于组合SQL语句的WHERE子句中的多个条件。
IS NULLIS NULL运算符用于将值与NULL值进行比较。
UNIQUEUNIQUE运算符搜索指定表的每一行的唯一性(无重复项)。

sql逻辑处理顺序

  • from

  • where

  • group by

  • having

  • select

    • over

    • distinct

    • top

  • order by

SQL开启和关闭查询

--SET STATISTICS TIME ON-------------------------------------------
--请先来看看SET STATISTICS TIME ON会返回什么信息。先运行语句:
DBCC DROPCLEANBUFFERS
--清除buffer pool里的所有缓存数据
DBCC freeproccache
GO
--清除buffer pool里的所有缓存的执行计划
SET STATISTICS TIME ON
GO
set statistics profile on 
set statistics io on 
set statistics time on 
go 
select * from hk_orders a left join hk_orders_sub b on a.order_no=b.order_no
set statistics profile off 
set statistics io off 
set statistics time off

执行字段说明 :set statistics profile on :

Rows:执行计划每一步返回的实际行数

Executes:执行计划每一步执行的次数

StmtText:执行计划的具体内容,每一步都有自己的执行内容,且有结果返回,当然每执行一次,都会花费系统资源(时间 cpu 内存)

EstimateRows:SQL Server预估每一步执行返回的行数,我们经常将EstimateRows与Rows的值进行对比,确认SQL Server是否预估准确

EstimateIO:SQL Server预估每一步执行所花费的I/O资源

EstimateCPU:SQL Server预估每一步执行所花费的CPU资源

TotalSubtreeCost:SQL Server根据EstimateCPU和EstimateIO来计算出的每一步执行计划的cost(该值包括了自己和该树下所有子树执行计划的cost的总和)

Warnings:SQL Server预估所预告的警告(例如:某一步执行没能找到统计信息支持SQL Server预估)

Parallel:是否使用了并行的执行计划

StmtText字段具体说明:

1. 【Table Scan】:遍历整个表,查找所匹配的记录行。这个操作将会一行一行的检查,当然,效率也是最差的。

2. 【Index Scan】:根据索引,从表中过滤出来一部分记录,再查找所匹配的记录行,显示比第一种方式的查找范围要小,因此比【Table Scan】要快。

3. 【Index Seek】:根据索引,定位(获取)记录的存放位置,然后取得记录,因此,比起前二种方式会更快。

4. 【Clustered Index Scan】:和【Table Scan】一样。注意:不要以为这里有个Index,就认为不一样了。其实它的意思是说:按聚集索引来逐行扫描每一行记录,因为记录就是按聚集索引来顺序存放的。而【Table Scan】只是说:要扫描的表没有聚集索引而已,因此这二个操作本质上也是一样的。

5. 【Clustered Index Seek】:直接根据聚集索引获取记录,最快!

上一篇: SQL DELETE 删除语法
下一篇: SQL表达式
推荐文章
  • mysql只支持一种join算法:Nested-LoopJoin(嵌套循环连接),但Nested-LoopJoin有三种变种:SimpleNested-LoopJoin,IndexNested-LoopJoin,BlockNested-LoopJoin(简单-索引-缓冲区)原理:1.SimpleNe
  • redis是一个内存数据库,一旦断电或服务器进程退出,内存数据库中的数据将全部丢失,所以需要redis持久化 redis持久化就是把数据保存在磁盘上,利用永久性存储介质将数据保存,在特定的时间将保存的数据进行恢复的工作机制redis提供两种持久化机制RDB:存储数据结果,关注点在数据AOF:存储操作
  • 通过SQL的执行过程来介绍MySQL的基础结构.     首先有一个user_info表,表里有一个id字段,执行下面这条查询语句:Select * form user_info where i
  • 索引(Index)是帮助MySQL高效获取数据的数据结构,索引的目的在于提高查询效率,就像字典和书籍的目录一样,有了目录,可以帮助你快速查找你需要的内容。可以理解为一个排好序的快速查找数据结构。也就是
  • 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别。今天我们就先来聊聊MySQL中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的
  • 前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句
学习大纲