ITPub博客

首页 > 数据库 > Oracle > ORACLE数据库技术小发现(一)

ORACLE数据库技术小发现(一)

Oracle 作者:tang2016 时间:2013-11-04 14:38:11 0 删除 编辑

ORACLE数据库技术小发现(一)

1.DESCRIBE 

ORACLE数据库技术小发现(一) 

2.用“select name from v$database;”的name就是主机字符串;

ORACLE数据库技术小发现(一) 

3.在SQL中,DELETE语句与DROP TABLE的区别

DELETE  是有条件的删除表中的数据,如果不写条件,全表删除,而删除后,表仍然存在,仍可以对表进行操作。具体语法为DELETE FROM TABLE WHERE 条件。
同样,还有一个TRUNCATE TABLE TABLENAME语句,是全表不提交删除,也是删除数据,表仍然存在。

DROP TABLE,是从数据库中删除表。删除后,表结构不在存在,无法再对该表进行任何操作。

举个通俗的例子,比如你有一个水桶,桶里装着水。
而DELETE或者TRUNCATE,只是相当于把水倒掉,而桶仍然存在。
而DROP TABLE,则相当于把桶都扔掉了

truncate,delete,drop的异同点

注意:这里说的delete是指不带where子句的delete语句    
       
  相同点:truncate和不带where子句的delete,   以及drop都会删除表内的数据      
  不同点:      
  1.   truncate和delete只删除数据不删除表的结构(定义)       
       drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态.      
  2.   delete语句是dml,这个操作会放到rollback   segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.       
        truncate,drop是ddl,操作立即生效,原数据不放到rollback   segment中,不能回滚.   操作不触发trigger.      
  3.    delete语句不影响表所占用的extent,高水线(high   watermark)保持原位置不动,DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项;      
        drop语句显然将表所占用的空间全部释放      
        truncate语句缺省情况下将空间释放到   minextents个   extent,除非使用reuse   storage;      truncate会将高水线复位(回到最开始).      

 

但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。

DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。

TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。

    新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。

对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

    TRUNCATE TABLE 不能用于参与了索引视图的表。


  4.    速度,一般来说:   drop>   truncate   >   delete      
  5.    安全性:小心使用drop   和truncate,尤其没有备份的时候.否则哭都来不及   

  6.    DELETE可以返回被删除的记录数,而TRUNCATE TABLE返回的是0。

  7.    DELETE可以加where语句,而TRUNCATE TABLE不可加where语句。    
  使用上,想删除部分数据行用delete,注意带上where子句.   回滚段要足够大.       
  想删除表,当然用drop      
  想保留表而将所有数据删除.   如果和事务无关,用truncate即可.   如果和事务有关,或者想触发trigger,还是用delete.      
  如果是整理表内部的碎片,可以用truncate跟上reuse   stroage,再重新导入/插入数据。

4.Oracle to_char的时间数据格式转换

1)以12小时制显示时间

SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH12:MI:SS AM')FROM DUAL;

ORACLE数据库技术小发现(一) 

2)以24小时制显示时间

SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS AM')FROM DUAL;

5.DISTINCT消除重复项

SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料。 这将把所有的资料都抓出,无论资料值有无重复。在资料处理中,我们会经常碰到需要找出表格内的不同 资料值的情况。换句话说,我们需要知道这个表格/栏位内有哪些不同的值,而每个值出现的次数并不重要。这要如何达成呢?在 SQL 中,这是很容易做到的。我们只要在 SELECT 后加上一个 DISTINCT 就可以了。DISTINCT 的语法如下:

 

SELECT DISTINCT "栏位名" 

FROM "表格名"

 

举例来说,若要在以下的表格,Store_Information,找出所有不同的店名时,

 

Store_Information表格

 

store_name Sales Date

Los Angeles $1500 Jan-05-1999

San Diego $250 Jan-07-1999

Los Angeles $300 Jan-08-1999

Boston $700 Jan-08-1999

 

我们就打入,

 

SELECT DISTINCT store_name FROM Store_Information

 

结果:

 

store_name

Los Angeles

San Diego

Boston

6.“||”操作符实现字符串连接

ORACLE数据库技术小发现(一) 

7.ORACLE空值处理

NVL(expr1,expr2):如果expr1为空值转换成expr2的值;(第一个和第二个参数需要类型一致)

例如:

column name:a1 type:varchar2(10)

NVL(a1,'is null')

NVL2(expr1,expr2,expr3):如果expr1为非空值,转换成expr2;若为空值,转换成expr3;

NULLIF(expr1,expr2):将两个表达式进行比较,如果相等,则返回空值,如果不相等,则返回第一个表达式;

COALESCE(expr1,expr2.....,exprn):返回第一个非空表达式;

update 语句中将某列设置成null,列名=null

 

例如:update employees set first_name = null where ....

8.Oracle中where子句和having子句中的区别

一、聚合函数 

聚合函数有时候也叫统计函数,它们的作用通常是对一组数据的统计,比如说求最大值,最小值,总数,平均值如MAX,MIN,COUNT, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。简单举个例子:SELECT SUM(sal) FROM emp,这里的SUM作用是统计emp表中sal(工资)字段的总和,结果就是该查询只返回一个结果,即工资总和。通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。

二、where子句 

where自居仅仅用于从from子句中返回的值,from子句返回的每一行数据都会用where子句中的条件进行判断筛选。where子句中允许使用比较运算符(>,<,>=,<=,<>,!=|等)和逻辑运算符(and,or,not)。

三、having子句 

having的作用是对使用group by进行分组统计后的结果进行进一步的筛选。现在需要找到部门工资总和大于10000的部门编号

第一步:select deptno,sum(sal) from emp group by deptno;

第二步:select deptno,sum(sal) from emp group by deptno having sum(sal)>10000;

四、where子句和having子句对比

在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行,简单的理解为只有有了统计结果后我才能执行筛选啊。where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count),因为它是一句一句筛选的。HAVING子句可以让我们筛选成组后的对各组数据筛选,而WHERE子句在聚合前先筛选记录。现查询部门号不等于10的部门并且工资总和大于8000的部门编号。分析为通过where子句筛选出部门编号不为10的部门,然后在对部门工资进行统计,然后再使用having子句对统计结果进行筛选。

select deptno,sum(sal) from emp where deptno!='10' group by deptno having sum(sal) > 8000;

五、总结 

相似之处就是定义搜索条件。不同之处是where子句为单个筛选,having子句与组有关而不是与单个的行有关。

①where不能放在GROUP BY 后面

②HAVING是跟GROUP BY连在一起用的,放在GROUP BY后面,此时的作用相当于WHERE

③WHERE 后面的条件中不能有聚集函数如SUM(),AVG()等而HAVING可以

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22215693/viewspace-1116444/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-07-28