查看
数据库状态
select status from v$instance;
一、数据类型:
number:number(9,2)共9位,小数点后2位
char/varchar2:char最大2000位,varchar2最大4000
date:不带毫秒
timestamp:带毫秒,时区信息
clob/blob:大的二进制类型的字符,最大2G
***UTF-8字符集:一个中文占三个字符
***当前时间:select sysdate(systimestamp) from dual
二、数据库定义语言(DDL)
create table [table_name](column1 char(10) not null, column2 varchar2(60), column3 number(5,3));
alter table [table_name] add [column] [type]
drop
rename
truncate
***drop/truncate/delete的区别:
1、drop、truncate都是DDL语句,执行后会自动提交。
2、truncate和delete只删除数据,不删除表的结构;drop语句将删除表的结构,被依赖的约束、触发器、索引,依赖于该表的存储过程、函数将保留,状态变为invalid状态。delete语句会触发时间,如trigger。truncate与事务无关。
3、执行速度:drop>truncate>delete
***desc [table_name]:查看表结构
***注释:单行--多行/* */
三、数据操纵语言(DML)
insert/select/delete/update
insert into [table_name](column1,column2,column3) values(val1,val2,val3);
insert into [table_name](column1,column2,column3) select c1,c2,c3 from table2;
update [table_name] set old_column=new_column where ...
四、控制命令
commit提交,rollback回滚
五、条件表达式
1、case when
case sex
when '1' then '男'
when '2' then '女'
else '其他'
end
或
case
when sex='1' then '男'
when sex='2' then '女'
else '其他'
end
----------------------------
case when 在select中的用法
select grade, COUNT(case when sex = 1 then 1
else 0
end) 男生数,
COUNT(case when sex = 2 then 1
else 0
end) 女生数
from students
group by grade;
------------------------------
case when 在where中的用法
select t1.*,t2.*
from t1,t2
where (case when t2.compare_type = 'A' and t1.some_type like 'nothing %' then 1
when t2.compare_type !='A' and t1.some_type not like 'nothing%' then 1
else 0
end) = 1;
-------------------------------
case when 在group by 中的用法
SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary >500 AND salary <= 600 THEN '2'
WHEN salary >600 AND salary <= 800 THEN '3'
WHEN salary >800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class,
COUNT(*)
FROM Table_a
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary >500 AND salary <= 600 THEN '2'
WHEN salary >600 AND salary <= 800 THEN '3'
WHEN salary >800 AND salary <= 1000 THEN '4'
ELSE NULL END ;
2、decode()函数
decode(value,if1,then1,if2,then2...ifn,thenn,else) :
Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。 例子;
CREATE OR REPLACE VIEW bank_date_lst AS
Select to_char(tran_date,’yyyy .mm’),
SUM( DECODE ( bank_code,’001’, tran_val,0 )) 城西区,
SUM( DECODE ( bank_code,’002’, tran_val,0 )) 城南区,
SUM( DECODE ( bank_code,’003’, tran_val,0 )) 城东区
FROM pay_lst
GROUP BY to_char(tran_date,’yyyy .mm’);
六、序列
select [table_name].nextval from dual;全局的
select [table_name].currval from dual;局部的
七、存储过程
声明——执行体开始——异常处理——执行体结束
create or replace proccedure [name]
is
begin
end;
例子:
CREATE OR REPLACE PROCEDURE存储过程名
(
--定义参数
is_ym
IN CHAR(6) ,
the_count OUT NUMBER,
)
AS
--定义变量
vs_msg
VARCHAR2(4000); --错误信息变量
vs_ym_beg
CHAR(6); --起始月份
vs_ym_end
CHAR(6); --终止月份
vs_ym_sn_beg CHAR(6); --同期起始月份
vs_ym_sn_end CHAR(6); --同期终止月份
--定义游标(简单的说就是一个可以遍历的结果集)
CURSOR cur_1 IS
SELECT。。。
FROM。。。
WHERE。。。
GROUP BY。。。;
BEGIN
--用输入参数给变量赋初值,用到了Oralce的SUBSTR
TO_CHAR ADD_MONTHS
TO_DATE等很常用的函数。
vs_ym_beg := SUBSTR(is_ym,1,6);
vs_ym_end := SUBSTR(is_ym,7,6);
vs_ym_sn_beg :=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'), -12),'yyyymm');
vs_ym_sn_end :=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'), -12),'yyyymm');
--先删除表中特定条件的数据。
DELETE FROM表名WHERE ym = is_ym;
--然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount
DBMS_OUTPUT.put_line('del上月记录='||SQL%rowcount||'条');
INSERT INTO表名(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT
area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_beg
AND
ym <= vs_ym_end
GROUP BY area_code,CMCODE;
DBMS_OUTPUT.put_line('ins当月记录='||SQL%rowcount||'条');
--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。
FOR rec IN cur_1 LOOP
UPDATE表名
SET
rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn
WHERE area_code = rec.area_code
AND CMCODE = rec.CMCODE
AND ym = is_ym;
END LOOP;
COMMIT;
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
EXCEPTION
WHEN OTHERS THEN
vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--把当前错误记录进日志表。
INSERT INTO LOG_INFO(proc_name,error_info,op_date)
VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);
COMMIT;
RETURN;
END;
****************补充:游标、循环(简单循环、while循环、for循环、游标for循环)、异常处理;动态SQL
常用-查询相关:
1、 连接(left
join/right join/inner join/outer join/union/union all)or子查询(=/in/exists)
2、 Group by:通常和聚合函数配合使用,select后面的所有列中,没有使用聚合函数的列,必须出现在group by后面。
-----where自居的作用实在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数。
-----hacing子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数。Having子句被限制在已经在select语句中定义的列和聚合表达式上。
SELECT A,COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2
3、grouping