SQL

来源:互联网 发布:饥荒攻略秘籍软件 编辑:程序博客网 时间:2024/05/22 16:47

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 avggroup by 后)(10)ORDER BY <order_by_list>每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。********************************wherehaving的执行级别不同在查询过程中聚合语句(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 

索引

使用规则:

  1. 不要索引数据量不大的表,对于小表来讲,表扫描的成本并不高。
  2. 不要设置过多的索引,在没有聚集索引的表中,最大可以设置249个非聚集索引,过多的索引首先会带来更大的磁盘空间,而且在数据发生修改时,对索引的维护是特别消耗性能的。
  3. 合理应用复合索引,有某些情况下可以考虑创建包含所有输出列的覆盖索引。
  4. 对经常使用范围查询的字段,可能考虑聚集索引。
  5. 避免对不常用的列,逻辑性列,大字段列创建索引。

注意,以下情况索引会失效:

  • 如果条件中有or,
  • 对于多列索引,不是使用的第一部分,则不会使用索引
  • like查询是以%开头
  • 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
  • 如果mysql估计使用全表扫描要比使用索引快,则不使用索引
  • 列表内容
原创粉丝点击