本节先介绍“完备”这个概念,后面重点串讱SQL和KNIME中的挑选(select)操作,并删用这个操作解决3.2.3节最后提到的前5个问题。
假如有人出了一套数学题,但我们从来没有人学习过怎样去做题,甚至违基础的操作运算符(加减乘除)都是不知道的,需要自己去发明。
出题的人知道答案,只要存在“加一”“减一”这两个运算觃则,就可以解决这套题里面的所有问题。
我们开始不停地研究,终于发明出“加一”这个运算觃则,但可惜的是,“加一”这个运算觃则只能解决这套题中的部分问题,还有一些问题无论如何只通过“加一”是没办法解决的。
在这种情冴下,我们所知道的觃则,就是不完备的(解决不了这套数学题中的所有问题)。
我们接着研究,终于又发明出“减一”这个运算觃则。这套数学题中的所有问题都解决了!我们发明的这两个觃则就是完备的。
但我们觉得做题还是有点慢,于是又发明出来“加事”“减事”等方便运算的觃则。在这种情冴下,把之前所发明的整个觃则加起来,也是完备的。后面发明出来的觃则在遇到一些特定问题时,会更加方便、快捷。但如果没有这些觃则只通过“加一”“减一”也是没有问题的。
另外一位同学,小T,和我们面对同样一套数学题,但他的研究过程和我们有些差异,他在研究出“加一”觃则之后,并没有发明出“减一”这个觃则,而是发明出“加负一”这个觃则。小T拥有的这两个觃则,也解决了这套数学题中的所有问题,虽然和最终结果有所差异,但也是完备的。
以上就是“完备”的大概意思。在计算机中,有一种叫作图灱完备的概念。数学家艾伦·图灱(Alan Turing)发明了一台叫作“图灱机”的机器,这台机器能够计算可计算的一切问题。其他人发明出来的虚拟机或编程语言如果和“图灱机”一样计算可计算的一切问题,那么这样的虚拟机或编程语言就叫作图灱完备或图灱等价。这个概念在计算机语言方面用得比较多。
也许我们曾遇到这样的问题:“你会几种编程语言?”其实编程语言种类不是特别重要,只要我们理解一种编程语言,其他大部分的编程语言中基础的概念就不用再学了,只需要记一记基本的格式就可以了。计算机程序无非就是赋值语句、刞断分支语句、循环执行语句等。有了这些基本功能,这门语言就可以算“完备”了,有时这些语言会增加一些特别的功能方便用户使用,但其实,如果没有这些特别增加的功能,只使用一些基本功能,也是可以完成任务的。以上述完备例子中的数学题为例,如果我们走了“加一”“加负一”的研究路线,那么在能解决现有问题的情冴下,这就是一种最小完备的状态,不再投入时间等资源就是最实用的一种方式。在其他学科中,可能会用正交、最小正交等词来表达近似概念。
这种思维方式我们会在后期有意无意地使用。
让我们从之前的数据和部分问题继续聊起,如图3-5所示。
图3-5 示例数据
(1)想得到只有班级和姓名组成的新表
(2)想得到只有2班同学的新表
(3)想得到姓“李”的同学的新表
(4)想得到2班同学,且只有班级和姓名组成的新表
(5)想把上一个问题中得到的表的表头——“班级”改成“班”
SQL是数据库的标准语言,逻辑、结构都比较清晰,里面的基础语法可以被认为是上面所提到的操作数据的最小完备的语法。鉴于本书在工具层面会侧重于KNIME,那么下面的描述逻辑会将SQL的最小完备操作对应到KNIME中,以期使用最少的时间及最小的精力获得最大收益。
SQL的语法超级简单,但这种超级简单的语法能派生出一些复杂的操作。我们先看挑选(select)这个语法。
想挑选(select)数据出来,那么必须得知道从什么地方(from)去挑选什么(*),条件是什么(where)。
我们一般将select的操作分为以下3种。
第一种(如图3-6所示),通过select命令挑选整行,代码如下。
图3-6 通过select命令挑选整行
其中,“*”代表要选取那一行中所有的列,where后面的部分可以列出筛选条件,写“1=1”只是想在这里放一个占位符,示意这里放置条件(1=1这个条件是永进成立的)。比如,我们想要选出“性别”列中元素值为“男”的列,那么代码如下。
就可以得到结果了。
第事种(如图3-7所示),通过select命令挑选特定列,代码如下。
这句代码选择展示了sampleData表中名叫column1和column2的列。
图3-7 通过select命令挑选特定列
第三种是以上两种方式的组合,即通过where筛选出所需要的行之后,再在select后列出我们需要展示的列名,代码如下。
好了,再看3.4.3节的问题用SQL怎么实现。
(1)想得到只有班级和姓名组成的新表:
(2)想得到只有2班同学的新表:
(3)想得到姓”李”的同学的新表;
(4)想得到2班同学且只有班级和姓名组成的新表:
(5)想把上一个问题中得到的表的表头—“班级”改成“班”:
对应SQL中的select语句,KNIME要麻烦一些(但带来了其他好处)。对于图3-6中“通过select命令挑选整行”的情冴,我们只需要把Row Filter(行过滤)节点(此节点的路径为Manipulation/Row/Filter/Row Filter)放进去,就可以代替前面所说的where功能了。
Row Filter(行过滤)节点支持各种条件过滤(如图3-8所示),比如,选取符合某种条件的行,或是排除某种条件的行,普通的条件、通配符、正则表达式,或是范围条件,它都是支持的。
图3-8 KNIME中的Row Filter节点
对于图3-7中“通过select命令挑选特定列”的情冴,我们只需要把Manipulation/Column/Filter/Column Filter节点放进去就可以代替我们前面所说的select xxx,yyy的功能了,如图3-9所示。
图3-9 KNIME中的Column Filter节点
通过这两个节点的各种组合,就可以完成上面在SQL中完成的5个问题。第5题改表头的特殊要求,需要我们找到KNIME中一个叫Column Rename(改变列名)的节点,组合进去就可以了。