oracle SQl 总结

 

 

 oracle SQl 总结

 

1、查询数据表中某个字段重复出现两次以上的数据

 

 

select * from zf_fundinorderpayt where MAINORDERSYSTEMNO in(select MAINORDERSYSTEMNO from zf_fundinorderpayt group by MAINORDERSYSTEMNO having count(MAINORDERSYSTEMNO)>=2)  

 

2、删除表主键

 

ALTERTABLE 表名 drop CONSTRAINT PK_表名

 

 

3、为已经存在的表增加或者删除一列

 

 

 

alter table dz_cpcnsqlconfig drop CONSTRAINT PK_dz_cpcnsqlconfig

alter table dz_cpcnsqlconfig add StatementSystemType NUMBER(2) default 10 not null; 
alter table dz_cpcnsqlconfig drop column StatementMiddleInnerStatus
alter table dz_cpcnsqlconfig add StatementResultInnerStatus NUMBER(2)

alter table dz_cpcnsqlconfig add StatementMiddleInnerStatusType NUMBER(2)
alter table dz_cpcnsqlconfig add StatementMiddleInnerStatus NUMBER(2)


4、为表和表字段增加注释

 

 

添加表注释:
COMMENT ON table t1 IS '个人信息';

添加字段注释:
comment on column t1.id is 'id';
comment on column t1.nameis '姓名';
comment on column t1.age is '年龄';

comment on column dz_cpcnsqlconfig.StatementMiddleInnerStatusType is '对账中间结果类型,10=来源多账 15=目标多账 20=状态不一致 30=金额不一致';

comment on column dz_cpcnsqlconfig.StatementSystemType is '10=系统内对账 20=系统间对账'

 

5. 修改/增加一列属性

 

 

ALTER TABLE ZF_FundInOrderPayt MODIFY PartitionCode NULL;
ALTER TABLE ZF_FundInBGateOrderSub MODIFY PartitionCode NULL;
ALTER TABLE dz_bankstatementresult ADD BankFlatCount   NUMBER(8)   DEFAULT 0 NOT NULL 

 

 

 

 

 

 

 

6. PLSQL 更改表数据   

for update 是锁整个表 一般不推荐使用

 

select t.* , t.rowid from DZ_BankStatementResult t

select * fom tablename for update 

 

7.重命名表字段

 

 

说明:alter table 表名 rename  column  列名 to 新列名   (其中:column是关键字)

   例:alter table sf_InvoiceApply rename column PIC to NEWPIC;

 

 

 

8. 主键和唯一索引的区别

 

1)主键一定会创建一个唯一索引,但是有唯一索引的列不一定是主键;
2)主键不允许为空值,唯一索引列允许空值;
3)一个表只能有一个主键,但是可以有多个唯一索引;
4)主键可以被其他表引用为外键,唯一索引列不可以;
5)主键是一种约束,而唯一索引是一种索引,是表的冗余数据结构,两者有本质的差别

 


9. 给表增加外键

语法:
alter table 表1-表名
add constraint 外键名称(一般外键名称为”fK_”开头) foreign key (要设为外键的列名)
references 表2-表名(与哪个表有关联) (表2中该列列名);

栗子:

 

ALTER TABLE DZ_BankStmtDataTransferTx  ADD CONSTRAINT FK_EDataTransferCfgSystemNo FOREIGN KEY (EDataTransferCfgSystemNo) REFERENCES DZ_BankStmtDataTransferConfig(SystemNo);

 

10. 查找某个字段出现两次或两次以上的数据

select accountid ,count(*) from KJ_AccountingItem  group by(accountid)  having count(*)>1

 

11. 查找某个字段为空的数据

 

select count(*) from kj_accountingitem where accountid is null

 

12.查找在一个表中存在在另外一个表中不存在的数据

方法1:需要两个表的字段完全一致

select * from t1
where id not in(select id from t2)

 

方法2:

select * from t1
where id not in(select id from t2)

 

方法3:

 

select * from t1
where id not in(select id from t2)

 

方法4:需要t2.id不能为空

select * from t1
where id not in(select id from t2)

 

13.如果有数据在某个时间被删除了oracle有一份快照,怎么获取被删除了的数据,并且重新插回来呢?

SELECT * FROM Qy_datasourceconfig AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '19' Hour) WHERE ....e

 

insert into qy_datasourceconfig (SELECT * FROM Qy_datasourceconfig AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '19' Hour)where datasourceid not in('ods','genonehis','fwdg','genone') )

 

14.Sql语句 in 转换为 exists

select *
  from RMS_TRANS_PTN_IP_CROSSCONNECT  
 where RELATED_NE_ID in
       (select int_id from RMS_TRANS_ELEMENT where RELATED_EMS in (216337))


转换成exists:

select *
  from RMS_TRANS_PTN_IP_CROSSCONNECT t1
 where exists (select 1
          from RMS_TRANS_ELEMENT t2
         where t1.RELATED_NE_ID = t2.int_id
           and t2.RELATED_EMS = 216337)

 

15 、oracle分页查询:

SELECT * FROM  
(  
SELECT A.*, ROWNUM RN  
FROM (SELECT * FROM ZF_FundTransOrderPayt) A  
WHERE ROWNUM <= 21 
)  
WHERE RN >= 17

 

16 、查看oracle数据库最大连接数

select count(*) from v$process; --当前的连接数

select value from v$parameter where name ='processes'; --数据库允许的最大连接数

 

17 、外键使用异常:

 

truncatetable  ep_point

错误报告:

SQL错误: ORA-02266: 表中的唯一/主键被启用的外键引用

02266.00000 -  "unique/primary keys in table referenced by enabled foreignkeys"

*Cause:   An attempt was made to truncate a table with unique or

          primary keys referenced by foreign keys enabled in another table.

          Other operations not allowed are dropping/truncating a partition of a

          partitioned table or an ALTER TABLE EXCHANGE PARTITION.

*Action:  Before performing the above operations the table, disable the

          foreign key constraints in other tables. You can see what

          constraints are referencing a table by issuing the following

          command:

          SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";

”。

而改成delete则删除成功。

网上给出的解释是ddl与dml的区别(because truncate isn't going to verify the constraint, truncate is ddl.)。

解决办法:

SQL> alter table ep_pointdisable primarykey cascade;          

表已更改。

SQL>truncate table ep_point;

表已截掉。

SQL> alter table ep_point enable primary key;

 

表已更改。

SQL>ALTER TABLE '子表' ENABLE CONSTRAINT '外键约束名';

*特别注意的是在ENABLE主键后不会自动恢复外键(没有cascade选项),因此需要手工对引用该键的约束进行ENABLE。

由于此解决方法会disable掉关联子表的外键,所以慎用。

18 、使用 insert into  select 循环插入

 

declare
  i         int := 3000000;
  tmpamount int;
  ysystemno varchar2(32);
  bankno    varchar2(32);
  ycontextid varchar2(32);
Begin
  while i <= 6000000 loop
    tmpamount := abs(mod(dbms_random.random, 20)) * 100 + 30;
    ysystemno := '4011' || to_char(sysdate, 'yyyymmddhh24missSSS') || '0' || i;
    bankno    := '1857' || to_char(trunc(dbms_random.value(10000, 11000))) || i;
    ycontextid:= '3511' || to_char(sysdate, 'yyyymmddhh24missSSS') ||i;
  
    insert into yh_gathering
      (systemno,
       systemtime,
       rootid,
       sourcetxsn,
       contextid,
       sourcetxtime,
       status,
       bankgatewaytime,
       responsecode,
       responsemessage)
      select ysystemno systemno,
             to_char(sysdate, 'yyyymmddhh24missSSS') systemtime,
             '2211' || to_char(sysdate, 'yyyymmddhh24missSSS') ||
             to_char(trunc(dbms_random.value(10000, 11000))) rootid,
             to_char(sysdate, 'yymmddhh24missSSS') ||
             to_char(trunc(dbms_random.value(10000, 11000))) sourcetxsn,
             ycontextid  contextid,
             to_char(sysdate, 'yyyymmddhh24missSSS') sourcetime,
             30 status,
             to_char(sysdate, 'yyyymmddhh24missSSS') bankgatewaytime,
             '2000' responsecode,
             '交易成功' responsemessage
        from dual
      connect by rownum <= 1;
    insert into yh_gatheringbankinfo
      (systemno,
       banksystemno,
       sendtime,
       querycount,
       bankresponsetime,
       bankresponsecode,
       bankresponsemessage,
       financechannelcode,
       financeinstcode,
       financesystemcode,
       gatheringway)
      select ysystemno systemno,
             bankno banksystemno,
             to_char(sysdate, 'yyyymmddhh24missSSS') sendtime,
             0 querycount,
             to_char(sysdate, 'yyyymmddhh24missSSS') bankresponsetime,
             '00042' bankresponsecode,
             'chenggong????' bankresponsemessage,
             '911_10210012000000011000012000110' financechannelcode,
             '911' financeinstcode,
             '9111201201' financesystemcode,
             11 gatheringway
        from dual;
    insert into yh_gatheringcustomerinfo
      (systemno,
       txtype,
       institutionid,
       amount,
       accounttype,
       cardtype,
       issuebankid,
       bankaccountname,
       bankaccountnumber,
       branchname,
       province,
       city,
       identificationtype,
       identificationnumber)
      select ysystemno systemno,
             '2011' txtype,
             '000020' institutionid,
             tmpamount amount,
             '11' accounttype,
             '10' cardtype,
             '102' issuebankid,
             'C46611D158B0AEB4A9C7C87A47502E57' bankaccountname,
             '64FF1D295F5AE944854112CFC2FE9507394E30B53BDC46A4' bankaccountnumber,
             '北京市宣武支行' branchname,
             '北京' province,
             '北京' city,
             '0' identificationtype,
             'D2FC2266EA432208930193BD70D2C12B3D8C2279F125DB44' identificationnumber
        from dual;
    i := i + 1;
  end loop;
  commit;
end;

存储过程

-- 建表
CREATE TABLE `person` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `score` int(11) NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `name_score` (`name`(191),`score`),
  KEY `create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 存储过程插入数据

CREATE PROCEDURE insert_person()
begin
    declare c_id integer default 1;
    while c_id<=100000 do
    insert into person values(c_id, concat('name',c_id), c_id+100, date_sub(NOW(), interval c_id second));
    set c_id=c_id+1;
    end while;
end

-- 执行计划
EXPLAIN SELECT COUNT(*) FROM person

MySQL 优化器会选择成本最小的辅助索引进行计数

 

 

19、查询一个表中某个字段不为空的数据

 

select * from   表名  where id  is  not  null;

20、数据导入导出

expdp roommanage_hb/roommanage_hb directory=DATA_PUMP_DIR dumpfile=dev20180326.dmp  schemas=roommanage_hb
impdp roommanage_sx/roommanage_sx directory=DATA_PUMP_DIR dumpfile=dev20180326.dmp remap_schema=roommanage_hb:roommanage_sx TRANSFORM=segment_attributes:n table_exists_action=replace

 

21、管理查询是否失效的问题

 

select * from
td
  left join (
select case_id as sup_case_id , count(*) supervise_number from 
 td_kcdc_case_sup_info 
 group by  case_id
  ) sup
 on  
   sup.sup_case_id = td.case_id
 where 1=1   /*不能去掉, 否则认为and 后的条件为 联合查询时的条件, 不能起过滤作用,由于left join因此td表中记录将全部查出来*/

 and td.con = 'xxxx'   

1. 对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面

2. 对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。

 

21.SQL语句中SUM函数返回NULL的解决办法

 

SELECT COALESCE(SUM(name),0) FROM person WHERE id > 0
 
 
 
行了,这下就不用费事去处理返回结果是否为NULL的情况了。
 
COALESCE 函数的意思是返回参数列表中第一个为空的值,该方法允许传入多个参数,该函数也是SQL中的标准函数。

 

 CASE  WHEN 语句

SELECT  SystemNo,FeeRuleSystemNo,MinBound,CASE MaxBound
         WHEN -1 THEN
          0
         ELSE
          MaxBound  END AS MaxBound  ,FixedCharge,FeeRate,FeeRateUnit FROM  CP_CreditFeeRuleItem

 

查询离某个时间点最近的一笔 交易,并汇总

WITH tabs AS
 (SELECT AccountNumber,
         TXTIME,
         Balance,
         ROW_NUMBER() OVER(PARTITION BY AccountNumber ORDER BY TXTIME DESC) rank
    FROM Paymentaccounttx
   WHERE TXTIME < '20190701000000')
SELECT SUM(Balance)
  FROM tabs t1
  LEFT JOIN InstitutionPaymentAccount t2
    on t1.AccountNumber = t2.paymentaccountnumber
 WHERE rank = 1
   AND t2.usage = 10

 

 

ORA-01810格式代码出现两次 的解决方案

 

正确的格式应该是这样的,用MI来代表分钟。

SQL代码 :

TO_CHAR('2011-09-01 00:00:00','YYYY-MM-DD HH:MI:SS') 

对于24小时制,HH支持的不好,改成一下格式。

SQL代码 :

TO_CHAR('2011-09-01 00:00:00','YYYY-MM-DD HH24:MI:SS') 

update 语句更新date, timestamp字段的格式

UPDATE Order
   SET BANKNOTIFICATIONTIME = TO_TIMESTAMP('2019-8-31 15:12:00','yyyy-mm-dd hh24:mi:ss')
 WHERE Collected = 0
   AND (TxType = '1111' OR TxType = '1112')
   AND SplitType = 10
   AND Status = 20
   AND ConfirmRequired = 0

 

删除库中不在列表TEMPLATECHANNEL中的表

select 'drop table ' || table_name || ';' from tabs where table_name not in ('TEMPLATECHANNEL')

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验一 SQL*PLUS练习 【实验目的】 (1) 了解Oracle的工作环境和基本使用方法。 (2) 练习标准SQL的数据操作,查询命令及其查询优化。 (3) 学会使用高级SQL命令,排序、分组、自连接查询等。 (4) 学会使用SQL*PLUS命令显示报表,存储到文件等。 【实验内容】 一、 准备使用SQL*PLUS 1. 进入SQL*PLUS 2. 退出SQL*PLUS 3. 显示表结构命令DESCRIBE SQL>DESCRIBE emp 使用DESCRIBE(缩写DESC)可以列出指定表的基本结构,包括各字段的字段名以及类型、长度、是否非空等信息。 4. 使用SQL*PLUS显示数据库中EMP表的内容 输入下面的查询语句: SQL>SELECT * FROM emp; 按下回车键执行查询 5. 执行命令文件 START或@命令将指定文件调入SQL缓冲区中,并执行文件内容。 SQL>@ 文件名(文件后缀缺省为.SQL)或 SQL>START 文件名 文件中每条SQL语句顺序装入缓冲区并执行。 二、 数据库命令——有关表、视图等的操作 1. 创建表employee 例1 定义一个人事信息管理系统中存放职工基本信息的一张表。可输入如下命令: SQL>CREATE TABLE employee (empno number(6) PRIMARY KEY, /* 职工编号 name varchar2(10) NOT NULL, /* 姓名 deptno number(2) DEFAULT 10, /* 部门号 salary number(7,2) CHECK(salarycreate table emp2 as select * from emp where 1=2; 在命令的where子句中给出1=2,表示条件不可能成立,因而只能复制表结构,而不能复制任何数据到新表中去。另外,还可以复制一个表的部分列定义或部分列定义及其数据。 三、 Oracle数据库数据查询 1、单表查询 2、多表查询 四、 SQL*PLUS常用命令 表1 常用报表格式化名命令 命令 定义 Btitle 为报表的每一页设置底端标题 Column 设置列的标题和格式 Compute 让SQL*PLUS计算各种值 Remark 将某些字标记为注释 Set linesize 设置报表的行宽字符数 Set newpage 设置报表各页之间的行数 Spool 使SQL*PLUS将输出写入文件中 Start 使SQL*PLUS执行一个sql文件 Ttitle 设置报表每页的头标题 Break 让SQL*PLUS进行分组操作 例3 建立一个批命令文件对查询到的数据以报表的形式输出并将其保存到指定的文件中。 处理方法:利用SQL*PLUS语言工具(也可以使用其他文本编辑器)建立批命令的.SQL文件。在“SQL>”提示符下,使用EDIT命令在”E:\”中建立SCGB.SQL文件。 SCGB.SQL文件中的命令组如下: SQL>EDIT E:\ SCGB.SQL SET echo off SET pagesize 30 SET linesize 75 TTITLE’2008年4月10号’CE’公司职员基本情况登记表’R’Page:’ FORMAT 99- >SQL.PNO SKIP 1 CE’===========================’ BTITLE COL 60 ’制标单位’ TAB 3 ‘人事部’ COLUMN empno heading ‘职工|编号’ COLUMN ename format a10 heading ‘姓 名’ COLUMN job heading ‘工 种’ COLUMN sal format $99,990 heading 工 资’ COLUMN comm Like sal heading ‘奖 金’ COLUMN deptno format 9999 heading ‘部门|编号’ COLUMN hiredate heading ‘参加工作时间’ SPOOL e:\sjbb /*在E盘中建立格式报表输出文件,默认属性为LST BREAK on deptno skip 1 COMPUTE sum of sal comm on deptno SELECT empno,ename,job,hiredate,sal,comm,deptno from emp ORDER BY deptno,sal; SPOOL off /*终止SPOOL功能,关闭其文件。注意,此命令不可省,否则将建立空文件。 五、 实验内容 1、以cs+学号为用户名创建用户,并授予用户创建数据对象的权限。 2、复制emp表,复制表名为emp_学号,然后将emp表中工资低于$2000 的职工插入到复制的表中。 3、对复制的emp表插入一行只包含有职工号,职工名,工资与部门号四个数据 项值的记录。 4、在复制的emp表中将雇员ALLEN提升为经理,工资增至$2500, 奖(佣 )金增加40%。 5、删除复制的emp表中工资低于500的记录行。 6、列出10号部门中既不是经理,也不是秘书的职工的所有信息。 7、查找出部门所在地是CHICAGO的部门的职工姓名、工资和工种。 8、统计各部门中各工种的人数、工资总和及奖金总和。 9、查找出工资比其所在部门平均工资高的职工姓名、工种与工资情况。 实验3 Oracle数据库开发环境下PL/SQL编程 【实验目的】 (1)掌握 PL/SQL 的基本使用方法。 (2)在SQL*PLUS环境下运行PL/SQL的简单程序。 (3)应用 PL/SQL 解决实际问题 【实验内容与步骤】 PL/SQL块中的可执行部分是由一系列语句组成的(包括对数据库进行操作的SQL语句,PL/SQL语言的各种流程控制语句等)。在块中对数据库查询,增、删、改等对数据的操作是由SQL命令完成的。在PL/SQL块中,可以使用SQL的数据查询命令,数据操纵命令和事务控制命令。可使用全部SQL函数。PL/SQL中的SQL语句,可使用SQL的比较操作等运算符。但不能使用数据定义语句。 在PL/SQL块中使用SELECT语句时注意几点: (1)SELECT语句必须含有INTO子句。 (2)INTO子句后的变量个数和位置及数据类型必须和SELECT命令后的字段名表相同。 (3)INTO子句后可以是简单类型变量或组合类型变量。 (4)SELECT语句中的WHERE条件可以包含PL/SQL块中定义的变量及表达式,但变量名不要同数据库表列名相同。 (5)在未使用显式游标的情况下,使用SELECT语句必须保证只有一条记录返回,否则会产生异常情况。 [例3-1] 问题:编写一个过程,求和运算。 SET SERVEROUTPUT ON; DECLARE a number:=1; BEGIN a:=a+5; DBMS_OUTPUT.PUT_LINE('和为:'||TO_CHAR(a)); END; / 【例3-2】:使用%TYPE声明变量,输出制定表中的相关信息。 DECLARE my_name student.sname%TYPE; BEGIN SELECT sname INTO my_name FROM student WHERE no=’01203001’; DBMS_OUTPUT.PUT_LINE(my_name); END; / 【例3-3】问题:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%。 declare v_sal emp.sal%type; begin select sal into v_sal from emp where ename=spName; if v_sal :NEW.sal THEN DBMS_OUTPUT.PUT_LINE('工资减少'); ELSIF :OLD.sal < :NEW.sal THEN DBMS_OUTPUT.PUT_LINE('工资增加'); ELSE DBMS_OUTPUT.PUT_LINE('工资未作任何变动'); END IF; DBMS_OUTPUT.PUT_LINE('更新前工资 :' || :OLD.sal); DBMS_OUTPUT.PUT_LINE('更新后工资 :' || :NEW.sal); END; / --执行UPDATE查看效果 UPDATE emp SET sal = 3000 WHERE empno = '7788'; 6、需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。 Create table foo(a number); Create trigger biud_foo Before insert or update or delete On foo Begin If user not in (‘DONNY’) then Raise_application_error(-20001, ‘You don’t have access to modify this table.’); End if; End; / 即使SYS,SYSTEM用户也不能修改foo表。 2、 利用PL/SQL编写程序实现下列触发器 1)、编写一个数据库触发器,当任何时候某个部门从dept表中删除时,该触发器将从emp表中删除该部门的所有雇员。(要求:emp表、dept表均为复制后的表) 2)、创建一个触发器,当客户下完订单后,自动统计该订单的所有图书的价格总额。 3)、创建一个触发器,禁止客户在非工作时间(早上8:00前,晚上17:00后)下订单。 五、实验心得
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangxiaoming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值