这个子句对VT3表中的不同的组进行过滤,只作用于分组后的数据,满足HAVING条件的子句被加入到VT4表中。
- mysql> SELECT
- -> *
- -> FROM
- -> table1 AS a
- -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid
- -> WHERE
- -> a. NAME = 'mike'
- -> GROUP BY
- -> a.uid
- -> HAVING
- -> count(b.oid) < 2;
- +-----+------+------+------+
- | uid | name | oid | uid |
- +-----+------+------+------+
- | ccc | mike | 6 | ccc |
- | ddd | mike | NULL | NULL |
- +-----+------+------+------+
- 2 rows in set (0.00 sec)
5、SELECT
这个子句对SELECT子句中的元素进行处理,生成VT5表。
(5-J1)计算表达式 计算SELECT 子句中的表达式,生成VT5-J1
(5-J2)DISTINCT
寻找VT5-1中的重复列,并删掉,生成VT5-J2
如果在查询中指定了DISTINCT子句,则会创建一张内存临时表(如果内存放不下,就需要存放在硬盘了)。这张临时表的表结构和上一步产生的虚拟表VT5是一样的,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来除重复数据。
- mysql> SELECT
- -> a.uid,
- -> count(b.oid) AS total
- -> FROM
- -> table1 AS a
- -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid
- -> WHERE
- -> a. NAME = 'mike'
- -> GROUP BY
- -> a.uid
- -> HAVING
- -> count(b.oid) < 2;
- +-----+-------+
- | uid | total |
- +-----+-------+
- | ccc | 1 |
- | ddd | 0 |
- +-----+-------+
- 2 rows in set (0.00 sec)
6、ORDER BY
从VT5-J2中的表中,根据ORDER BY 子句的条件对结果进行排序,生成VT6表。
注意:
唯一可使用SELECT中别名的地方;
- mysql> SELECT
- -> a.uid,
- -> count(b.oid) AS total
- -> FROM
- -> table1 AS a
- -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid
- -> WHERE
- -> a. NAME = 'mike'
- -> GROUP BY
- -> a.uid
- -> HAVING
- -> count(b.oid) < 2
- -> ORDER BY
- -> total DESC;
- +-----+-------+
- | uid | total |
- +-----+-------+
- | ccc | 1 |
- | ddd | 0 |
- +-----+-------+
- 2 rows in set (0.00 sec)
7、LIMIT
LIMIT子句从上一步得到的VT6虚拟表中选出从指定位置开始的指定行数据。
注意:
offset和rows的正负带来的影响;
当偏移量很大时效率是很低的,可以这么做:
采用子查询的方式优化,在子查询里先从索引获取到最大id,然后倒序排,再取N行结果集 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|