SQL,Mysql疑难杂症

1.sql中的表 就是一种 List(list(map))的数据结构

2.表就是数据

3.那么数据 有 3种功能:

	1.数据作为 条件比较的 数据 (这时 数据只能是 单列的,这里也是 子查询的结果 如果是单列才可 将数据作为 比较的数据)
	  简单来说就是单列table
	
	2.作 查询表 加在 from + 数据/ 增删改 table(这里 单列,多列都可以)

	3.数据 作为 数据容量不变 只是 拆分了的 条件

4.sql的每一步都是 都是在 不断的 创建 虚拟表的 过程中的
包括表连接,过滤条件后的,…

5.创建临时表,可以是表连接,以及过滤,每一次过滤,都会生成一张临时虚拟table,还有 数据的拆分(即多个子数据,分组)

6.简单来说,我们写sql,就是在 表连接,以及 在过滤表,以及在拆分表(当然这过程,一直在形成新的临时表,新的临时表也可作表连接,和表过滤条件,和表拆分条件)

7.在简单点来说,由上面的 数据的功能类型分为大体的3种,而我们的 sql就是对 数据的操作,数据的连接以及union,数据的过滤,形成新的数据,数据的拆分,然后新的数据又可以用来 连接 过滤 拆分,就是数据的 增多,和减少,以及拆分(容量不变,数据的个数变多)

8.所以任何操作 就是 数据的增加,和过滤,和拆分不变,也就是说 除了 数据连接(表连接)和 union(注意两表union字段相同),其他都是 数据过滤,和 数据拆分

9.数据 + 数据的变化过程 + 数据在这个过程中起到的3个作用,就是sql的体现

10.对于关键字来说,就是过滤关键字,连接关键字,以及拆分关键字 这三大类,考虑的时候以 这三大类来考虑即可

11.我们在分析 sql的过程(子查询不算,子查询就算一个sql过程,只是这个sql过程结束了的 数据,给 另一个 sql 的过程用,这也是 符合 上面说的 sql的本质 就是数据的变化过程,以及数据在这变化过程中体现的3种作用)

	1 FROM 执行笛卡尔积(数据的连接,此时数据的作用是作为 from)
	  笛卡尔积(交叉联接),生成虚拟表VT1,获取不同数据源的数据集。
	
	  FROM子句执行顺序为从后往前、从右到左,FROM 子句中写在最
	  后的表(基础表 driving table)将被最先处理,即最后的表为驱动表,
	  当FROM 子句中包含多个表的情况下,我们需要选择数据最少的表作为基础表。
	
	2 ON 应用ON过滤器(数据的过滤,此时数据的作用是作为 过滤条件)
	  对虚拟表VT1 应用ON筛选器,ON 中的逻辑表达式将应用到虚拟表 VT1中的各个行,
	  筛选出满足ON 逻辑表达式的行,生成虚拟表 VT2 。
	
	3 JOIN 添加外部行(数据的连接,数据的作用是作为连接条件)
	  如果指定了OUTER JOIN保留表中未找到匹配的行将作为外部行添加到虚拟表 VT2,生成虚拟表 VT3。保留表如下:
	
	  LEFT OUTER JOIN把左表记为保留表
	  RIGHT OUTER JOIN把右表记为保留表
	  FULL OUTER JOIN把左右表都作为保留表
	  在虚拟表 VT2表的基础上添加保留表中被过滤条件过滤掉的数据,非保留表中的数据被赋予NULL值,最后生成虚拟表 VT3。
	
	4 WHERE 应用WEHRE过滤器(数据的过滤,数据的作用是作过滤条件)
	  对虚拟表 VT3应用WHERE筛选器。根据指定的条件对数据进行筛选,并把满足的数据插入虚拟表 VT4。
	
	  由于数据还没有分组,因此现在还不能在WHERE过滤器中使用聚合函数对分组统计的过滤。
	  同时,由于还没有进行列的选取操作,因此在SELECT中使用列的别名也是不被允许的。
	  
	5 GROUP BY 分组(数据拆分,用作拆分条件)
	  按GROUP BY子句中的列/列表将虚拟表 VT4中的行唯一的值组合成为一组,生成虚拟表VT5。
	  如果应用了GROUP BY,那么后面的所有步骤都只能得到的虚拟表VT5的列或者是聚合函数(count、sum、avg等)。
	  原因在于最终的结果集中只为每个组包含一行。
	
	  同时,从这一步开始,后面的语句中都可以使用SELECT中的别名。
	
	6 AGG_FUNC 计算聚合函数
	  计算 max 等聚合函数。SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。常用的 Aggregate 函数包涵以下几种:
	
	7 WITH 应用ROLLUP或CUBE
	  对虚拟表 VT5应用ROLLUP或CUBE选项,生成虚拟表 VT6。
	
	  CUBE 和 ROLLUP 区别如下:
	
	  CUBE 生成的结果数据集显示了所选列中值的所有组合的聚合。
	  ROLLUP 生成的结果数据集显示了所选列中值的某一层次结构的聚合。
	
	8 HAVING 应用HAVING过滤器(数据的过滤,专对对 每个 子数据为基础 分别过滤)
	  对虚拟表VT6应用HAVING筛选器。根据指定的条件对数据进行筛选,并把满足的数据插入虚拟表VT7。
	
	  HAVING 语句在SQL中的主要作用与WHERE语句作用是相同的,但是HAVING是过滤聚合值,
	  在 SQL 中增加 HAVING 子句原因就是,WHERE 关键字无法与聚合函数一起使用,HAVING子句主要和GROUP BY子句配合使用。
	
	9 SELECT 选出指定列
	  将虚拟表 VT7中的在SELECT中出现的列筛选出来,并对字段进行处理,计算SELECT子句中的表达式,产生虚拟表 VT8。
	
	10 DISTINCT 行去重(过滤)
	  将重复的行从虚拟表 VT8中移除,产生虚拟表 VT9。DISTINCT用来删除重复行,只保留唯一的。
	
	11 ORDER BY 排列(过滤)
	  将虚拟表 VT9中的行按ORDER BY 子句中的列/列表排序,生成游标 VC10 ,注意不是虚拟表。
	  因此使用 ORDER BY 子句查询不能应用于表达式。同时,ORDER BY子句的执行顺序为从左到右排序,是非常消耗资源的。
	
	12 LIMIT/OFFSET 指定返回行(过滤)
	  从VC10的开始处选择指定数量行,生成虚拟表 VT11,并返回调用者。

12.分组的本质,就是数据的拆分,目的就是为了 统计大数据中,各个小数据的统计(分组后,就以 一个组为 一个数据这个数据就是 普通的数据,然后分组后,我们有多个 子数据,即每次操作都是以 子数据为基础的,例如全表也是一个组,我们每次操作都是以 这个组为基础的)

	1.对分组来说,考虑每个子数据即可
	
	2.分组后,数据字段只能用作 统计作用,因为组有多个,和组只有一个的不同
	  多个组,就得有多个组的 返回结果,都是mysql不支持,mysql的结果都只能是一个组的

	3.分组 没有没有忽略 null的 只有 count(*)
	
	4.每个组的查询结果 只有 1行,这样才能符合mysql的,主要是统计字段
	
	5.多个组,也可以有 统一的结果,在 group by 字段1,.. 后加上 with rollup 或者 with cube
	  这样,在原来的 分组的结果集后面,还会加上对 多个组一起的一个统计结果行

13.distinct 过滤关键字细节(不忽略null,distinct不是聚合函数)

1.基本用法

distinct用于筛选唯一值,可以作用于单个列或者多个列。作用于单个列时有以下几个注意点:

1.distinct必须放在所有指定字段名之前,不允许

select <name1>, distinct <name2> from ...

2.distinct作用于多个列,结果按照指定的多个列的值得组合进行筛选

2.和count一起用

1.可以使用

select count(distinct name) from ....

2.因为count是不能统计多个字段的,因此下面的语句不能执行:

select count(distinct name1, name2) from ....

3.应该写成嵌套查询的形式:

select count(*) from (select distinct name1, name2 from...)

3.和order by一起用

1.distinct的执行顺序在order by 之前,因此两者同时出现时,先执行distinct产生只包含唯一值的临时表,再对临时表使用order by。

2.如果order by中的字段和distinct后面的字段名不相同,则语句会出错,因为结果只含有distinct后的唯一字段的值,应在distinct后的字段名中包含order by的字段。

14.连接查询 优于 子查询的原因

表关联 可以 利用到 2张表的索引(不是说的连接条件)
而子查询不行,只有在子查询,有外表 和 内表,只有一张表 用索引,先查的用索引,即内表先用,内表并不是说 ()里面的表,in() 里面的是内表因为先查,exsits() 不是内表是外表,因为后查询

15.关键字真正要讨论的就是过滤关键字,在不同的阶段,有不同的过滤关键字

16.in 要谨慎使用,in() 不多时,最好用 = or =

17.条件过滤关键字使用的时候,得考虑好选哪个,例如 子查询的结果集只有 一个,那么 用 = ,如果是 多个,那么 用 关键字 in

18.exist 和 in 的区别
简单来说,就是小表驱动大表,详细文章exist 和 in的使用和区别

以及in 不能随便用,能用 = 用=,因为 in子查询,()内的子查询要 查 n次

19.除了原始的表以外,任何临时表的产生,都得通过select,只有select 之后,才能产生临时表,然后才能操作临时表

20.聚合函数忽略null , count(1)和count()基本没区别,count(列)忽略null,count()和count(1)不忽略null

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值