一、Oracle判断
if(...) then
PL/SQL语句;
elsif(...) then
PL/SQL语句;
else
PL/SQL语句;
end if;
二、Oracle循环
1. for循环
语法格式:
for 变量 in [revers] 变量初值..变量循环结束值 loop
......
end loop;
示例1:
for i in 1..10 loop
dbms_output.put_line(‘i = ‘ + i);
end loop;
示例2:
declare
sum number :=0;
begin
for i in (select sal from emp where empno between 7000 and 8000) loop
sum:=sum+i.sal;
end loop;
dbms_output.put_line('员工编号范围是7000到8000工资的和是'||sum);
end;
2. while循环
语法格式:
while 条件
loop
语句
end loop
示例:
DECLARE
i number;
BEGIN
i:=0;
WHILE i<9 LOOP
i:=i+1;
DBMS_OUTPUT.PUT_LINE('内:i='||i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外:i='||i);
END;
3. loop循环
语法格式:
loop
循环语句
end loop;
示例:
DECLARE
i number;
BEGIN
i:=0;
LOOP
i:=i+1;
EXIT WHEN i>9;
DBMS_OUTPUT.PUT_LINE('内:i='||i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外:i='||i);
END;
4. goto循环
示例:
DECLARE
i number;
BEGIN
i:=9;
<<repeat_loop>> --循环点
i:=i-1;
DBMS_OUTPUT.PUT_LINE(X);
IF i>0 THEN
GOTO repeat_loop; --当i的值小于9时,就goto到repeat_loop
END IF;
END;
三、Oracle关键字
1. in
where "列名" in ('value1','value2'...)
2. or 或、and 与
and的优先级大于or的优先级
可以用in避免使用or
where date ='1996,06,04' or date ='1998,01,26'
where date in('1996,06,04','1998,01,26')
3. like
like的模糊查询,其通配符如下:
% 表示零个或多个字符
_ 单一任意字符
\ 特殊字符
[ ] 在某种范围内的字符,如[0-9]、[abcd]
[^ ] 不在某种范围内的字符,如[^0-9]、[^abcd]
like '%a%' 是指字符串中有a都算,%是一个或多个字符
like '%a' 是指字符串中以a结尾
like 'a%' 是指字符串中以a开头
like '_a_' 是指字符串中有a都算,_只是一个字符
like '_a' 是指字符串中以a结尾
like 'a_' 是指字符串中以a开头
4. minus
minus 直接翻译为中文是 “减” 的意思,在Oracle中也是用来做减法操作的,只不过它不是传统意义上对数字的减法,而是对查询结果集的减法。A minus B就意味着将结果集A去除结果集B中所包含的所有记录后的结果,即在A中存在,而在B中不存在的记录。
Oracle的minus是按列进行比较的,所以A能够minus B的前提条件是结果集A和结果集B需要有相同的列数,且相同列索引的列具有相同的数据类型。此外,Oracle会对minus后的结果集进行去重。
四、Oracle符号
1. +
where A.ID(+)=B.ID 右外连接 相当于A right outer join B on ( A.ID=B.ID);
where B.ID=B.ID(+) 左外连接 相当于A left outer join B on ( A.ID=B.ID);
哪边有(+)哪边就允许为空
2. ||
--字符串连接
相当于 mssql中的 +
例: ‘abc’ || 'def' 结果为:'abcdef'
相当于 ‘abc’ + 'def'
五、Oracle游标使用
1.隐式游标
2.显示游标
3.ref 游标
oracle中open cursor for 和for cursor in的区别如下:
open cursor for是直接打开游标查询结果,适用于单表查询,
结果集一般不会太大,用法如下:
create or replace procedure zhazha.test(p_cursor out test.cursortype) as
begin
open p_cursor for //打开游标
select *from from test_table
end test;
-------------------------------------------------------------------------------
for cursor in是从大量数据中循环获取满足条件的记录,放入游标,用法如下:
六、Remark
1. where 1 = 1
1=1 是永恒成立的,意思无条件的,也就是说在SQL语句里有没有这个1=1都可以
后面不用判断有没有where条件,直接加and…
这个1=1常用于应用程序根据用户选择项的不同拼凑where条件时用的。
如:web界面查询用户的信息,where默认为1=1,这样用户即使不选择任何条件,sql查询也不会出错。如果用户选择了姓名,那么where变成了where 1=1 and 姓名=‘用户输入的姓名’,如果还选择了其他的条件,就不断在where 条件后追加 and语句就行了。如果不用1=1的话,每加一个条件,都要判断前面有没有where 条件,如果没有就写where …,有就写and语句,因此此时用1=1可以简化了应用程序的复杂度
2. count / distinct
使用count(1)、count(*)、count(rowid)统计行数
select count(1) from table1; 为null也算一条记录
select count(*) from table1;
select count(row) from table1;
// 表示不包括为 null 的并去掉重复的,若rowid可能为空时,查询结果比前两个少
select count(distinct row) from table1;
distinct 去重(查询结果显示时去重)
查找名字对应(去重)的ID
select *, count(distinct name) from table group by name
结果:
id name count(distinct name)
1 a 1
2 b 1
3 c 2