Oracle中想要实现这一功能其实并不是很难啊,呵,下面看看我做的。
SQL> create table demo ( 2 aa int, 3 bb int, 4 cc int 5 ); Table created SQL> insert into demo values (1, 1, 1); SQL> insert into demo values (1, 1, 1); SQL> insert into demo values (1, 1, 1); SQL> insert into demo values (2, 2, 2); SQL> insert into demo values (2, 2, 2); SQL> insert into demo values (3, 3, 3); SQL> select * from demo; AA BB CC --- --- --- 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 6 rows selected SQL> delete from demo where rowid not in ( 2 select max(rowid) from demo group by aa,bb,cc ); 3 rows deleted SQL> select * from demo; AA BB CC --- --- --- 1 1 1 2 2 2 3 3 3 |
原来没注意到Oracle有这东西,今天才开始用起来,早知道原来的项目中就好用了,可惜。。。
还是用SCOTT登录吧,找个简单的东西实践一下OK了。
1、intersect运算,返回查询结果中相同的部分(找EMP和SALGRADE表中SAL列相同记录)
2、minus运算,返回查询结果中不相同的部分(找EMP和SALGRADE表中SAL列不相同记录) Read the rest of this entry »
这是个经典SQL,呵,很久没写了,今天群里有人提出来,让我突然想到,所以写在这里方便查看。
以SCOTT用户登录Oracle,以它的EMP表为例子吧。
1、使用rownum为记录排名
SQL> select * from ( 2 select * from emp order by sal desc ) 3 where rownum <= 10; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7839 KING PRESIDENT 1981/11/17 5000.00 10 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 10 rows selected SQL> select ename, sal, rn from ( 2 select ename, sal, rownum rn 3 from emp where rownum <= 10 order by sal desc ) 4 where rn > 5 and rn < 8; ENAME SAL RN ---------- --------- ---------- BLAKE 2850.00 6 CLARK 2450.00 7 |
2、使用分析函数来为记录排名 Read the rest of this entry »
1、DECODE(exp,s1,r1,s2,r2..s,r[,def]) 可以把它理解成一个增强型的if else,只不过它并不通过多行语句,而是在一个函数内实现if else的功能。
exp做为初始参数。s做为对比值,相同则返回r,如果s有多个,则持续遍历所有s,直到某个条件为真为止,否则返回默认值def(如果指定了的话),如果没有默认值,并且前面的对比也都没有为真,则返回空。
SQL> select decode('a', 'a1', 'true', 'false') from dual; DECOD ----- false |
2、GREATEST(n1,n2,…n) 返回序列中的最大值
SQL> select greatest(4, 65, 5, 34, 71) from dual; GREATEST(4,65,5,34,71) ---------------------- 71 |
3、LEAST(n1,n2….n) 返回序列中的最小值 Read the rest of this entry »
转换函数将指定字符从一种类型转换为另一种,通常这类函数遵循如下惯例:函数名称后面跟着待转换类型以及输出类型。
1、TO_CHAR()
转换字符->字符TO_CHAR(c):将nchar、nvarchar2、clob、nclob类型转换为char类型;
SQL> select to_char('AABBCC') from dual; TO_CHA ------ AABBCC |
转换时间->字符TO_CHAR(d[,fmt]):将指定的时间(data、
timestamp、timestamp with time zone)按照指定格式转换为varchar2类型;
SQL> select to_char(sysdate, 'yy-mm-dd') from dual; TO_CHAR( -------- 08-10-01 |
转换数值->字符TO_CHAR(n[,fmt]):将指定数值n按照指定格式fmt转换为varchar2类型并返回; Read the rest of this entry »