我想知道为什么在这种情况下我不应该使用AND运算符?

时间:2017-07-23 05:13:48

标签: sql

所以我应该找到丢失图书馆卡的顾客的第一个名字和电子邮件。

该方案的正确解决方案是:

SELECT first_name, email 
FROM patrons 
WHERE library_id = "MCL1001" 
   OR library_id = "MCL1100" 
   OR library_id = "MCL1011";

我想知道为什么我们不能在这里使用AND,我是一个尝试学习SQL的初学者,我很难想象为什么AND在这种情况下是一个错误的选项

我的回答是:

SELECT first_name, email 
FROM patrons 
WHERE library_id = "MCL1001" 
  AND library_id = "MCL1100" 
  AND library_id = "MCL1011";

请提前帮助和谢谢。

5 个答案:

答案 0 :(得分:0)

一次考虑一行的条件。使用AND条件说:

  • 使用id = "MCL1001"查找与library_id = "MCL1100"和(同时)#:kivy 1.0.9 BoxLayout: orientation: "vertical" ActionBar: ActionView: use_separator: True ActionPrevious: title: 'Action Bar' with_previous: False ActionOverflow: ActionButton: text: 'Btn0' icon: 'atlas://data/images/defaulttheme/audio-volume-high' ActionButton: text: 'Btn1' ActionGroup: text: 'Group1' ActionButton: text: 'Btn2' TicTacToeGrid: <GridEntry>: font_size: self.height background_color: 0, 0, 0, 0 <TicTacToeGrid>: cols: 3 canvas.after: Color: rgba: 0.149, 0.102, 0.051, 1.0 Line: points: self.width/3, self.center_y - (self.height * 0.45), self.width/3, self.center_y + (self.height * 0.45) width: 2 Line: points: self.width*2/3, self.center_y - (self.height * 0.45), self.width*2/3, self.center_y + (self.height * 0.45) width: 2 Line: points: self.center_x - (self.width * 0.45), self.height/3, self.center_x + (self.width * 0.45), self.height/3 width: 2 Line: points: self.center_x - (self.width * 0.45), self.height*2/3, self.center_x + (self.width * 0.45), self.height*2/3 width: 2 的行。

这永远不会成立,因为对于单行,library_id永远不会有两个不同的值。

答案 1 :(得分:0)

如果使用AND,如果library_id与您的三个值相等,则结果将为TRUE,这是不可能的,因为library_id只能存储一个值。搜索Boolean algebra

只有当所有句子都为TRUE时,AND操作才会返回TRUE。相反,当至少一个句子为TRUE时,OR运算将为TRUE。

答案 2 :(得分:0)

AND,当你需要匹配所有条件时,或者当匹配任何条件就足够了。因此,如果您有3行3个ID,并且如果所有3个匹配(或在您的情况下丢失)将返回。即使一个人丢失了也不会显示该行而OR会。

答案 3 :(得分:0)

这些运营商来自Boolean algebra
那里有三个basic operations

  • AND(conjunction),表示为x∧y(有时是x AND y或Kxy),满足 如果x = y = 1则x∧y= 1,否则x∧y= 0。
  • OR(disjunction),表示 x∨y(有时是x OR y或Axy),如果x = y = 0且x∨y,则满足x∨y= 0 否则为1。
  • NOT(negation),表示为¬x(有时为非x,Nx或!x),如果x = 1,则满足¬x= 0,如果x = 0则满足¬x= 1.

您可以在上面的链接中找到有关这些操作的详细说明 我无法相信你还没有在学校里学到这一点。

library_id = "MCL1001" AND library_id = "MCL1100"条件意味着每行必须满足查询选择的条件 一列值不能同时为MCL1001MCL1100,并且此条件始终为false,因此查询neger会给出任何行。

在这种情况下:library_id = "MCL1001" OR library_id = "MCL1001"列值可以是MCL1001MCL1001,因此查询会选择包含第一个值的行,而另一行包含第二个值。< / p>

答案 4 :(得分:0)

执行此查询时:

SELECT first_name, email 
FROM patrons 
WHERE library_id = "MCL1001" 
  AND library_id = "MCL1100" 
  AND library_id = "MCL1011";

它将进入表顾客并查找library_id = "MCL1001"行,并检查同一行library_id = "MCL1100"并检查同一行library_id = "MCL1011";。数据库中的这一行永远不会存在。

但执行时:

SELECT first_name, email 
FROM patrons 
WHERE library_id = "MCL1001" 
   OR library_id = "MCL1100" 
   OR library_id = "MCL1011";

它将转到您的桌面顾客,并检查library_id = "MCL1001"返回的任何行,继续检查library_id = "MCL1100"返回的任何行,继续和 检查library_id = "MCL1011";的任何行并将其返回。所以你可以得到所有三行。

因为AND条件检查每行是否满足所有条件,而OR条件只检查一个正确的条件并继续,

你的查询写错了。