SQL-执行顺序
(8)SELECT (9)DISTINCT (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition> //可以后跟聚合函数(如sum avg 或group by 后)
(10)ORDER BY <order_by_list>
每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。
********************************
where和having的执行级别不同
在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查搜索询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。
having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。
关联
现有两张表,Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的:
1.INNER JOIN 产生的结果是AB的交集
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
2.LEFT [OUTER] JOIN 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
3.RIGHT [OUTER] JOIN 产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。
SELECT * FROM TableA RIGHT OUTER JOIN TableB ON TableA.name = TableB.name
图标如left join类似。
4.FULL [OUTER] JOIN 产生A和B的并集。对于没有匹配的记录,则会以null做为值。
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
5.CROSS JOIN 把表A和表B的数据进行一个N*M的组合,即笛卡尔积。如本例会产生4*4=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。
SELECT * FROM TableA CROSS JOIN TableB
索引
使用规则:
- 不要索引数据量不大的表,对于小表来讲,表扫描的成本并不高。
- 不要设置过多的索引,在没有聚集索引的表中,最大可以设置249个非聚集索引,过多的索引首先会带来更大的磁盘空间,而且在数据发生修改时,对索引的维护是特别消耗性能的。
- 合理应用复合索引,有某些情况下可以考虑创建包含所有输出列的覆盖索引。
- 对经常使用范围查询的字段,可能考虑聚集索引。
- 避免对不常用的列,逻辑性列,大字段列创建索引。
注意,以下情况索引会失效:
- 如果条件中有or,
- 对于多列索引,不是使用的第一部分,则不会使用索引
- like查询是以%开头
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
- 如果mysql估计使用全表扫描要比使用索引快,则不使用索引
- 列表内容