2015-10-18 74 views
0

我有一些我不明白的东西。 如果我的表会是这样的:Sql or operator

name age 
---- ---- 
din  18 
mari 35 

,我做这个查询:

select * from usernames 
where age < 20 or name not like 'din' 

而且所有的表和行打印出来,我的目标是打印谁没有所谓的“喧嚣”和年龄在20岁以下。

有人能告诉我我的错误在哪里吗?

我在这里问另一个q ..对不起。

+1

更改或向AND。 – Alicia

+0

@艾丽西亚我不寻找答案,我寻找解释。 如果或者当一个False和一个True时执行 - 它不会打印20岁以下的年龄,但会打印所有不叫din的名字,对不对?或者我错了? – Antonio

+0

但你已经说过“谁不叫'喧嚣和20岁以下'的问题,与”和“。所以...... @艾丽西亚可能认为OR是一个简单的错误。 –

回答

4

说明:

where age < 20 or name not like 'din' 

分解为:

where <something> or <something else> 

对于每一行,<东西>和<别的东西>进行评估。 or表示如果两者都为真,则结果为真。对于要选择的行,只有其中一个必须为真。

在您的示例中,第一行符合age < 20条件。测试的其余部分并不重要(因为我们已经有了真实的评估,所以评估结果为假)。对于age < 20,第二行的计算结果为false,但如上所述,对于name not like 'din'则为true,如果OR的任一侧为真,则结果为真,因此行2返回结果中。

这就是为什么两行都返回。

这个数据添加到您的表来帮助说明:

name age 
---- ---- 
din  28 (both sides false) 
mari 15 (both sides true)