mysql笔记之查询处理

来源:互联网 发布:python 分析网页 编辑:程序博客网 时间:2024/06/05 07:33

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语句 

   

0 0
原创粉丝点击