主要是通过replace和translate来实现
SQL> create view v_tt
2 as
3 select ename||' '||deptno as data
4 from emp;
View created.
SQL> select * from v_tt;
DATA
---------------------------------------------------
SMITH 20
ALLEN 30
WARD 30
JONES 20
MARTIN 30
BLAKE 30
CLARK 10
SCOTT 20
KING 10
TURNER 30
ADAMS 20
DATA
---------------------------------------------------
JAMES 30
FORD 20
MILLER 10
14 rows selected.
//by deptno
SQL> select * from v_tt
2 order by replace(data,replace(translate(data,'0123456789','##########'),'#'
,''),'');
DATA
---------------------------------------------------
CLARK 10
KING 10
MILLER 10
JONES 20
FORD 20
ADAMS 20
SMITH 20
SCOTT 20
WARD 30
TURNER 30
ALLEN 30
DATA
---------------------------------------------------
JAMES 30
BLAKE 30
MARTIN 30
14 rows selected.
//by name
SQL> select * from v_tt
2 order by data,replace(translate(data,'0123456789','##########'),'#','');
DATA
----------------- ......
主要方法是通过使用CASE表达式来“标记”一个值是否为NULL。这里标记有两个值,一个表示NULL,一个表示非NULL。这样,只要在ORDER BY子句中增加标记列,便可以很容易的控制空值是排在前面还是排在后面,而不会被空值所干扰。
SQL> select ename,sal,comm from emp;
ENAME SAL COMM
---------- ---------- ----------
SMITH 800
ALLEN 1600 300
WARD 1250 500
JONES 2975
MARTIN 1250 1400
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500 0
ADAMS 1100
ENAME SAL COMM
---------- ---------- ----------
JAMES 950
FORD 3000
MILLER 1300
14 rows selected.
//非空值按升序排序 空值排最后
SQL> select ename,sal,comm from
2 (
3 select ename,sal,comm,
4 case when comm is null then 0 else 1 end as is_null
5 from emp
6 ) x
7 order by is_null desc,c ......
今天复习Oracle的数据字典和控制文件。
一、数据字典
数据字典是由Oracle服务器创建和维护的一组只读的系统表,数据字典分为两大类:一类为基表,一类为数据字典视图。那么数据字典中又存有哪些信息呢?
1、数据库的逻辑结构和物理结构
2、所有数据库对象定义的信息
3、所有数据库对象的磁盘空间分配的信息
4、Oracle用户名
5、每个用户所授予的权限和角色
6、完整性约束的信息
7、列的默认值
8、审计信息
那么数据字典又是如何操作与使用呢?
数据字典主要是由Oracle服务器来使用的。Oracle服务器通过访问基表来获得诸如用户、用户对象和存储结构等方面的信息并利用这些信息进行所需的数据库的管理和维护。通常只有Oracle服务器可以修改数据库字典中的数据。
那么,哪些SQL语句可以引起Oracle服务器修改数据字典呢?
1、DDL语句:如增加或减少表空间,增加或减少用户
2、DCL语句:如授予用户权限、回收用户权限
3、某些DML语句:如引起表的磁盘存储空间的扩展的插入或修改语句。
&nbs ......
ROLLUP和CUBE语句。
Oracle的GROUP
BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP
BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。如果是GROUP BY
CUBE(A, B, C),则首先会对(A、B、C)进行GROUP
BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。
grouping_id()可以美化效果:
Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。
除本文内容外,你还可参考:
分析函数参考手册:
http://xsb.itpub.net/post/419/33028
分析函数使用例子介绍:
http://xsb.itpub.net/post/419/44634
SQL> create table t as select * from dba_indexes;
表已创建。
SQL> select index_type, status, count(*) from t group by index_type, status;
INDEX_TYPE STATUS COUNT(*)
--------------------------- -------- ----------
LOB VALID 51
NORMAL N/A 25
NORMAL VALID 479
CLUSTER VALID 11
下面来看看ROLLUP和CUBE语句的执行结果。
SQL> select index_type, status, count(*) from t group by rol ......
本文介绍了在Oracle数据库中,对日期、时间的各种操作,包括:日期时间间隔操作、日期到字符操作、字符到日期操作、trunk / ROUND函数的使用、毫秒级的数据类型等。
1.日期时间间隔操作
当前时间减去7分钟的时间
select sysdate,sysdate - interval '7' MINUTE from dual
当前时间减去7小时的时间
select sysdate - interval '7' hour from dual
当前时间减去7天的时间
select sysdate - interval '7' day from dual
当前时间减去7月的时间
select sysdate,sysdate - interval '7' month from dual
当前时间减去7年的时间
select sysdate,sysdate - interval '7' year from dual
时间间隔乘以一个数字
select sysdate,sysdate - 8 *interval '2' hour from dual
2.日期到字符操作
select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual
select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual
select sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss') from dual
select sysdate,to_char(sysdate,'yyyy-mm iw-d hh:mi:ss') from dual
3. 字符到日期操作
......
以前还专门小总结过一下ORACLE中关于NULL的一些问题,碰巧今天在看书的过程中又看到了另外一个以前没发现的需要注意的地方,那就是在not in中使用null的问题。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select deptno
2 from dept
3 where deptno in (10,50,null);
DEPTNO
----------
10
//看到使用in的时候即便有null 也是正常的 下面看一下not in
SQL> select deptno
2 from dept
......