SQL 基础

DELETE、Drop和Truncate的区别

1、delete 删除表数据不删除表的结构,可进行数据回滚
truncate 删除表数据并释放空间,不可进行数据回滚
drop 删除表/数据库(包括数据和表结构)并释放空间,不可进行数据回滚
2、执行效率:DROP > TRUNCATE > DELETE
DELETE执行过程是 每次从表中删除一行,并将该操作作为事务记录保存在日志,便于回滚操作。
3、如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;
如果想删除表,当然用drop;
如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;
如果和事务有关,或者想触发trigger,还是用delete;
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

WHERE 与HAVING 的异同点

1、where针对表中的列发挥作用,查询数据;having对查询结果中的列(筛选分组聚合后的结果集)发挥作用,筛选数据。
2、where不能使用聚合函数,having中可以使用聚合函数(count、sum、avg、max、min等聚合函数)。
3、where和having的执行顺序
where 早于 group by 早于 having
where子句在聚合前先筛选记录,也就是说作用在group by 子句和having子句前,而 having子句在聚合后对组记录进行筛选

注意 NULL

聚合函数普遍会将 NULL 排除在外( COUNT 函数例外),具体如下:
1、COUNT 函数的结果根据参数的不同而不同。COUNT(*)会得到包含 NULL 的数据行数,而 COUINT(<列名>) 会得到不包含 NULL的数据行数。
SELECT COUNT(DISTINCT <列名>) 可以得到不包含 NULL 且 不重复的数据行数。
2、SUM 函数将 NULL 忽略,也可理解成视为 0。
3、AVG 函数将 NULL 忽略,即不参与分母也不参与分子。

EXISTS和IN的区别

in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。
in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。exists查询时指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
如:
A:select * from t1 a where exists (select * from t2 b where b.id = a.id)
B:select * from t1 a where a.id in (select b.id from t2 b)
对于A,用到了t2上的id索引,exists执行次数为t1.length,不缓存exists的结果集。
对于B,用到了t1上的id索引,首先执行in语句,然后将结果缓存起来,之后遍历t1表,将满足结果的加入结果集,所以执行次数为t1.length*t2.length次。
因此对t1表大t2表小的情况使用in,t2表小t1表大的情况使用exists。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。其他详见sql中exists和in的区别SQL语句中exists和in的区别

SQL基础教程《SQL基础教程》+《SQL进阶教程》学习笔记

在线SQL

posted on 2021-06-24 16:32  农夫山药  阅读(86)  评论(0编辑  收藏  举报