Oracle 数据库常用语法
1、创建自增列
1 -- Create sequence 创建sequence 2 create sequence T41_R_ITEM_FIELDKEY 3 minvalue 1 4 maxvalue 99999999999999 5 start with 10220 6 increment by 1 7 cache 20;
2、查询重复的数据
1 select cid,cname,cage,city,address from tbl_ABC where city in (select city from tbl_ABC group by city having count(city) > 1) order by opendate;
3、case用法when
1 SELECT 2 CASE 3 WHEN T.FLAG='0' THEN T.USERID 4 WHEN T.FLAG='1' THEN T.ORGID 5 ELSE NULL 6 END AS '标识' 7 FROM XTXMXX T
4、decode用法
1 --如果FLAG等于1,则转为USERID,如果为0,则转为ORGID,其他的为2 2 SELECT DECODE(T.FLAG,1,T.USERID,0,T.ORGID,2) FROM XTXMXX T ;
5、nvl 从两个表达式返回一个非 null 值。
1 ---如果a.name不为空,返回姓名,否则返回 “空的” 2 select nvl(a.name,'空得') as name from student a join school b on a.ID=b.ID
6、常用的三种链接
1 --右连接 反方向连接 2 SELECT * FROM SX02_PROGRAM T,SX03_GL_ACCASS L WHERE T.PROGRAMNO(+)=L.CITEM_ID;
3 4 --左链接 5 SELECT * FROM SX02_PROGRAM T,SX03_GL_ACCASS L WHERE T.PROGRAMNO=L.CITEM_ID(+); 6 7 --特殊连接 8 SELECT T.PROGRAMNO, (SELECT P.BONDNO FROM SX05_CONTRACT P WHERE P.PROGRAMNO=T.PROGRAMNO) FROM SX02_PROGRAM T,SX03_GL_ACCASS L WHERE T.PROGRAMNO=L.CITEM_ID;
7、批量更新数据
7-1、根据查询语句更新数据库字段
1 --多列更新 2 UPDATE QJGL T SET (T.ZJQHZJRQ,T.ZJQHZJJE,T.LJQHZJJE)= 3 ( 4 --此处只能查询单一值,故要关联 5 SELECT TT.ZJZJZJRQ,TT.ZJZJZJJE,TT.LJZJZJJE FROM QJGL TT 6 WHERE T.XTXMBH=TT.XTXMBH 7 );
7-2、将查询语句作为条件,查询目标数据是否存在于档案数据中,并将目标数据中的某些字段值更改为档案数据表的值(tbl_tpmwangyuesiji 目标表,tbl_netcar 档案表)
UPDATE TBL_TMPWANGYUESIJI a SET (a.COMNAME,a.DNAME) = (SELECT b.companyname,b.carflag FROM tbl_netcar b WHERE b.carid = a.idcard AND b.carflag in (1,2,4,5)) WHERE EXISTS (SELECT * FROM tbl_netcar b WHERE b.carid = a.idcard AND b.carflag in (1,2,4,5));
8、ROW_NUMBER分组排序
select cc.serialno, cc.objectno, cc.corpuspaysum, --PARTITION BY:分组 ORDER BY:排序 可正序倒序 ROW_NUMBER() OVER(PARTITION BY cc.objectno ORDER BY cc.corpuspaysum desc) as rn from sx01_contract_paysource cc;
9、保留两位小数
1 ---最终保存成字符串类型 2 ---使用to_char()函数 3 4 5 // 小数点前的9和0代表一位数字,个位数用0防止0显示成.00 6 // 其9代表:如果存在数字则显示数字,不存在则显示空格 7 // 其0代表:如果存在数字则显示数字,不存在则显示0,即占位符 8 // 其FM代表:删除如果是因9带来的空格,则删除之 9 select to_char(123456,'FM999999999999990.00') as aa from dual; 10 select to_char(123456,'999999999999990.00') as aa from dual; 11 // ||表示字符串拼接,结果是59.00% 12 select to_char(0.59/1.00*100,'FM999,999,999,999,990.00')||'%' from dual 13 // 如果不需要四舍五入,则需要trunc一下,否则显示0.60 14 select to_char(trunc(0.596,2),'FM999,999,999,999,990.00') from dual 15 16 ---最终仍保存成数字类型 17 ---使用cast()函数 18 19 // number中第一个参数表示将要转换的数字长度,后一个参数表示保留小数位数 20 select cast(123456 as number(18,2)) as aa from dual;
10、not exists和not in的区别
1 ---对于not exists查询,内表存在空值对查询结果没有影响;对于not in查询,内表存在空值将导致最终的查询结果为空。 2 3 ---对于not exists查询,外表存在空值,存在空值的那条记录最终会输出;对于not in查询,外表存在空值,存在空值的那条记录,最终将被过滤,其他数据不受影响 4 5 --这时能查出结果 6 select value from temp_a a where a.id between 1 and 100 and not exists(select * from temp_b b where a.value=b.value); 7 8 --此时查出的结果为空. 9 10 select value from temp_a a where a.id between 1 and 100 and a.value not in(select value from temp_b)
11
12 --tab_a存在且tab_b也存在的数据
13 select h.carid ,j.PERMIT_OPERATOR , from (select s.carid,s.CONAME,s.CREATETIME from tab_a s where exists
14 (select * from tab_b g where g.carflag not in (0,8) and s.carid=g.carid)) h left join tab_b j on h.carid=j.carid