sql的语法顺序和执行顺序
SQL 是一种声明式语言
SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。SQL 语言声明的是结果集的属性,计算机会根据 SQL 所声明的内容来从数据库中挑选出符合声明的数据,而不是像传统编程思维去指示计算机如何操作。所以最关键的一点是:SQL 的语法并不按照语法顺序执行。
sql的语法顺序
一般来说sql的语法顺序是:
- SELECT [DISTINCT]
- FROM
- JOIN
- ON
- WHERE
- GROUP BY
- HAVING
- UNION
- ORDER BY
- LIMIT
sql的解析顺序
- FROM FROM后面的表标识了这条语句要查询的数据源。和一些子句如,(1.1)笛卡尔积,(1.2)ON过滤,(1.3)添加外部列,所要应用的对象。FROM过程之后会生成一个虚拟表VT1。
- 笛卡尔积 这个步骤会计算两个相关联表的笛卡尔积(CROSS JOIN) ,生成虚拟表VT1-J1。
- ON过滤 这个步骤基于虚拟表VT1-J1这一个虚拟表进行过滤,过滤出所有满足ON 谓词条件的列,生成虚拟表VT1-J2。
- 添加外部行 如果使用了外连接,保留表中的不符合ON条件的列也会被加入到VT1-J2中,作为外部行,生成虚拟表VT1-J3。
- WHERE 对VT1过程中生成的临时表进行过滤,满足where子句的列被插入到VT2表中。
- GROUP BY 这个子句会把VT2中生成的表按照GROUP BY中的列进行分组。生成VT3表。
- 聚合函数
- HAVING 这个子句对VT3表中的不同的组进行过滤,满足HAVING条件的子句被加入到VT4表中。
- SELECT 这个子句对SELECT子句中的元素进行处理,生成VT5表。
- 计算表达式 计算SELECT 子句中的表达式,生成VT5-1 。
- DISTINCT 寻找VT5-1中的重复列,并删掉,生成VT5-2 。
- TOP 从ORDER BY子句定义的结果中,筛选出符合条件的列。生成VT5-3表
- ORDER BY 从VT5-3中的表中,根据ORDER BY 子句的条件对结果进行排序,生成VC6表。
- limit m,n:从第(m+1)条开始,显示n条记录。
fixed
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。