SQL 部分易混淆知识

第一: 比较truncatedropdelete命令

truncatedelete的区别
truncate table
命令将快速删除数据表中的所有记录,但保留数据表结构。这种快速删除与delete from 数据表的删除全部数据表记录不一样,delete命令删除的数据将存储在系统回滚段中,需要的时候,数据可以回滚恢复,而truncate命令删除的数据 是不可以恢复的

可以做一个测试

建一个带有自增字段的表,加入100万数据
然后分别用TRUNCATEDELETE删除全部数据
然后再向表里插入一条数据

最直观是:
1.TRUNCATE TABLE
是非常快的
2.TRUNCATE
之后的自增字段从头开始计数了,而DELETE的仍保留原来的最大数值

………………………………………………………………………………………………
注意:这里说的delete是指不带where子句的delete语句
相同点
truncate
和不带where子句的delete, 以及drop都会删除表内的数据

不同点:
1. truncate
delete只删除数据不删除表的结构(定义)
drop
语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.
2.delete
语句是dml,这个操作会放到rollback segement,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.

truncate,dropddl, 操作立即生效,原数据不放到rollback segment,不能回滚. 操作不触发trigger.
3.delete
语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate
语句缺省情况下见空间释放到 minextentsextent,除非使用reuse storage;   truncate会将高水线复位(回到最开始).
4.
速度,一般来说: drop>; truncate >; delete
5.
安全性:小心使用drop truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据

第二: DMLDCLDDL分别指的是哪些(selectDML语句,truncateDDL语句)

DML----Data Manipulation Language 数据操纵语言
如insert,delete,update,select(插入、删除、修改、检索)

DDL----Data Definition Language 数据库定义语言 
如 create procedure之类

DCL----Data Control Language 数据库控制语言
如grant,deny,revoke等,只有管理员才有这样的权限。

第三:existsin的区别
EXISTS检查是否有结果,判断是否有记录,返回的是一个布尔型(TRUE/FALSE)。
IN是对结果值进行比较,判断一个字段是否存在于几个值的范围中,所以 EXISTS 比 IN 快。
主要区别是:
exists主要用于片面的,有满足一个条件的即可,in主要用于具体的集合操作,有多少满足条件.
exists是判断是否存在这样的记录,in是判断某个字段是否在指定的某个范围内,exists快一些。
in适合内外表都很大的情况,exists适合外表结果集很小的情况。
  
第四:关联子查询和非关联子查询的区别

第五:排它锁与共享锁的区别
共享锁【S锁】又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,
直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。排他锁【X锁】又称写锁。若事务
T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放
A上的锁之前不能再读取和修改A。

第六:havingwhere的区别
HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE子句搜索条件在进行分
组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但HAVING 可以包含聚合
函数。HAVING 子句可以引用选择列表中出现的任意项。
对于可以在分组操作之前或之后应用的搜索条件,在 WHERE 子句中指定它们更有效。这样可以减少必须分组的行数。应当在 
HAVING子句中指定的搜索条件只是那些必须在执行分组操作之后应用的搜索条件。
查询优化器可处理这些条件中的大多数。如果查询优化器确定 HAVING搜索条件可以在分组操作之前应用,那么它就会在分组之前
应用。查询优化器可能无法识别所有可以在分组操作之前应用的 HAVING搜索条件。建议将所有这些搜索条件放在 WHERE 子句中
而不是 HAVING 子句中。如果 HAVING 中包含多个条件,那么这些条件将通过 AND、OR 或 NOT 组合在一起。

第七:说出几个常用的组函数	
 
 

第八:where、order by group by的执行顺序
1.执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by分组,返回第2个结果集。
3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
4.针对第3个结集执行having xx进行筛选,返回第4个结果集。
5.针对第4个结果集排序

第九:

index

的优点和缺点


优点:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的
最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子
句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,
提高系统的性能。
缺点: 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间
之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删
除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

 


 



 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值