生死看淡,不服就干嘛( 二 )


生死看淡,不服就干嘛

文章插图
 
【生死看淡,不服就干嘛】删除重复记录:
 
最高效的删除重复记录方法 ( 因为使用了ROWID)例子:
 
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
生死看淡,不服就干嘛

文章插图
 
用TRUNCATE替代DELETE: 
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息 。当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短 。(TRUNCATE只在删除全表适 用,TRUNCATE是DDL不是DML) 。
 
使用表的别名
当在SQL语句中有连接多个表的时候,请使用表的别名并把别名的前缀置于每个列名上,这样就可以减少解析的时间并减少那些有列名歧义引起的语法错误 。
使用用户自定义变量
用户自定义变量是一个用来存储内容的临时容器,在 MySQL 连接的整个过程都存在,可以使用 set 和 select 来定义:
set @columnName :=(select column_name from tableName where id =column_id);set @columnId :=888;
生死看淡,不服就干嘛

文章插图
 
之后可以在任何使用表达式的地方使用自定义变量:
Select * from tableName where column_id >@columnId and column_name = @columnName;
生死看淡,不服就干嘛

文章插图
 
在下列情况下不能使用自定义变量:
a) 使用自定义变量的查询,不能使用缓
b) 不能在使用常量或标识符的地方使用自定义变量,如表名,列名,limit 子句
c) 自定义变量只在一个连接中有效,不能作为连接间的通信
d) MySQL优化器在某些场景下会将这些变量优化掉,会导致不同的预期结果
1:自定义变量可以在给变量赋值的同时使用这个变量,如java的a =a+1 操作 。
如实现行号的功能
set @rownum:=0;select @rownum:=@rownum+1 as num, resource as ip from tableName limit 10;
生死看淡,不服就干嘛

文章插图
 
 
2:避免重复查询刚刚更新过的数据
 
如果想在更新行的同时又希望获取该行的信息,则可以使用自定义变量实现
方式一:update 之后,在 通过 select 查询
 
update tableName set userName =’Herbert’ where column_id =1;select userName from tableName where column_id =1;
生死看淡,不服就干嘛

文章插图
 
方式二:定义自定义变量