where子句--执行顺序为自下而上、从右到左(表之间的连接必须写在其他Where 条件之前, 可以过滤掉最大数量记录的条件必须写在Where 子句的末尾)
数据库在处理SQL以前,都会去分析,发现查询的条件中是否有索引,如果有,县更具索引查找。那么优先根据姓名的条件,去检索,然后再去把通过索引得到的数据,
验证Oracle查询条件是从左向右还是从右向左:
方法一:(第1条语句执行不会出错,第2条语句会提示除数不能为零。说明从右 --> 左)
Select ‘ok‘ From Dual Where 1 / 0 = 1 And 1 = 2; Select ‘ok‘ From Dual Where 1 = 2 And 1 / 0 = 1;
select * from temp where to_number(t2)>1 and t1=‘sz‘;
select * from temp where t1=‘sz‘ and to_number(t2)>1;
方法二:(Output中可以清楚的看到结果)
Create Or Replace Function F1(v_In Varchar2) Return Varchar2 Is
Begin
Dbms_Output.Put_Line(‘exec F1‘);
Return v_In;
End F1;
/
Create Or Replace Function F2(v_In Varchar2) Return Varchar2 Is
Begin
Dbms_Output.Put_Line(‘exec F2‘);
Return v_In;
End F2;
/
select 1 from dual where f1(‘1‘)=‘1‘ and f2(‘1‘)=‘1‘;
select 1 from dual where f2(‘1‘)=‘1‘ and f1(‘1‘)=‘1‘;
groupby--执行顺序从左往右分组
分组:排序去组内最大:
select deptno,ename,sal from
(select deptno,ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order
from scott.emp) where sal_order <2;
decode函数:
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)
原理:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
Oracle常用系统函数:
字符类型:select ASCII(‘c‘) from dual; ---90
select CHR(90) from dual;---z
select concat(‘hello ‘,‘world‘) from dual;select ‘hello ‘ | ‘world‘ from dual;
---hello world
select initcap(‘oh my god!‘) from dual; ---Oh My God!
select instr(‘oracle 11g‘,‘1‘,3,2) from dual; ---9 从第3个字符开始查询字符串“1”第2次出现的位置。
select length(‘123‘) from dual; --- 3
select lower(‘HELLO‘),upper(‘hello‘) from dual;
---hello,HELLO
select ltrim(‘####hello###‘,‘#‘),rtim(‘Hello ‘),trim(‘#‘ from ‘##Hello###‘) from dual;
--- hello###,Hello,Hello
select replace(‘Bad Luck Bad Gril‘,‘Good‘) from dual;
---Good Luck Good Gril
select substr(‘MessageBox‘,8,3) from dual;---Box
数字类函数:ABS(n) --> 绝对值
CELL(n)
--> >= n 的最小整数
COS(n)
--> n 的余弦值,n为弧度
EXP(n)
--> e 的n 次幂
FLORR(n)
--> <= n 的最大整数
LOG(n1, n2)
--> 以n1为低n2的对数
MOD(n1,n2) --> n1 除以 n2 的余数
POWER(n1,n2)--> n1 的 n2 次方
ROUND(n1,n2)--> 返回小数点最接近的整数
SIGN(n)
--> 负数返回-1,整数返回1,0返回0
SIN(n)
--> 返回正弦值
SQRT(n)
--> n 的平方根
TRUNC(n1,n2)--> ....
日期、时间类函数: select sysdate from dual; select add_months(sysdate,6) from dual;-- 返回sysdate加上6个月的结果 last_day(d)--- 返回日期d的最后一天,d为时间类型 months_between(d1,d2)---d1,d2 为时间类型 new_time(d1,t1,t2)---d1 为日期类型,t1,t2 为字符串
转换类函数: to_char(x) 或者 to_char(x,‘YYYY-MM-DD‘) to_date(x) 或者 to_date(x,‘YYYY-MM-DD‘) to_number(x)
闪回功能恢复被删除的表:
1.确认表是否被删除:select * from student;
2.确认删除后,去回收站查询看看:select object_name,original_name from recyclebin where original_name = ‘STEDENT‘;
3.使用FLASHBACK TABLE 语句恢复被删除的表:flashback table student to before drop;