Discuss / SQL / 打卡

打卡

Topic source

如果不加括号,条件运算按照NOTANDOR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号可以改变优先级。

毛线qwe

#2 Created at ... [Delete] [Delete and Lock User]

可是最后一个练习,

SELECT * FROM students WHERE score < 80 OR score > 90 AND gender = 'M';

不加括号,结果是

id    class_id    name    gender    score
4    1                小米     F              73
6    2                小兵     M             55

似乎只执行了最前面的命令,这是为什么?

汤才进

#3 Created at ... [Delete] [Delete and Lock User]

后边数据里没有符合条件的啊

如果不加括号,条件运算按照NOTANDOR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号可以改变优先级。

SELECT * FROM students WHERE score < 80 OR score > 90 AND gender = 'M';
等价于
SELECT * FROM students WHERE score < 80 OR (score > 90 AND gender = 'M');

🌙

#5 Created at ... [Delete] [Delete and Lock User]

感谢,学到了

清竹.

#6 Created at ... [Delete] [Delete and Lock User]

回复二楼:

如果你学过C/C++,应该明白||和&&都具有“短路效应”。

也就是删掉括号后的代码可以写成如下这个格式:

SELECT * FROM students WHERE score < 80 OR (score > 90 AND gender = 'M');

在OR后面的一串先执行,执行完成后后面的一串再与OR前面的score < 80运算,优先运算OR左边的表达式,若左边的表达式成立,则OR右边的表达式将不会再执行。

同理,若没有记录满足OR左边表达式,则筛选满足OR右边表达式的记录。

这就类似于C/C++中的||

k

#7 Created at ... [Delete] [Delete and Lock User]

楼上的青竹同学:
    你说的不对哦,不是短路操作。OR是筛选两个条件。都是会执行的。只不过后面的条件,没有对应的项。表里没有分数大于90的男生。

落.

#8 Created at ... [Delete] [Delete and Lock User]

我觉得是因为按照优先级来的,AND优先级最高,会优先判断(score > 90 AND gender = 'M'), 判断后发现不存在,接着判断OR,因为OR是只要有一边存在就会输出结果,所以最后输出的结果就是左边的score<80

倒吃甘蔗

#9 Created at ... [Delete] [Delete and Lock User]

7楼的清竹同学说的有点问题:“左边的表达式成立,则OR右边的表达式将不会再执行”这句话不对,OR是两边的表达式都会执行

倒吃甘蔗

#10 Created at ... [Delete] [Delete and Lock User]

sorry是6楼


  • 1

Reply