首页 > 技术文章 > Oracle笔记

imihiroblog 2014-03-31 20:22 原文

基础

取余  mod(number1,number2)

update resident set tall=(mod(id,20)+160);

 

update resident set gender='女' where mod(id,2)=1;

 

 

不等于 <>

distinct

 

 

union all

将两个列名相同的表的记录 合成一张表

trim(字段)  消除返回值的空格

select trim(t1.*) from BMNC_PMARTVW.T98_OD_ROUTE_DD t1; 

字符串补齐

参数:num-被补齐的字符串

           6-补齐到几位。

           ‘0’-用哪个字符补齐。如果未设置,则添加空格

select lpad(num,6,'0') from shopMBase;

结果:

LPAD(NUM,6,'0')

---------------

000379        

000381        

000384        

000385        

000387         

更新:

update shopmbase set num=lpad(num,6,'0');

 

字符串连接

指令:a||b

 

select num||'01' from shopmbase

 

 

 

 

max 函数

用法1:

 select max(field) from table

 

举例:

select max(ddate) from tb_oil;

 

 

 

用法2:

select f1,max(f2) from table group by f1;

 

结果:

 

 

 

 

常见错误,缺少group by f1:

 

 

Date取日期部分,转换成字符串

Select TO_CHAR(BirthDate, 'YYYY-MM-DD')   From resident;

 

Date字符串转日期

 

to_date('"+resi.BirthDate.toString()+"','yyyy-mm-dd');

 



Group 查时间最新记录

 

 

 

 

 

 

 

Group按某字段统计

select engiID,count(engiID) from shopMbase group by engiID;

 

ENGIID COUNT(ENGIID)

---------- -------------

         1          2852

 

 

Null值用0替换

select a.ID,a.Name,nvl(b.sum,0) as totalSum from shopengi a

left join (select engiID,count(engiID) as sum from shopMbase group by engiID) b

on a.ID=b.engiID;

 

 

 

Group按区统计

 

select a.ID,a.name,b.allCount from attrshop a right join (select district,count(*) as allCount from shopmbase group by district) b

on a.ID=b.district;

 

 

 

 

 

 

 

单独查看最新时间的记录,使用max(fieldA), fieldB group b field B,不能select出其他字段

select wingname,max(ddate) from tb_oil group by wingname;

like

select * from shopmbase where address like '%北京%';

 

is null / is not null

说明:active类型是varchar2; 目标:取北京地区的活跃商户

 

select * from shopmbase where (address like '%北京%' or Name like '%北京%') and active is not null;

 

行数:3042行

 

oracle中取top

背景:oracle不支持 top语句

 

select * from

(select ID from shopmBase order by ID asc)

where rowNum<=3;

 

 

rownum 排序分页

rownum作用:为select 结果添加列rownum (行号)。

 

为何要用别名:因为rownum不能作为列名。

为何用子查询:因为rownum是执行完select之后再添加伪列。

 

select b.* from

(select a.*,rownum rn from (select * from shopmbase  where hyid=10 and isactivated=2 and district=4 order by id) a) b

where rn>=5 and rn<=10;

 

结论:3层select

  第一层  非rn条件和order

  第二层  select a.*, rownum rn

  第三层  select b.*, rn where rn条件

分页加载效率

Ajax,时间控制在0.2s以内,则不必blockUI

 

 

 

 

 

 


 

 

 

 

综合

列别名  (t1.field as f1)

t.no as no,

 

table 简称(重要习惯 select t1.field from table t1)

select top 1 t1.* from BMNC_PMARTVW.T98_OD_ROUTE_DD t1; 

 

说明: 使用简称,  之后 from 全称  简称, 是简化查询的 重要习惯。

 

 

 

left Join  (联合查询)

联合两表

select  t1.f1,t1.f2 from tableA t1

left join tableB t2

on t1.id=t2.id

 

联合两表,查居民所有属性

select a.*,b.attrvid from resident a

left join resiattr b

on a.id=b.resiid;

 

 

select attrvid.attrvalue,c.ResiID,c.NAME from attrvid

right join

(select a.resiID,a.attrVID,b.NAME from resiattr a

left join resident b

on a.resiid=b.id) c

on attrvid.attrvid=c.attrvid;

 

 

 

 

联合四表 (查所有票种)

select t1.prod_id as id,

            t1.prod_nme as name,

            trim(t1.prod_cate_cd) as categoryCode,

            trim(t3.prod_cate_desc) as categoryName,

            trim(t2.payment_type_code) as paymentTypeCode,

            trim(t4.payment_type_name) as paymentTypeName

      from  bmnc_pdatavw.t50_product t1

      left join bmnc_pdatavw.t50_prod_payment_his t2

         on t1.prod_id = t2.prod_id

         and   t2.start_dt <= current_date

         and   t2.end_dt > current_date

      left join bmnc_pcodevw.t99_prod_cate_cd t3

         on t1.prod_cate_cd = t3.prod_cate_cd

      left join bmnc_pcodevw.t99_prod_payment_cd t4

         on t2.payment_type_code = t4.payment_type_code

      where t1.effect_dt <= current_date

         and   t1.invalid_dt > current_date

联合四表(得hyVal,isVal,dName shopMis)

select e.*,f.name as dName from (select c.*,d.value as isVal from (select a.*,b.value as hyVal from shopmbase a

left join shopothattr b

on a.hyid=b.id) c

left join shopothattr d

on c.isactivated=d.id) e

left join shopdistrict f

on  e.district=f.id;

 

 

数据导入\导出

excel导入\导出Oracle

工具:Oracle SQL Developer

选择表,右键-导入数据

d

 

导出数据库

工具:Oracle SQL Developer

具体:菜单->工具->数据库导出

成果:.sql文件

 

备注:导出时,不勾选“方案”,这样sql语句中不会包含  用户.

 

 

 

 

导入数据库

工具:Oracle SQL Developer

具体:菜单->文件->打开, 选择.sql文件, 执行

 

 

恢复数据库

第一步: 清空原来的表,序列,触发器

drop table shopmbase;

drop table shopOthattr;

drop table shopDistrict;

drop table shopEngi;

 

drop sequence seq_attrShop;

drop sequence seq_shopEngi;

drop sequence shm_sequence;

 

第二步:使用导入脚本.sql

 

 

 

 

 

 

 

 

mybatis效果

 在xml中写查询语句

 可以插入 判断(if), 循环(foreach)

 

mybatis 文件 实体

 

.xml

mybatis中 表示 sql语句中的变量

#{变量名}

 

   <update id="delete" parameterType="long">

       <![CDATA[

       update tf_fare_proposal

       set   del_flg = 1

      where id = #{id}

      ]]>

   </update>

 

queryMapper.xml位置

 

 

 

 

Oralce相关

查看Oracle版本

select * from v$version

Oracle大小写和字符串表示

序号

规则

举例

1

Insert,select这些关键字不区分大小写

 

2

表名不区分大小写

 

3

列名区分大小写,列名只能用双引号

 

4

字符串只能用单引号

 

 

 

Oracle中的varchar2 和 null值

1>varchar2的默认值是null. 某列类型是varchar2, 插入记录,若该列未设置值,则列值为null.

 

insert into resident(NAME) values('测试用户1');

select * from resident where NAME='测试用户1';

 

 

 

2>用  IDNUM is null来 表示 IDNUM是空

 

select * from resident where NAME='测试用户1' and IDNUM is null;

select * from resident where NAME='测试用户1' and IDNUM=null;

select * from resident where NAME='测试用户1' and IDNUM='';

 

 

 

3>’’不是null.

 

4>如果列值是null,

用Java的 Result.getString(“IDNUM”)将 提示 列名无效

 

是/不是null

 是null     column is null

不是null    column is not null

 

表空间

创建

create tablespace gxktablespace

datafile 'F:\TableSpaces\gxkTableSpace\gxktablespace.dbf'

size 32m

autoextend on

next 32m maxsize 2048m

extent management local;

效果:在zfmi文件夹下就能看到表空间文件gxktablespace2.dbf了

 

 

临时表空间:

create temporary tablespace tempTestTS 

tempfile 'F:\TableSpaces\gxkTableSpace\tempTestTS.dbf'

size 50m 

autoextend on 

next 50m maxsize 20480m 

extent management local; 

 

删除

drop tablespace zfmi_temp including contents and datafiles;

 

效果:在zfmi文件夹下表空间文件消失。

用户

创建用户名/密码

create user test identified by test

default tablespace testTS;

GRANT connect,resource,dba TO test;

 

 

删除用户

drop user gxk;

 

 

grant身份与登录身份的对应

 

       Grant  dba   登录身份   Normal

       Grant  sysdba 登陆身份  sysdba

Unlimited tablespace  允许 gxk使用任意表空间

 

创建

//自己写的语句

create table tb_Test(

"ID" number not null primary key,

"Name" varchar(50) not null,

"Age" number,

"Job" varchar(50)

);

 

//sql developer生成

  CREATE TABLE "SYSTEM"."TB_TEST"

   ( "ID" NUMBER NOT NULL ENABLE,

       "NAME" VARCHAR2(50 BYTE) NOT NULL ENABLE,

       "AGE" NUMBER,

       "JOB" VARCHAR2(50 BYTE),

        CONSTRAINT "TB_TEST_PK" PRIMARY KEY ("ID")

  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255

  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

  TABLESPACE "SYSTEM"  ENABLE

   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

  TABLESPACE "SYSTEM" ;

 

删除

drop table tb_Test

 

主键

 

create table TB_PERATTRVALID(

   PERID NUMBER NOT NULL,

   ATTRVALID NUMBER NOT NULL,

   CONSTRAINT TB_PERATTRVALID_PK PRIMARY KEY(PERID,ATTRVALID),

   CONSTRAINT TB_PERATTRVALID_FK1 FOREIGN KEY(PERID) REFERENCES TB_TEST(ID),

   CONSTRAINT TB_PERATTRVALID_FK2 FOREIGN KEY(ATTRVALID) REFERENCES TB_ATTRVAL(ATTRVALID)

 )

 

外键

 

create table TB_ATTRVAL(

   ATTRVALID  NUMBER PRIMARY KEY,

   ATTRVALNAME VARCHAR(100) NOT NULL,

   ATTRKINDID NUMBER,

   CONSTRAINT TB_ATTRVAL_FK1 FOREIGN KEY(ATTRKINDID) references TB_ATTRKIND(ID)

 )

 

自增主键

1.创建sequence

CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
NOCACHE -- 不建缓冲区


以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq
,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!)
书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:

 

2.创建trigger
CREATE TRIGGER "tgr_tbTest" BEFORE

INSERT ON TB_TEST FOR EACH ROW WHEN (new.id is null)

begin

select emp_sequence.nextval into :new.id from dual;

end;

 

3.插入数据测试
INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei');

行操作

insert

 

insert into tb_test("Name","Age","Job") values('sasuke',28,'SE');表名,关键字不区分大小写。

列名区分大小写。

delete

 

delete from tb_test;

备注:不需要 *;

军规

无论何时,列名一定要用 引号包围起来,并且区分大小写。

添加列

ALTER TABLE TB_TEST ADD COMPANY VARCHAR2(100);

 

删除列

如果列存在 约束,先删除约束,再删除列。

不存在,则直接删除

 

ALTER TABLE 表名 DROP CONSTRAINT 默认约束名

GO

ALTER TABLE 表名   DROP COLUMN 字...

 

 

改名列

 

序列 sequence

创建

CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
NOCACHE -- 不建缓冲区

 

删除

drop sequence emp_sequence;

 

触发器Trigger

创建

CREATE TRIGGER "触发器名称" BEFORE
INSERT ON example FOR EACH ROW WHEN (new.id is null)
begin
select emp_sequence.nextval into :new.id from dual;
end;

删除

设计属性表

ballon 属性设计

 

 

Person属性设计

Person

列名

描述

ID

人ID

Name

人姓名

 

PerAttrVaID (双外键;双外键成主键)

列名

描述

attrValID

属性值ID

personID

人ID

 

AttrVal

列名

描述

attrValID

属性值ID  (主键)

attrVal

属性值   (非空)

attrKindID

种类ID  (外键)

 

AttrKind

列名

描述

attrKindID

属性种类ID  (主键)

Name

种类名

 

 

 

 

//查看所有属性名和属性值

select A.ATTRVALID,B.NAME,A.ATTRVALNAME FROM TB_ATTRVAL A

LEFT JOIN tb_attrkind B

ON A.ATTRKINDID=B.KINDID;

 

教育程度可能取值

 

 

 

 

错误编号

Ora-12519

描述:

Listener refused the connection with the following error:

ORA-12519, TNS:no appropriate service handler found

 

原因:Oracle并发 Processes数到达上限,拒绝当前请求。

 

推荐阅读