让我们再次回归主题,那就是帮李乔丹找到他心仪的约会对象。相信细心的你早就发现了,虽然在例句(1)中,我们将“Grace”当成了过滤条件,但实际却返回了两位女孩的信息:
这可不能怨我哦,要知道在一般情况下,我并不会帮你区分过滤条件的大小写,字母的大小写在我眼里一视同仁。无论你使用的是“GraCe”、“GRACE”还是“grace”来充当过滤条件,都将实现同例句(1)一样的过滤效果。除非你事先明确告知,让我可以在语句中找到对应的指令。
看来我们的MagicSQL并不喜欢多管闲事。可是李乔丹的问题又要解决,因为在两位名叫Grace的女孩当中,只有一位是他迫切想要见到的“苏菲·玛索”。那么,这该怎么办呢?没关系,Zoe已经给了他提示。她在邮件中提过,只有大写的GRACE才酷似苏菲·玛索!
既然如此,那你最好在语句中加入一个关键词——BINARY,这样我就会单独返回你要的约会对象信息了。事实上,BINARY就是严格按照字母大小写来过滤的指令。
是的,没错!此时在MySQL眼中,小写的“grace”也将成为被过滤掉的对象,因为它与“GRACE”在字母大小写上不相同。BINARY会让MySQL更加严格地执行过滤操作,这就好比从四舍五入变成了说一不二,从一视同仁变成了严格区分。
好了,主要内容介绍完毕。不过在结束之前,我们还有一些内容需要向同学们事先说明。在前面的内容中,我们接触的大部分检索语句都属于类型一:
大家可以看到,由于这条检索语句并不涉及数据的过滤,所以它的直接操作对象是整张Contact表。但如果我们使用了WHERE从句,例如:
那么这条检索语句的直接操作对象就不再是整张Contact表了,而是过滤后的保留行。原因想必大家都很清楚,因为MySQL执行WHERE会先于执行SELECT。事实上,MySQL会根据这些保留行生成一张虚拟表,然后将它作为检索语句的直接操作对象。
其实能够像WHERE这样产生虚拟表的操作还有很多,大家将在以后的学习中陆续遇到。借此机会,我们向大家抛出对检索语句的理解。
1. 虽然在有些情况下,一条检索语句的直接操作对象是一张完整的表,但是在更多时候,检索语句的直接操作对象是一张经整理和编排的虚拟表。因此,简单地将表视为检索语句的操作对象还不够,更加准确和深刻的理解是,我们的操作对象是表中的数据。
2. SQL是一种建立在“眼见为实”基础上的操作,因此事先了解操作对象非常重要(查看它)。举例来讲,“SELECT age FROM Contact WHERE name='Grace';”这条语句表示检索出age列含有的信息,但它并非表示检索出age列含有的全部信息。因为关键词SELECT的直接操作对象不再是整张Contact表,而是经过滤筛选后生成的一张虚拟表。
3. 大部分检索语句的主要框架都是基础的“SELECT...FROM...”。所以当我们在分析某条语句的结构时,就可以事先对它进行简化。例如,“SELECT * FROM Contact WHERE name='Grace'”可以被简化为“SELECT * FROM过滤后的虚拟表”。
由于大家目前接触到的SQL语句还比较基础,所以可能对以上理解感触不深。这当然没有关系,因为我们会在后续的学习中对这些内容进行反复论证。事实上,这些内容对我们解读需求和分析陌生语句都很有帮助。学习知识点和操作方法固然重要,但思考问题的方式同样重要。