看个实例

SELECT  Amount,PackageNum,Amount*PackageNum as tes FROM  StudentAccount order by tes desc ;

SELECT  Amount,PackageNum,Amount*PackageNum as tes FROM  StudentAccount order by ReAmount desc ;

SELECT  Amount,PackageNum,Amount*PackageNum as tes FROM  StudentAccount order by 1 desc ;

SELECT  Amount,PackageNum,Amount*PackageNum as tes FROM  StudentAccount order by 4 desc ;

思考下,这四个sql执行结果如何呢?

1.SELECT  Amount,PackageNum,Amount*PackageNum as tes FROM  StudentAccount order by tes desc ;
//第一个sql执行成功,结果是按照tes字段进行的排序

2.SELECT  Amount,PackageNum,Amount*PackageNum as tes FROM  StudentAccount order by ReAmount desc ;
//第二个sql执行成功,结果是按照ReAmount字段进行的排序(前提是表中有这个字段)

3.SELECT  Amount,PackageNum,Amount*PackageNum as tes FROM  StudentAccount order by 1 desc ;
//第三个sql执行成功,结果是按照第一个字段amount进行的排序

4.SELECT  Amount,PackageNum,Amount*PackageNum as tes FROM  StudentAccount order by 4 desc ;
//第四个sql执行失败,结果是不存在第4列-->Unknown column '4' in 'order clause'

这是不是说明了 order by 中的列是建立在select的字段上进行的,且select中隐藏的字段也是可以参与orderby 的

引入正文

  1. SQL 是一种声明式语言

SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。sql的执行引擎会根据你声明的数据结果去获取对应的数据

  1. SQL 的语法并不按照语法顺序执行

SQL 语句的语法顺序是:

SELECT[DISTINCT]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY

执行顺序

FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY

注意:

并非所有的数据库对 SQL 语句使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不会按照上面第二点中所说的方式执行。