在mysql中运行的sql查询中“column1和(column2或column3)”或“(column1 andcolumn2)或(column1和column3)之间有什么区别”

时间:2011-09-29 19:57:21

标签: mysql

我遇到了表格中需要(column1和column2)或(column1或column3)的情况。所以我把它实现为

    select * from mytable 
    where column1=x and (column2=y or column3=z)

但是它提取了一些不必要的行并通过实现

    select * from mytable 
    where (column1=x and column2=y) or (column1=x and column3=z)

它给出了结果,但我无法理解两者之间的差异......请建议

编辑(已添加详细信息)

下面我解释了我的情况,请检查一下,

让我详细说明我的情况:::

我有一个表,比如clientdetails(int id, var firstname, var mobileno, var landlineno),我需要获取那些获取具有唯一(firstname and mobileno), or (firstname and landlineno)值的条目。两个mobilenolandlineno中的任何一个都是强制性的。

所以我写了一个查询...

select id
from clientdetails 
where firstname = 'pooja' 
and (mobileno = mn or landlineno= ln )   
and mobileno  REGEXP '^[0-9]+$' 
and landlineno REGEXP '^[0-9]+$'"

现在ln或mn可以是任何东西并说''。由于很多情况下firstname是“pooja”而没有固定电话。所以它也获取了那些没有landlineno但不同的mobileno的条目..

当我使用以下查询时

select id
from clientdetails 
where (firstname = 'pooja' and mobileno = mn)
or (firstname = 'pooja' and landlineno= '' )
and mobileno REGEXP '^[0-9]+$'
and landlineno REGEXP '^[0-9]+$'"

它会获取所需的行。

请解释一下这些查询的执行格式

2 个答案:

答案 0 :(得分:1)

正如Alnitak在评论中指出的那样,应该没有任何区别 - 给出三个布尔变量

A, B, C, then A & (B | C) == (A & B) | (A & C)

好吧,我已经通过下面的简单示例测试了两个查询,两个查询都给出了相同的结果。

   create table emp_temp(id smallint(5),fname varchar(10),lname varchar(10));

    insert into emp_temp values (1,'jon','kam'),(2,'ish','dalviv'),(3,'ctn','gado'),
    (4,'jin','jain'),(5,'niraj','yadav');

    select * from emp_temp;

    mysql> select * from emp_temp;
    +------+-------+--------+
    | id   | fname | lname  |
    +------+-------+--------+
    |    1 | jon   | kam    |
    |    2 | ish   | dalviv |
    |    3 | ctn   | gado   |
    |    4 | jin   | jain   |
    |    5 | niraj | yadav  |
    +------+-------+--------+
    5 rows in set (0.00 sec)

    Now comparing your two queries.

    select * from mytable 
    where column1=x and (column2=y or column3=z)

    select * from mytable 
    where (column1=x and column2=y) or (column1=x and column3=z)

    Consider

    column1 is id
    column2 is fname
    column3 is lname

    mysql> select * from emp_temp
        -> where id=1 and (fname='jon' or lname='yadav');
    +------+-------+-------+
    | id   | fname | lname |
    +------+-------+-------+
    |    1 | jon   | kam   |
    +------+-------+-------+
    1 row in set (0.01 sec)


    mysql> select * from emp_temp 
        -> where (id=1 and fname='jon') or ( id=1 and lname='yadav');

    +------+-------+-------+
    | id   | fname | lname |
    +------+-------+-------+
    |    1 | jon   | kam   |
    +------+-------+-------+
    1 row in set (0.01 sec)

    Both queries produces the same result.

答案 1 :(得分:1)

是否有任何列NULL

true AND unknown => false
true OR unknown => true

我没有看到NULL的所有组合是否会导致两个表达式不同,但似乎可能是罪魁祸首。