我遇到了表格中需要(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)
值的条目。两个mobileno
或landlineno
中的任何一个都是强制性的。
所以我写了一个查询...
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]+$'"
它会获取所需的行。
请解释一下这些查询的执行格式
答案 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的所有组合是否会导致两个表达式不同,但似乎可能是罪魁祸首。