SQL
文章平均质量分 73
wh62592855
这个作者很懒,什么都没留下…
展开
-
ORACLE 在not in中使用null的问题
以前还专门小总结过一下ORACLE中关于NULL的一些问题,碰巧今天在看书的过程中又看到了另外一个以前没发现的需要注意的地方,那就是在not in中使用null的问题。SQL> select * from dept; DEPTNO DNAME LOC---------- -------------- ------------- 10 ACCOUNTIN原创 2009-12-02 21:46:00 · 2138 阅读 · 0 评论 -
ORACLE根据某一列的值修改另一列的值
SQL> select * from test; ID AMOUNT TYPE---------- ---------- ---------- 1 100 in 2 100 in 3 50 out 4 70 out 5原创 2009-12-08 17:19:00 · 8283 阅读 · 0 评论 -
ORACLE确定当前记录和下一条记录之间的差值
例如说吧,对DEPTNO 10中的每个员工,确定聘用他们的日期及聘用下一个员工(可能是其他部门的员工)的日期之间相差的天数。SQL> select ename,hiredate,deptno from emp order by hiredate;ENAME HIREDATE DEPTNO---------- --------------- ---------原创 2009-12-11 21:49:00 · 3722 阅读 · 0 评论 -
ORACLE确定两个日期之间的工作日数目
SQL> select ename,hiredate from emp;ENAME HIREDATE---------- ---------------SMITH 17-DEC-80ALLEN 20-FEB-81WARD 22-FEB-81JONES 02-APR-81MARTIN 28-SEP-81BLAKE 01-MAY原创 2009-12-11 19:23:00 · 2505 阅读 · 0 评论 -
ORACLE计算一年中周内个日期的次数
说白了就是计算一年中有多少个星期日,多少个星期一,多少个星期二……思路大致如下:1、生成一年内的所有日期2、设置日期格式,得到每个日期对应为星期几。3、计算周内日期分别有多少个。 SQL> with x as 2 ( 3 select level lvl from dual 4 connect by level 5 ) 6 select to_char(原创 2009-12-11 20:15:00 · 2373 阅读 · 1 评论 -
ORACLE中创建日历
先来看一下效果SQL> with x as 2 ( 3 select * from 4 ( 5 select to_char(trunc(sysdate,mm)+level-1,iw) wk, 6 to_char(trunc(sysdate,mm)+level-1,dd) dm, 7 to_number(to_char(trunc(sysdate,mm原创 2009-12-12 09:47:00 · 1126 阅读 · 0 评论 -
把结果集转置为多行
emp表中有如下数据SQL> select job,ename from emp;JOB ENAME--------- ----------CLERK SMITHSALESMAN ALLENSALESMAN WARDMANAGER JONESSALESMAN MARTINMANAGER BLAKEMANAGER CLARKANALYST SCOTT原创 2009-12-15 19:03:00 · 1185 阅读 · 0 评论 -
将结果集反向转置为一列
比如说现在有如下结果集SQL> select ename,job,sal 2 from emp 3 where deptno=10;ENAME JOB SAL---------- --------- ----------CLARK MANAGER 2450KING PRESIDENT 5000MI原创 2009-12-15 19:36:00 · 1016 阅读 · 0 评论 -
ORACLE分析函数over(partition by...)中使用case when达到多重分组的效果
以前一直没有在partition by中使用过case when,刚才试了一下,也算是个小技巧吧。SQL> select * from t1; ID---------- 1 2 1 2 3 46 rows selected.SQL> select t1.*,row_numb原创 2009-12-16 17:16:00 · 5715 阅读 · 0 评论 -
ORACLE创建横向/纵向直方图
比如说显示每个部门的职工数吧 横向直方图SQL> select deptno, 2 lpad(*,count(*),*) as cnt 3 from emp 4 group by deptno; DEPTNO CNT---------- ------------------------------ 30 ****** 20 **原创 2009-12-15 21:17:00 · 1265 阅读 · 0 评论 -
转置已分等级的结果集
要求如下,给表中的值分等级,然后把结果集转置为三列,其思想是将最高的3档列为一列,次高的3档列为一列,其余作一列。例如给EMP表中的员工按SAL分等级,结果如下所示SQL> select max(case grp when 1 then rpad(ename,6)||(||sal||) end) top_3, 2 max(case grp when 2 then rpad(en原创 2009-12-16 16:41:00 · 917 阅读 · 0 评论 -
ORACLE中确定表里哪些行是彼此互换的
创建了一个测试表v,里面有test1和test2两列,现要求出两列数据是彼此互换的行。SQL> select * from v; TEST1 TEST2---------- ---------- 20 20 10 20 20 10 30 50原创 2009-12-15 14:31:00 · 966 阅读 · 0 评论 -
ORALCE中如何使结果集中的重复值只输出一次
现有结果集如下SQL> select deptno,ename 2 from emp 3 order by deptno; DEPTNO ENAME---------- ---------- 10 CLARK 10 KING 10 MILLER 20 JONES 20 FORD 20 ADAM原创 2009-12-15 20:13:00 · 1283 阅读 · 0 评论 -
ORACLE中搜索字母数字混合的字符串
SQL> with tt as 2 ( 3 select haha string from dual union 4 select 123 from dual union 5 select haha12 from dual union 6 select haha[] from dual union 7 select 12@@ from dual unio原创 2009-12-16 16:13:00 · 1449 阅读 · 0 评论 -
使用SQL语句找到表中某列的第几名
SQL> select * from t1; ID AGE---------- ---------- 1 20 2 19 3 19 4 21 5 22 6 276 rows原创 2009-12-18 22:32:00 · 1986 阅读 · 0 评论 -
SQL中ON和WHERE条件的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下:1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为转载 2010-04-14 14:03:00 · 2129 阅读 · 0 评论 -
查询字段a的值连续三条以上相同的记录
初始表数据如下:a b c- - -1 2 31 4 51 3 62 3 31 5 72 5 81 6 91 2 31 4 51 3 6要求用SQL实现如下效果:a b c- - -1 2 31 4 51 3 61 6 91 2 31 4 51 3 6建表语句如下:create table tmp2 (a number,b number, c number);insert into tmp2 va转载 2010-04-07 16:17:00 · 2471 阅读 · 0 评论 -
ORACLE计算某个列中出现次数最多的值
如下例所示,查找deptno=20部门中sal出现次数最多的值。SQL> select sal 2 from 3 ( 4 select sal,dense_rank() over(order by cnt desc) as rnk 5 from 6 ( 7 select sal,count(*) as cnt 8 from emp 9 where deptno=原创 2009-12-08 17:08:00 · 5836 阅读 · 0 评论 -
ORACLE计算累计差
依然通过SUM OVER,只不过和累计和相比,这次加了一层select,通过row_number() over()来判定每次加的数值的符号,只有第一个数值是正号,其他的都取其相反数。SQL> select empno,ename,sal, 2 sum(case when rn=1 then sal else -sal end) over(order by sal) as running_d原创 2009-12-08 16:53:00 · 1401 阅读 · 0 评论 -
ORACLE对字母和数字混合的数据排序
主要是通过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--------------------------------原创 2009-12-02 19:33:00 · 2990 阅读 · 0 评论 -
ORACLE 在WHERE子句中引用列别名的问题
SQL> select sal,comm from emp 2 where sal<2000; SAL COMM---------- ---------- 800 1600 300 1250 500 1250 1400 1500原创 2009-12-02 19:05:00 · 3123 阅读 · 0 评论 -
在select语句中使用条件逻辑
SQL> select ename,sal from emp;ENAME SAL---------- ----------SMITH 800ALLEN 1600WARD 1250JONES 2975MARTIN 1250BLAK原创 2009-12-02 19:18:00 · 975 阅读 · 0 评论 -
ORACLE从表中随机返回n条记录
使用ORDER BY子句,ROWNUM内置函数和DBMS_RANDOM包中的内置函数VALUE来实现SQL> select * from 2 ( 3 select ename,job 4 from emp 5 order by dbms_random.value() 6 ) 7 where rownum<=5;ENAME JOB原创 2009-12-02 19:29:00 · 973 阅读 · 0 评论 -
ORACLE处理排序空值
主要方法是通过使用CASE表达式来“标记”一个值是否为NULL。这里标记有两个值,一个表示NULL,一个表示非NULL。这样,只要在ORDER BY子句中增加标记列,便可以很容易的控制空值是排在前面还是排在后面,而不会被空值所干扰。SQL> select ename,sal,comm from emp;ENAME SAL COMM--------原创 2009-12-02 20:10:00 · 2925 阅读 · 1 评论 -
ORACLE遍历字符串
SQL> select * from t10; ID---------- 1 2 3 4 5 6 7 8 9 1010 rows selected.SQL> select substr(e.ename,iter.id,1)原创 2009-12-06 12:00:00 · 4121 阅读 · 0 评论 -
ORACLE中判别字符串是不是字母数字型的
SQL> create view V 2 as 3 select ename as data 4 from emp 5 where deptno=10 6 union all 7 select ename||, $||cast(sal as varchar2(10))||.00 as data 8 from emp 9 where deptno=20 10原创 2009-12-06 13:24:00 · 2787 阅读 · 0 评论 -
ORACLE分解IP地址
通过使用内置函数substr和instr来分解IP地址。看个下面的例子。SQL> col a format a10SQL> col b format a10SQL> col c format a10SQL> col d format a10SQL> select ip, 2 substr(ip,1,instr(ip,.,1,1)-1) a, 3 substr(ip,instr(ip原创 2009-12-06 22:16:00 · 1324 阅读 · 0 评论 -
ORACLE 检测出两个表中的不同数据
SQL> create table t1(id number,name varchar2(10));Table created.SQL> create table t2(id number,name varchar2(10));Table created.SQL> insert into t1 values(1,wh);1 row created.SQL> insert原创 2009-12-05 20:08:00 · 2147 阅读 · 0 评论 -
ORACLE计算字符在字符串中出现的次数
SQL> create table t1(describe varchar2(20));Table created.SQL> insert into t1 values(hello world);1 row created.SQL> insert into t1 values(hello everyone);1 row created.SQL> insert int原创 2009-12-06 12:20:00 · 5088 阅读 · 1 评论 -
ORACLE从字符串中删除不需要的字符
SQL> select ename,sal from emp;ENAME SAL---------- ----------SMITH 800ALLEN 1600WARD 1250JONES 2975MARTIN 1250BLAKE 285原创 2009-12-06 12:35:00 · 3087 阅读 · 2 评论 -
ORACLE按字母顺序排列字符串
这个描述起来不太好说,大家就看看下面的例子吧,其实就是把一个字符串中的字母按照字母表顺序重新排序。SQL> select old_name,new_name 2 from 3 ( 4 select old_name,replace(sys_connect_by_path(c, ), ) new_name 5 from 6 ( 7 select e.ename o原创 2009-12-06 20:45:00 · 4876 阅读 · 0 评论 -
ORACLE将字符和数字数据分离
SQL> select ename||sal as data from emp;DATA--------------------------------------------------SMITH800ALLEN1600WARD1250JONES2975MARTIN1250BLAKE2850CLARK2450SCOTT3000KING5000TURNER1500ADAMS1100DATA原创 2009-12-06 12:47:00 · 2157 阅读 · 0 评论 -
ORACLE将分隔数据转换为多值IN列表
看看下面的语句select ename,sal,deptnofrom empwhere empno in(7654,7698,7782,7788)这个语句是错误的,因为DEPTNO是一个数值列,而此IN列表是一个字符串值,所以此SQL语句会失败。现在要将此字符串转换为用逗号分解的数值列表。使用如下语句可以达到目的。select ename,sal,deptnofrom em原创 2009-12-06 19:51:00 · 2027 阅读 · 0 评论 -
ORACLE计算累计和
先来看一下表中的原始数据SQL> select ename,sal from emp;ENAME SAL---------- ----------SMITH 800ALLEN 1600WARD 1250JONES 2975MARTIN 1250BLAKE原创 2009-12-08 16:37:00 · 1994 阅读 · 0 评论 -
ORACLE生成累乘积
方法一:使用窗口函数SUM OVER,用对数相加来模拟乘法操作。SQL> select empno,ename,sal 2 from emp 3 where deptno=10; EMPNO ENAME SAL---------- ---------- ---------- 7782 CLARK 2450原创 2009-12-08 16:52:00 · 2745 阅读 · 0 评论 -
简单介绍join,outer-join,semi-join,anti-join的区别
join,outer-join,semi-join,anti-join转载 2011-05-17 14:50:00 · 22598 阅读 · 0 评论