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
posted @ 2021-04-23 17:13  FelixWang  阅读(790)  评论(0编辑  收藏  举报