Oracle 学习笔记--入门篇

/*

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
	





*/

你可能感兴趣的:(Oracle 学习笔记--入门篇)