代码之家  ›  专栏  ›  技术社区  ›  Trash at Coding

为什么我的查询中的AND子句被忽略(非常简单的SQL查询)

  •  -1
  • Trash at Coding  · 技术社区  · 3 年前

    this is the table im working with

    --写一个查询,显示那些名字中有字母“ae”或“ph”且未满19岁的学生的姓名。

    这就是我的解决方案:

    挑选* 来自学生 其中(学生名如“%ae%”或学生名如“%ph%”和年龄!=19)

    My resulting output:

    这是我从课堂笔记中得到的正确答案:

    挑选* 来自学生 其中(学生名如“%ae%”或学生名如“%ph%”) 还有年龄19;

    正确的结果输出不显示任何记录

    我不明白我的查询如何返回2条年龄为19岁的记录,但是在我从课堂笔记中得到的正确解决方案中,它正确返回,没有19岁的记录。或caluse似乎工作正常,但由于某些原因,我的和条件没有根据记录应用。

    任何帮助都将不胜感激

    1 回复  |  直到 3 年前
        1
  •  1
  •   IMSoP    3 年前

    这是一个教训 运算符优先级 .

    你可能熟悉这样一种想法,在标准算术中,“1+23”得到7,而不是9,因为“23”是先计算出来的。如果我们加上括号,“(1+2)3”得到9,因为“(1+2)”是先计算出来的。

    这同样适用于带有“and”和“or”的布尔运算,除非我们加上括号,否则“and”是首先计算出来的。

    所以“(学生名如“%ae%”或学生名如“%ph%”和年龄!=19)”将首先将“学生名如“%ph%”和年龄!=19”归为一个条件;然后,它将匹配其中的行 任何一个 没错, 其中“学生名如“%ae%”为真——名字中有“ae”的学生可以是任何年龄段的学生。

    添加括号时,首先计算“or”,它将匹配其中的行 二者都 “(像“%ae%”这样的学生名或像“%ph%”这样的学生名)是真的 “年龄!=19”是正确的——无论姓名如何,19岁的人都是不允许的。

    由于这是一个容易犯的错误,我建议在混合“and”和“or”时总是加上括号,以明确意图。