/* 1. 取消重复行 --> select distinct column1 , column2 from table 2. nvl(column1,0) --> 如果column1存在数值,则返回原有值; 如果为null, 则返回 0。 3. select deptno , avg(sal) , max(sal) from emp group by deptno having avg(sal) < 2500 4. 分组函数不能出现在where子句中; order by 子句需要放在sql语句的最后。 5. rollup操作符(生成横向小计和总计): select deptno, job, avg(sal) from emp group by rollup(deptno, job) 6. cube操作符(生成横纵向小计和总计): select deptno, job, avg(sal) from emp group by cube(deptno, job) 7. grouping(column): 如果返回0,则说明统计结果使用了改列;如果返回1,则未使用改列。 select deptno, job , avg(sal), grouping(deptno), grouping(job) from emp group by cude(deptno, job) 8. grouping sets(column1,column2,...): 显示多个分组的统计结果. 以下语句既显示部门的平均工资又显示岗位的平均工资 select deptno, job, avg(sal) from emo group by grouping sets(deptno, job) 9. 多行子查询 in all any . all和any必须结合单行操作符使用。 如 > all(selct ...) ; > any(select ...) 10. case 表达式 select ename , sal, case when sal>300 then 3, when sal > 200, then 2 esle 1 grade from emo where deptno = 10 11. 数字函数--》 abs cell exp floor ln(n) log(m,n) mod(m,n) nanvl(n2,n1) power(m,n) remainder(m,n) round(n,[m]) sign(n)(检查正负数) sqrt trunc(n,[m]) 12. 字符函数--》 ascii(char) chr(num) concat(a,b) initcap(char) instr(char1,char2,[n,[m]]) length(char) lower(c) lpad(c1,n,c2) ltrim(c1[,set]) replace rpad rtrim soundex(c)-->字符语音表示 substr() translate trim upper select concat(concat(ename,':'),sal) from emp where deptno = 10 13 时间函数--》 add_months(date,n) current_date current_timestamp dbtimezone extract(data from datetime) last_day(d) localtimestamp round(d[,fmt]) sysdate trunc(d[,fmt]) select ename, add_months(hiredate, 20*12) '20周年'from emp select extract(month from sysdate) current_month from dual select next_day(sysdate,'星期五') Friday from dual 14 其他函数--》 to_char to_number to_date coalesce(expr1[,expr2][,expr3]...) lnncvl nullif(e1,e2) nvl(e1,e2) nvl(e1,e2,e3) greatest(e1[,e2]...) least(e1[,e2]...) sys_uuid uid user isdba language terminal client_info decode(expr,search1,result[,search2,result2]...) 15. insert into employee(emptn, ename,sal, deptno) select emptn, ename,sal, deptno from emp where deptno = 20; insert /*+append*/ into employee(emptn, ename,sal, deptno) select emptn, ename,sal, deptno from emp where deptno = 20; 当装载大量数据时,此方法更优 16. insert all / first when deptno = 10 then into dept10 when deptno = 20 then into dept20 when deptno = 30 then into dept30 else into other select * from emp; 17. update emp set sal = sal * 1.1 , comm = sal* 0.1 where deptno = 20; 18. truncate table emp 删除emp表的所有数据 可释放表空间 不可以回退 、 19.create table dept(dno number(4) primary key , name varchar2(20)not null,loc varchar(200) default '湛江' ); 20. create table emp(empno number(4), ename varchar2(20), sal number(60) encrypt); 加密列 sal 21. create table staff(id number(4), name varchar2(20), sal number(6), tax number(6) generated always as sal*0.7); 虚列 tax 22. 修改表: alter table emp add eno number(4); alter table emp modify job varchar2(20) default 'clerk'; alter table emp drop column desc; alter table emp rename column eno to empno ; rename object_name to new_object_name; alter table emp read only; 23. truncate table emp ; 删除表的数据,保留表结构; drop table emp; 删除表的数据以及表结构; flashback table employee to before drop. 恢复被删除表 24. 约束: not null ; unique 唯一可空; primary key 唯一不可空; foreign key; check create table emp(eno int primary key, sal number(6,2), deptno int constraint fk_dno references dept(dno), check(sal between 1000 and 5000)); 25. create table item (order_id number(3) , item_id number(3) , product varchar2(20), primary key(order_id, item_id)); //复合约束 26. 维护约束: alter table emp modify ename not null; alter table emp add unique/primary key(eno); alter table emp add dno int references dept(dno); alter table emp add check(sal between 200 and 1000); 27. 删除、禁止、激活约束: drop / disable / enable constraint cons_name; 28. 如果视图包含有group by 子句, 分组函数, distinct关键字,和rownum伪列,那么不能在视图上执行DML操作 29. create view emp_view[(name,salary,titel)] as select ename, sal, job from emp [with condition]; 30. 修改视图 create or replace view emp_view (name,salary,titel) as select ename, sal, job from emp 31. alter view emp_view compile 编译视图; drop view view_emp 删除视图; 32. 建立索引的原则: 1) 索引应该建立在where子句中经常引用的表列上。 2) 在链接列上建立索引。 3) 在需要经常操作的列上建议索引。 4) 不要在小表上建立索引。 33. create index i_ename on emp(ename); create index i_ename on emp(ename,sal); 34. 序列: create sequence deptno_seq start with 50 increment by 10 maxvalue 9999 cache 1000 ; insert into dept(deptno,dname,loc) values(deptno_sep.nexvalue ,'development', default); select deptno_sep.currvalue from dual ; 35. PL/SQL 1)模块化的程序设计功能 create function get_sal(eno number) return number is salary number(6,2); begin select sal into salary from emp where empno=eno; return alary; end; 2)块 declare ... begin ... exception ... end; 3) 标量 v_ename varchar2(20); v_sal number(6,2); v_balance binary_float; v_tex_rate constant number(6,2) :=5.5 v_hiredate date; v_valid boolean not null default false; 4) %type 属性 v_ename emp.ename%type; v_name 与 emp.type 的数据类型和长度一致 v_sal emp.sal%type; 同理 5)SQL 游标 SQL%FOUND 用于确定SQL语句执行是否成功; SQL%NOTFOUND 反之。 SQL%ROWCOUNT 返回SQL语句所作用的总行数。 SQL%ISOPEN 显示游标: 处理多行返回记录 定义游标: CURSOR cursor_name IS select_statement; 打开游标: OPEN cursor_name; 提取数据: FETCH cursor_name INTO variable1, variable2, ... ; (每次只提取一行数据) 关闭游标: CLOSE cursor_name; cursor_name%ISOPEN/%FOUND/%NOTFOUND/%ROWCOUNT 参数游标:定义: CURSOR cursor_name(param_name datatype) IS select_statement; (参数无需指定长度) 动态游标: 定义: type rc is ref cursor; l_cursor rc; open l_cursor for 'select * from emp'; 使用静态光标--通过静态SQL(但不用ref光标)--比使用ref光标效率高,而ref光标的使用仅限于以下几种情况: 把结果集返回给客户端; 在多个子例程之间共享光标(实际上与上面提到的一点非常类似); 没有其他有效的方法来达到你的目标时,则使用ref光标,正如必须用动态SQL时那样; 游标for循环 FOR record_name IN cursor_name LOOP statement1; ... END LOOP; 使用游标更新或删除数据 语法: CURSOR cursor_name IS select_statement FOR UPDATE [OF column_reference] [NOWAIT] (还必须在UODATE OR DELETE语句中)引用WHERE CURRENT OF 子句。 语法如下: UPDATE table_name SET column=.. WHERE CURRENT OF cursor_name; ... 6)条件分支语句 ① if ... then statements; else if then statements; else statements; end if ② case selector when expression1 then statement1; when expression2 then statement2; ... end case; 7) 循环语句 ① loop statement1; ... exit [when condition]; other statements is possible.... end loop; ② while condition loop statement1; statement2; ... end loop; ③ for counter in [reverse] lower_bound..upper_bound loop statement1; statement2; ... end loop; 8) 使用例外 EXCEPTION WHEN expression1 [or expression2 ... ] THEN ... [WHEN expression3 [or expression4 ... ] THEN ] ... [WHEN OTHERS THEN] ... 预定义的例外有: NA_DATA_FOUND , TOO_MANY_ROWS, DUP_VAL_ON_INDEX, ZERO_DIVIDE , INVALID_CURSOR 等等 9)自定义PL/SQL 记录、表、记录表 记录的定义 type emp_record_type is record( name emp.ename%type, salary emp.sal%type ); emp_record emp_record_type; 记录的引用: emp_record.name emp_record.salary 表的定义 type emp_table_type is table of emp.ename%type index by binary_integer; ename_table emp_table_type ; 表的引用: a.单行单列 select ename into ename_table(1) from emp where empno = &eno; b.单列多行 select ename bulk collect into ename_table from emp where deptno=&dno; for i in 1..ename_table.count loop ename_table(i)... end loop; 记录表的定义 type emp_table_type is table of emp%rowtype index by binary_integer; ename_table emp_table_type ; 记录表的引用 select * bulk collect into ename_table from emp where deptno=&dno; for i in 1..ename_table.count loop ename_table(i).ename ename_table(i).sal ... end loop; 10) 存储过程 定义 create [or replace] procedure_name (arg1 [model] datatype1, arg2 [model] datatype2,...) is [as] PL/SQL blocks; model 是指 IN , OUT, 或者 IN OUT, 默认为IN 。 datatype 不需要指定长度。 执行 exec procedure_name(args...); 删除过程 drop procedure procedure_name ; 11)函数 定义 create [or replace] function_name (arg1 [model] datatype1, arg2 [model] datatype2,...) return datatype is [as] PL/SQL blocks; model 是指 IN , OUT, 或者 IN OUT, 默认为IN 。 datatype 不需要指定长度。 demo create or replece function get_sal(name IN varchar2) return number as v_sal emp.sal%type; begin select sal into v_sal from emp where upper(ename) = upper(name); return v_sal; exception when on_data_found then raise_application_error(-20000,'can not find this emploey!!!'); end; use function : var sal number exec :sal:=get_sal('scott') print sal delete function : drop function get_sal; 执行 exec function_name (args...); 删除过程 drop function function_name ; 12) 包 包规范: 定义全局变量和公共组件(过程、函数等等) create or replace package pkg_name as g_depyno number(3) := 30; procedure add_emp(args...); function get_sal(args) return number; end pkg_name; 包体: 实现包规范定义的过程和函数。 create package body pkg_body_name as 过程函数的具体实现 也可以定义自己的变量和方法 end pkg_body_name ; 13) 触发器 语句触发器 :当执行DML语句时被隐含执行的触发器。 create or replace trigger tr_sec emp before insert or update or delete on emp begin if to_char(sysdate,'DY','nls_language=AMERICAN') in ('SAT','SUN') then raise_application_error(-20001,'不能在休息日改变雇员信息!'); end; @gdyz */