先上个简单的SQL语句(Mysql):
“SELECT c1,c1+3 as c2,c3 aliasC3,”字符串” FROM table1 WHERE id>1 and id<100”
从表table1中查询id大于1小于100的记录。
查询的字段为列c1,根据c1计算得到的c2,别名为aliasC3的c3,还有一个匿名字段 字符串常量”字符串”.
这条简单的SELECT查询语句可以分为三部分:
1.查询的输出字段(紧接关键字SELECT之后)
2.查询的表(紧接关键字FROM之后)
3.过滤条件(紧接关键字WHERE之后)
用程序要如何解析这条语句呢?
首先,我们遇到了关键字“SELECT”,之后遇到一个空格,这时我们开始记录输出字段的内容,然后我们遇到了关键字”FROM”,记录查询表的内容,直到遇到关键字”WHERE”,这后面就是过滤条件,记录它。
这样我们就得到了这条语句的三个部分。但是这还远远不够,下面来看字段列表部分:
字段之间用逗号分隔,单个字段的内容可能(只是列名,使用as指定了别名的列,列需要使用表达式计算,常量)。
单纯的列名很简单,使用了别名的列,有as关键字也很好处理,as关键字之前为表达式(我们将列名看作变量),之后为别名。
没有as关键字的别名表达式,在读取完一个表达式后遇到空白,空白后是一个有效的字段名称,之后再没有其他内容。
最后一个字符串常量的匿名字段,没有指定别名,所以它是一个常量表达式。
根据以上规则,我们姑且将as当作“别名运算符”,这样就可以将所有输出列的内容抽象为一个“表达