1. SQL语言出的子句处理是有一定顺序的,下面是个各个子句的顺序:
(7)SELECT (8)DISTINCT
(1)FROM
(3)JOIN
(2)ON
(4)WHERE
(5)GROUP BY
(6)HAVING
(9)ORDER BY
(10)LIMIT
2. 各个子句的注意事项:
FROM:
总是第一个执行,生成一个n*m*...行的笛卡尔表T1
ON:
第一个执行的限定性语句,将T1表中符合条件的部分生成一个虚拟表T2
注:SQL的逻辑表达式的值是返回一个boolean类型的值,只取返回值为true 列,但是,改boolean类型会包括,true、false、unknown,任何值跟null作比较都会返回unknown,例如 SELECT NULL==NULL,将会返回null
JOIN:
在连接类型为OUT JOIN时,向虚拟表T2中添加一部分符合要求的外部行,生成T3表,例如LEFT JOIN,会将左表为保留表,即将T1表中被过滤掉的左表中的列加入到T2表中。
WHERE:
将符合要求的数据生成一个表T4(这次删除的数据将被永久删除,后期不再使用)
注:(1)由于还未分组,所以还不能在WHERE语句中使用MIN(col)这类的统计型过滤
(2)由于还没处理SELECT语句,所以,不能使用SELECT user_id AS uid语句中的别名uid
GROUP BY:
将T4表进行分组,生成一个表T5(值为NULL的成为一组)
HAVING:
对分组条件进行过滤,生成T6表
SELECT:
T6中摘除相关的列,生成一个表T7
注:在SELECT语句中会出现SELECT user_id AS uid的语句,其中的uid别名,在以上的语句中都不能使用,因为在之前的子句执行时,该别名并未生成;在SELECT 中后句也不能其他别名,例如SELECT user_id AS uid,uid+1 AS usd在该句中uid+1 AS usd也是错误的。
DISTINCT:
对DISTINCT操作的列增加一个索引,一次来去除重复数据。
注:在使用了GROUP BY之后,再使用DISTINCT是无效的。
ORDER BY:
对T7数据进行排序,NULL值会被视为最小值,例如,在 ORDER BY uid ASC句中,NULL值会排第一位。(值为NULL的会排在一起)
LIMIT:
在子句主要用于分页,但是在大数据量的情况下,使用LIMIT 分页是很好性能的,例如,
LIMIT 10000,10语句