SQL多个AND条件

时间:2013-06-01 21:09:02

标签: mysql sql

这是我的问题:

SELECT * FROM addresses 
WHERE (addresses.name LIKE '%Jonathan%' OR addresses.domain LIKE '%Jonathan%') 
AND (addresses.name LIKE '%gmail' OR addresses.domain LIKE '%gmail%')

AND子句使用WHERE语句,假设AND子句之后的部分没有命中任何内容,结果为null,因为它被添加作为AND声明?我试图抓住,在这个例子中,每个人都使用address.name作为Jonathan,每个人都是Jonathan,地址为.domain作为gmail。但是,如果让我们说在这个例子中gmail不存在任何名为Jonathan的人,我想要所有的Jonathan结果(这就是为什么我认为使用AND语句不起作用)我可能没有正确写这个。

由于

4 个答案:

答案 0 :(得分:1)

如果第一组条件或第二组条件不符合WHERE条件,则使用AND,查询将不会返回任何结果。

基本上,

WHERE (true) and (true) -- returns True
WHERE (true) and (false) -- returns False
WHERE (false) and (false) -- returns False

鉴于您的编辑,如果我理解正确,一种选择是将表格重新连接到自己计算gmail等电子邮件的数量。像这样:

select *
from addresses a
  inner join (
    select name, count(case when domain like '%gmail%' then 1 end) cnt
    from addresses 
    where name like '%Jonathan%'
) a2 on a.name = a2.name
where a.domain like '%gmail%' or a2.cnt = 0
;

通过这种方式,您可以检查是否有人被命名为Jonathan,以及是否有像gmail一样的域名。如果域的计数为0(意味着没有人喜欢gmail),则所有人都将返回,否则,只返回那些像gmail一样的域名。

答案 1 :(得分:1)

您对不同的字段使用相同的比较,这可能导致逻辑错误,请看一下这个例子

CREATE TABLE addresses  
    (
     id int auto_increment primary key, 
     name  varchar(20), 
     domain  varchar(30)
    );

INSERT INTO addresses
(name, domain)
VALUES
('Jonathan', 'Jonathan@gmail.com'),
('Jonathan', 'Xavier@gmail.com'),
('Jonathan', 'Xavier@hotmail.com'),
('Jonathan', 'Jonathan@hotmail.com'),
('Xavier', 'Jonathan@hotmail.com')
;

使用您的查询将返回:

1   Jonathan    Jonathan@gmail.com
2   Jonathan    Xavier@gmail.com

AND运算符指定必须满足两个条件。

查看此demo,它将帮助您了解AND运算符的工作原理

答案 2 :(得分:0)

我认为这是MySQL中使用的布局:

SELECT * FROM addresses 
WHERE (addresses.name LIKE '%Jonathan%' || addresses.domain LIKE '%Jonathan%') && 
(addresses.name LIKE '%gmail%' || addresses.domain LIKE '%gmail%')

答案 3 :(得分:0)

我认为你想要的是OR。

你将UNION与AND混淆。 UNION表示将一个查询的结果与另一个查询的结果组合在一起。用英语,“找我A找我B”。

但SQL中的术语AND表示逐行条件匹配。找到符合此条件的行并匹配其他条件。

如果您想查询Jonathan的行和gmail.com的行,只需使用OR:

SELECT * FROM addresses 
WHERE addresses.name LIKE '%Jonathan%' OR addresses.domain LIKE '%Jonathan%'
   OR addresses.name LIKE '%gmail' OR addresses.domain LIKE '%gmail%'