MySQL中 and or 查询的优先级分析

这个可能是容易被忽略的问题,首选我们要清楚:
MySQL中,AND的执行优先级高于OR。也就是说,在没有小括号()的限制下,总是优先执行AND语句,再执行OR语句。
比如:

select * from table where  条件1 AND 条件2 OR 条件3
等价于
select * from table where  ( 条件1 AND 条件2 )  OR 条件3

select * from table where  条件1 AND  条件2 OR 条件3 AND 条件4
等价于
select * from table where (  条件1 AND  条件2  ) OR (  条件3 AND 条件4  )

来点事例深入理解下:

测试表数据:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
 `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
 `author` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
 `price` decimal(10, 2) DEFAULT NULL,
 PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES (1, 'PHP', 'mate', 21.00);
INSERT INTO `book` VALUES (2, 'JAVA', 'kaven', 23.00);
INSERT INTO `book` VALUES (3, 'JAVA高级', 'loose', 45.00);
INSERT INTO `book` VALUES (4, 'GO', 'jim', 46.00);
INSERT INTO `book` VALUES (5, 'GO设计', 'json', 76.00);
INSERT INTO `book` VALUES (6, 'PHP高级编程', 'bate', 67.00);
INSERT INTO `book` VALUES (7, 'Python', 'jim', 66.00);
INSERT INTO `book` VALUES (8, 'Python设计', 'mali', 54.00);
INSERT INTO `book` VALUES (9, 'GO编程', 'kaven', 86.00);
INSERT INTO `book` VALUES (11, 'Python3', 'jim', 55.00);

SET FOREIGN_KEY_CHECKS = 1;

查询方式1:

SELECT * FROM book WHERE author='jim' OR author='json' AND name='PHP';

上面的查询等价于:

SELECT * FROM book WHERE author='jim' OR (author='json' AND name='PHP');

那么上面的查询结果就很好理解了。

查询方式2:

SELECT * FROM book WHERE name='PHP' AND author='jim' OR author='json';

上面的查询等价于:

SELECT * FROM book WHERE (name='PHP' AND author='jim') OR author='json';

查询方式3:

SELECT * FROM book WHERE name='GO' AND (author='jim' OR author='json');

这个就很好理解了。了解and or的优先级。这些查询也就不是呢么"理解混淆"了。

到此这篇关于MySQL中 and or 查询的优先级分析的文章就介绍到这了,更多相关MySQL and or 查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql条件查询and or使用方法及优先级实例分析

    本文实例讲述了mysql条件查询and or使用方法及优先级.分享给大家供大家参考,具体如下: mysql and与or介绍 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 使用OR关键字时: 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 如果不符合这些查询条件中的任何一条,这样的记录将被排除掉. 使用and关键字时: 需要符合所有条件,这样的记录就会被查询出来. 如果有任何一个条件不符合,这样的记录将被排除掉. mysql and与or实例 本实例中

  • 解决mysql 组合AND和OR带来的问题

    如下所示: SELECT prod_name,prod_price FROM products WHERE vend_id = 1002 OR vend_id= 1003 AND prod_price >= 10; 上面这条语句 返回的结果不是我们想要的. 分析: 原因在于计算的次序.SQL 在处理OR操作符前 优先处理AND操作符.当SQK看到上述WHERE子句时,由于AND在计算次序中优先级更高,操作符被错误的组合了. 此问题的解决方法是使用圆括号明确地分组相应的操作符. 请看下面的SELE

  • MySQL中 and or 查询的优先级分析

    这个可能是容易被忽略的问题,首选我们要清楚: MySQL中,AND的执行优先级高于OR.也就是说,在没有小括号()的限制下,总是优先执行AND语句,再执行OR语句. 比如: select * from table where  条件1 AND 条件2 OR 条件3 等价于 select * from table where  ( 条件1 AND 条件2 )  OR 条件3 select * from table where  条件1 AND  条件2 OR 条件3 AND 条件4 等价于 sel

  • 深入了解MySQL中的慢查询

    目录 一.什么是慢查询 二.慢查询的危害 三.慢查询常见场景 总结 一.什么是慢查询 什么是MySQL慢查询呢?其实就是查询的SQL语句耗费较长的时间. 具体耗费多久算慢查询呢?这其实因人而异,有些公司慢查询的阈值是100ms,有些的阈值可能是500ms,即查询的时间超过这个阈值即视为慢查询. 正常情况下,MySQL是不会自动开启慢查询的,且如果开启的话默认阈值是10秒 # slow_query_log 表示是否开启 mysql> show global variables like '%slo

  • mysql中binlog_format模式与配置详细分析

    mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR).对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED. ① STATEMENT模式(SBR) 每一条会修改数据的sql语句会记录到binlog中.优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binl

  • MySql中使用正则表达式查询的方法

    正则表达式常用来检索和替换那些符合魔种模式的文本.例如从一个文本文件中提取电话号码,查找一篇文章中重复的单词或者替换用户输入的某些敏感词汇等.Mysql 使用 REGEXP 关键字指定正则表达式的字符匹配模式. 1. 字符 '^' 查询以特定字符或字符串开头的记录 SELECT * FROM user WHERE email REGEXP '^a' 字符 '^' 匹配以特定字符或字符串开头的记录,以上语句查询邮箱以 a 开头的记录 2. 字符 ' 查询以特定字符或字符串结尾的记录 SELECT

  • mysql中like % %模糊查询的实现

    1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为"张三","张猫三"."三脚猫","唐三藏"等等有"三"的记录全找出来. 另外,如果需要找出u_name中既有"三"又有"猫"的记录,请使用a

  • MySQL中Like模糊查询速度太慢该如何进行优化

    目录 一.前言: 二.第一个思路建索引 三.INSTR 附:Like是否使用索引? 总结 一.前言: 我建了一个<学生管理系统>,其中有一张学生表和四张表(小组表,班级表,标签表,城市表)进行联合的模糊查询,效率非常的低,就想了一下如何提高like模糊查询效率问题 注:看本篇博客之前请查看:Mysql中如何查看Sql语句的执行时间 二.第一个思路建索引 1.like %keyword 索引失效,使用全表扫描. 2.like keyword% 索引有效. 3.like %keyword% 索引失

  • 详细讲述MySQL中的子查询操作

    继续做以下的前期准备工作: 新建一个测试数据库TestDB: create database TestDB; 创建测试表table1和table2: CREATE TABLE table1 ( customer_id VARCHAR(10) NOT NULL, city VARCHAR(10) NOT NULL, PRIMARY KEY(customer_id) )ENGINE=INNODB DEFAULT CHARSET=UTF8; CREATE TABLE table2 ( order_id

  • mysql多表联合查询操作实例分析

    本文实例讲述了mysql多表联合查询操作.分享给大家供大家参考,具体如下: MySQL多表联合查询是MySQL数据库的一种查询方式,下面就为您介绍MySQL多表联合查询的语法,供您参考学习之用. MySQL多表联合查询语法: 复制代码 代码如下: SELECT * FROM 插入表 LEFT JOIN 主表 ON t1.lvid=t2.lv_id select * from mytable,title where 表名1.name=表名2.writer ; mysql版本大于4.0,使用UNIO

  • MySQL中对表连接查询的简单优化教程

    在MySQL中,A LEFT JOIN B join_condition执行过程如下: · 根据表A和A依赖的所有表设置表B. · 根据LEFT JOIN条件中使用的所有表(除了B)设置表A. · LEFT JOIN条件用于确定如何从表B搜索行.(换句话说,不使用WHERE子句中的任何条件). · 可以对所有标准联接进行优化,只是只有从它所依赖的所有表读取的表例外.如果出现循环依赖关系,MySQL提示出现一个错误. · 进行所有标准WHERE优化. · 如果A中有一行匹配WHERE子句,但B中没

  • MySQL中的基本查询语句学习笔记

    1.基本查询语句 select 属性列表 from 表名和视图列表 [where 条件表达式1] [group by 属性名1 [having 条件表达式2]] [order by 属性名2 [asc|desc]] 2.单表查询 1)使用*查询所有字段 select * from 表名: 2) 查询指定字段 select id,name from product: 使用上面例子可以查询指定字段 3)查询指定记录 where 条件表达式 实例: select *from employee wher

随机推荐