SQL查询
这里看到书上讲述SQL的查询处理,在SQL中查询是通过select语句以及一些辅助的子句来实现需要的输出,这里使用的是mysql,首先,要理解物理表和虚拟表的区别,物理表就是存储在文件系统上的一个或者多个文件,按照相应的存储数据结构将每一行的数据存储,虚拟表是我们在物理表的基础上构建出来的,可能是全部的表结构,也可能是表中的部分字段或者部分行,甚至可能是表中某些字段经过某种运算之后的结果。但是SQL语言不像C/C++/JAVA这类语言一样,它们的主要区别在于SQL给你一个需求,不关心它是怎么实现的,真正的实现由数据库完成,当然不同的数据库可能会有差别很大的实现方式,而C/C++这类的语言,我们必须一步步的实现,完成指定的功能。所以SQL的内部实现过程我们不用关心,但是对于查询请求,它的执行过程和执行顺序对我们对结果的认识有很大的影响,但是真正的执行过程需要深入数据库内部才能明白使用哪些方式(例如索引)优化,所以这里我们重点看一下查询请求每个子句的执行顺序。
标准的SQL查询语句的结果如下所示:
(8) SELECT x, xx, xxx, xxxx \
(9) DISTINCT <x, xx,...> \
(1) FROM <table1, table2, table3,...> \
(3) <join_type>JOIN<join_table> \
(2) ON <join_condition> \
(4) WHERE <where_condition> \
(5) GROUP BY <group_by_list> \
(6) WITH[CUBE | ROLLUP] \
(7) HAVING <having_condition> \
(10) ORDER BY <order_by_list> \
(11) LIMIT <limit_number> OFFSET <offset_number> ;
每个子句执行的次序已经在前面进行了标记,在一一介绍这些子句之前,我们要先明白,执行这个命令的输入是这些表名、条件(ON、WHERE和HAVING)以及一些字段名(SELECT,DISTINCT、ORDER BY、GROUP BY),其中表名标识的是物理存储的表,字段名是每一个表的字段的名称,条件是针对字段的或者该字段上执行的聚集函数的值得逻辑表达式。这些子句的每一步都是产生一个逻辑关系表。
执行流程
FROM操作
这一步的输入是多个表,在这一步是对多个关系表执行笛卡尔积操作,生成的结果是VT1,假设有3个表,t1、t2和t3,三个表分别有r1、r2、r3行&#