《SQL必知必会》--高级数据过滤

第五课 高级数据过滤

先透露一下,本课就是在学习了WHERE子句基础指令后,结合AND\OR\IN\NOT四种运算符进行组合应用。

组合WHERE子句(AND+OR)

先不去看课本,我们想象一下,如果让我们来做,AND符号应该如何应用呢?

1
2
3
select c1
from t1
where c1 = 1 and c2 = 2;

看,就是这么简单。

这是从数字角度的两个相等检验的组合,那我们还能怎么做,相等和不相等和大于小于等等之间的并列组合都可以使用这一条命令的呢。具体如何组合就看我们实际需求了。

同样的道理,我们已经学会了AND运算符的使用,相同层次的OR运算符,我们是不是已经掌握了呢?

1
2
3
select c1_name, c2_state
from table1
where c1 = "US" OR c2 = "DOWN";

现在,一个问题摆到了我们面前。单独的AND运算我们会了,单独的OR运算我们也会了,但是如果既有AND又有OR该如何呢?运算顺序又是怎样的呢?

1
2
3
4
select c1_name, c2_id
from table1
where c1_name = "Joneln" and c2_id = 20140025
or c2_id = 20140035

这一条指令输出的是什么结果呢?

这一条指令其实还好理解,就是我们所看到的,先执行AND组合,再执行OR组合。

那么下面这一条呢?

1
2
3
4
select c1_name, c2_id
from table1
where c2_id = 20140035 or c2_id = 20140025
and c1_name = "Joneln"

这一条指令还是和上面一样从左到右依次执行吗?先执行OR运算在执行AND运算?事实证明,并非如此。

在大多数计算机语言中,AND操作符的优先级高于OR操作符。

此问题的解决方法就是,用括号将AND操作符两边操作条件括起来,就可以了。

1
2
3
4
select c1_name, c2_id
from table1
where c2_id = 20140035 or (c2_id = 20140025
and c1_name = "Joneln");

IN操作符

首先说明的是,在很大情况下,IN操作符完成的是与OR操作符相同的功能。

比如下面的例子

1
2
3
select c1_name, c2_state
from table1
where c2_id = 20140035 or c2_id = 20140025;
1
2
3
select c1_name, c2_state
from table1
where c2_id IN (20140035, 20140025);

虽然在功能上IN操作符可以被OR操作符取代,但是,我们还是要学习并习惯使用IN操作符,理由如下:

  • 在很多合法选项中,IN操作符的语法更清楚,更直观。
  • 在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
  • IN操作符一般比一组OR操作符执行得更快,性能更好(尤其在大型数据库中取值时)。
  • IN的最大的优点在于可以包含其他SELECT语句,能够更动态地建立WHERE子句(在第11课详细讲解)。

NOT操作符

WHERE子句的NOT操作符有且只有一个功能,就是否定其后所跟的任何条件。

1
2
3
4
select prod_country,prod_price
from products
where NOT prod_country = "USA"
order by prod_price

与IN操作符相似,NOT是不是貌似也可以用我们之前学习到的某个操作符来替代呢?没错就是不等于<>。

1
2
3
4
select prod_country,prod_price
from products
where prod_country <> "USA"
order by prod_price

那么,为什么我们还要将这些操作符,甚至单独开一章来讲它们呢?

  • AND\OR\IN\NOT操作符的关键并不在于单独的某一个操作符的使用,而在于,相互组合后,发挥的强大作用。