mysql查询中经常会用到AND与OR一起使用的情况,可如果写法不对,往往会起到相反的效果,这不,前几天就碰到了,最后测试果然提了一堆bug!!!!

废话就不多说了,主要总结一下几点:

一 当mysql的WHERE语句中出现AND OR时,AND 要么全部放在 OR的前面,放在OR之后的and条件将不会起作用,参考sql:

SELECT
e.total_amount
FROM
cmo_expense_account e
WHERE
e.project_id='236aec01d88e48cdaaee357a870d18b5'
AND e.ea_type =1
OR (e.project_id in (select t1.id from pm_project t1 where t1.parent_id='236aec01d88e48cdaaee357a870d18b5'))
and e.total_amount>300

  当然,结果肯定是200的也会出现,如果你把 AND e.ea_type =1再放到后面,naer_type=2的也就出现了,

二 如果你怕出错,可以使用union all写法

将and与or分开,这样就不会存在问题了,就是比较麻烦,

                select sum(t3.total_amount) from   (
SELECT
e.total_amount
FROM
cmo_expense_account e
WHERE e.project_id='236aec01d88e48cdaaee357a870d18b5'
AND e.ea_type =1 union ALL SELECT
e.total_amount
FROM
cmo_expense_account e
WHERE e.project_id in (select t1.id from pm_project t1 where t1.parent_id='236aec01d88e48cdaaee357a870d18b5')
AND e.ea_type =1) t3

三 如果你坚持需要将AND放在OR之后,那么,OR的两边应该用()括起来和AND并列

比如下面这个:

SELECT * from student WHERE id = 1 or id = 2 AND age = 20;

查询出id是1或者2并且年龄是20的,那么很明显结果:

上面查询出来的是id=1的或者id为2并且年龄20的,如果想取唯一的并集,那么就需要这么写

SELECT * from student WHERE (id = 1 or id = 2 ) AND age = 20;

这样查出来的才是id为1或者2的并且年龄一定是20的!

mysql条件查询中AND与OR联合使用的注意事项!的更多相关文章

  1. 将一个多表关联的条件查询中的多表通过 create select 转化成一张单表的sql、改为会话级别临时表 【我】

    将一个多表关联的条件查询中的多表通过 create   select  转化成一张单表的sql 将结果改为创建一个会话级别的临时表: -- 根据下面这两个sql CREATE TABLE revenu ...

  2. MySql数据查询中 left join 条件位置区别

    /*A 和 B 两张表都只有一个 ID 字段 比如A表的数据为 ID 1,2,3,4,5,6 B表的数据为 ID 1,2,3 判断 JOIN 查询时候条件在 ON 和 WHERE 时的区别 ON 和 ...

  3. mysql条件查询and or使用实例及优先级介绍

    mysql and与or介绍 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 使用OR关键字时: 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 如果不符合这 ...

  4. (四)MySQL条件查询(通配符、模糊查询)、排序查询、分组查询(单行、分组函数)

    一.条件查询 1.含义:前面学的基础查询可以查询一个或多个字段,如果需要的数据仅仅是其中的某一行或多行就用到了条件查询. 2.语法:(序号表示语句执行顺序) SELECT 字段名 ③ FROM 表名 ...

  5. MySQL 条件查询

    查询条件 having having的功能和where一样,都是用来筛选查询,不同的是,where在分组之前用,having必须在分组之后使用. # 查询每个部门大于30岁的平均工资,并且保留平均工资 ...

  6. mysql where语句多条件查询是and和or联合使用bug

    公司项目中有段功能是全局搜索框和下拉列表的联合查询,在联调开发中发现单独用下拉查询是正确的,单独用全局搜索框也是正确的,测试发现是sql语法有问题. 问题截图: 出现问题的核心还是在于搜索框是用于多个 ...

  7. MySQL条件查询

    语法: ①SELECT 查询列表(可以包括:字段.表达式.常量值.几个拼在一起的,构成的表) ②FROM 表名(原始表) ③WHERE (理解为当...筛选条件=TRUE或筛选条件=FALSE) 筛选 ...

  8. MySQL数据库查询中的特殊命令

    第一:   MySQL的安装 下载MySQL软件,修改安装路径之后 安装数据库MySQL5.7.18 第一步:数据库MySQL5.7.18可以在官网上下载对应的版本,下载地址:http://www.f ...

  9. MySQL模糊查询中通配符的转义

    sql中经常用like进行模糊查询,而模糊查询就要用到百分号“%”,下划线“_”这些通配符,其中“%”匹配任意多个字符,“_”匹配单个字符.如果我们想要模糊查询带有通配符的字符串,如“60%”,“us ...

随机推荐

  1. Java中,一切皆是对象!为何数据类型中还分为:基本类型和对象?

    Java中一切皆是对象!这句话没错,因为八种基本类型都有对应的包装类(int的包装类是Integer),包装类自然就是对象了. 基本类型一直都是Java语言的一部分,这主要是基于程序性能的考量, 基本 ...

  2. mysql中LIKE和REGEXP

    mysql中LIKE和REGEXP都可以用来字符匹配 正则表达式REGEXP是为复杂搜索指定模式的强大方式. like用法   LIKE一般与通配符(%)和(_)两个使用 如例 SELECT prod ...

  3. 【hihocoder编程练习赛9】闰秒

    题目链接 #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h&g ...

  4. 【BZOJ4872】【Shoi2017】分手是祝愿

    Time Limit: 20 Sec Memory Limit: 512 MB Description ​ Zeit und Raum trennen dich und mich. ​ 时空将你我分开 ...

  5. tokenizer

    http://blog.csdn.net/beyond__devil/article/details/52829241

  6. BZOJ 1010 [HNOI2008]toy 玩具装箱

    2017.6.9:经过我的不懈努力,终于把此题A掉了,但上凸和下凸总是那么让人费解…… P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意 ...

  7. set.seed(7)什么意思

    以前虽然在每个程序都看见过,但是没注意过这个问题,也不理解是什么意思,去搜了一些帖子才明白. 其实,很好理解,就是如果你不加set.seed(7),当然代码也可以执行这个命令,但是每次执行的结果都会不 ...

  8. 【题解】【THUSC 2016】成绩单 LOJ 2292 区间dp

    Prelude 快THUWC了,所以补一下以前的题. 真的是一道神题啊,网上的题解没几篇,而且还都看不懂,我做了一天才做出来. 传送到LOJ:(>人<:) Solution 直接切入正题. ...

  9. Codeforces 804D Expected diameter of a tree

    D. Expected diameter of a tree time limit per test 3 seconds memory limit per test 256 megabytes inp ...

  10. Jenkins+Maven+SVN

    准备环境: CentOS7 JDK1.7.9.0_79 Maven3.3.9 Jenkins2.5.0 1.配置jdk环境变量 2.安装maven(否则在创建job时没有maven选项) unzip ...