1. where 1=2
作用:用于创建一个表和别的表结构一样的。
例:
create table 新表名 as select *
from 源表 where 1=2
2. USERENV用法
USERENV( parameter )
作用:用于返回当前oracle的session
例:
Terminal:=USERENV('TERMINAL');
返回OS的当前session
3 . insert into select 与select into区别
在oracle中,将一张表的数据复制到另外一个对象中。通常会有这两种方法:insert into select 和 select into from。
前者可以将select 出来的N行(0到任意数)结果集复制一个新表中,后者只能将"一行"结果复制到一个变量中。这样说吧,
select into是PL/SQL language 的赋值语句。而前者是标准的SQL语句。
4. 表空间tablespace
表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的是表, 所以称作表空间。Oracle临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间,可自动释放;而表空间中存储表数据、函数、过程、序列等。是随数据库永久存在的。表空间是建立在一个或者多个数据文件上的。默认表空间是USERS
创建表空间:
create tablespace DATATEST
datafile 'D:\SERVER\DATABASE\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATATEST.dbf'
size 100M
autoextend ON
next 10M
maxsize 200M;
创建临时表空间:
create temporary tablespace DATATEST_TEMP
tempfile 'D:\SERVER\DATABASE\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATATEST_TEMP.dbf'
size 50M
autoextend ON
next 10M
maxsize 100M;
#创建表空间
create tablespace shopping --创建表空间shopping
datafile 'shopping.dbf' --表空间使用的数据文件
size 50m --大小50m
autoextend on --自动扩展
next 50m maxsize 20480m --最大可到20480m
extent management local;
比如你这个表空间创建好了你可以建立一个用户,给这个用户设置默认表空间为这个 shopping 语句如下:
create user joling identified by 1qaz2wsx #创建一个用户joling/1qaz2wsx
default tablespace shopping #分配一个默认的表空间shopping
其它用户建表的时候也可以使用这个表空间
比如建表的时候:
create table test (id int) tablespace shopping--前边的建表语句不变,最后加一个使用表空间。
注:表空间只是方便管理
5.over(partition by)分析函数
实现组内累加;group by只能列出group 字段,但是分析函数,可以把表中的不group的字段也列出来。
over(partiton by)用处:
比如初中一年假,有很多班,你用普通的order by只能排出总的名次。
如果要实现班级的前3名,就要写很多sql, 但是用分析函数的排序功能,一步就能实现。
例如:统计各班成绩第一名的同学信息
NAME CLASS Score
----- ----- ----------------------
fda 1 80
ffd 1 78
dss 1 95
cfe 2 74
gds 2 92
gf 3 99
ddd 3 99
adf 3 45
asdf 3 55
3dd 3 78
通过:
--
select * from
(
select name,class,score,rank()over(partition by class order by score desc) mm from t2
)
where mm=1
--
得到结果:
NAME CLASS Score MM
----- ----- ---------------------- ----------------------
dss 1 95 1
gds 2 92 1
gf 3 99 1
ddd 3 99 1
注意:
1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果
2.rank()和dense_rank()的区别是:
--rank()是跳跃排序,有两个第二名时接下来就是第四名
--dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
6.where current of
游标之select for update和where current of 语句,当游标使用了select for update要进行update表和delete操作时才要使用where current of。
使用select for update语句可以使用行锁锁定你要更改的记录.以免别人更改之类的。
当遇到下一个commit和rollback语句时会被释放.
语法如下:The syntax for the Select For Update is:
CURSOR cursor_name
IS
select_statement
FOR UPDATE [of column_list] [NOWAIT];
当你要使用游标进行更新和删除操作时,则需要使用where current of 语句,这个是标示出当前游标的位置.语法如下:The syntax for the Where Current Of statement is either:
UPDATE table_name
SET set_clause
WHERE CURRENT OF cursor_name;
OR
DELETE FROM table_name
WHERE CURRENT OF cursor_name;
举例如下:
例:更新
Declare
cursor test_cur
IS
select * from test
for update of sal;
BEGIN
for test_rec IN test_cur Loop
update test set sal=test_rec.sal+1 where current of test_cur;
end Loop;
commit;
END;
例:删除
Declare
cursor test_cur IS
select * from test for update;
BEGIN
For test_rec IN test_cur LOOP
delete from test where current of test_cur;
end LOOP;
END;
7.purge
清除oracle 回收站(recyclebin)中的表和索引并释放与其相关的空间,还可清空回收站,或者清除表空间中记录的已删除的部分表空间。
注意:purge后不能回滚rollback和恢复(闪回flashback)。
purge和drop的区别:
查看回收站:
SELECT * FROM RECYCLEBIN;
清除回收站:
PURGE recyclebin;
若删除表不进入recycle:
drop table tableName purge;
一般删除的表是进入回收站中:
drop table tablename;
用drop不小心删除了的表可以闪回:
例如:
drop table goodsinfo1;
commit;
删除错了,恢复,可以用flashback drop的功能:
show recyclebin;
FLASHBACK TABLE goodsinfo1 TO BEFORE DROP;
闪回成功,查看:
select count(*) from goodsinfo1;
若用purge table goodsinfo2是不可以恢复的。它不进入recyclebin的。
8.where子句中的LNNVL函数
lnnvl用于某个语句的where子句中的条件,如果条件为真就返回真,否则为假。
其含义可理解为LNNVL == IS NULL OR IS NOT TRUE
Condition=false——>true
Condition=true——>false
Condition 结果未知——>true
它的优势在于处理简单条件判断无法实现的null条件,用举例说明
SQL> select * from plch_employees;
EMPLOYEE_ID LAST_NAME SALARY COMMISSION_PCT
--------------------------------------- -------------------------------------
300 O'Keefe 1000000
100 Picasso 1000000 0.3
200 Mondrian 1000000 0.15
如果要查询commision)不大于20%, 或者为NULL的员工的姓名,则可以用下面
SQL> SELECT last_name FROM plch_employees e WHERE LNNVL (e.commission_pct > .2);
LAST_NAME
--------------------------------------------------------------------------------
O'Keefe
Mondrian
查出小于commision0.2和为null的值,这种方法可以查询出null的值是比较方便的。
selectempno,ename from scott.emp where LNNVL(DEPTNO=0);
9.COALESCE
COALESCE(expr1,expr2……) 如果第一个为NULL就判断第二个,如果第二个为NULL判断第三个,直到最后一个
selectCOALESCE(null,1) a1,COALESCE(null,null,1) a2,COALESCE(null,null) a3 from dual;
10.NANVL
NANVL(n1,n2) 如果n1是数字就返回n1,否则返回n2
select NANVL(1.24,2) a1,NANVL(deptno,2) a2 from scott.emp;
11.NULLIF
NULLIF(expr1,expr2) 如果expr1=expr2返回null,否则返回expr1
selectNULLIF(1,1) a1,NULLIF(1,2) a2 from dual;
12.NVL
NVL(expr1,expr2) 如果expr1为NULL则返回expr2,否则返回expr1
select NVL(NULL,'A') a1,NVL(1,2) a2from dual;
13.NVL2
NVL2(expr1,expr2,expr3)如果expr1不为NULL返回expr2,否则返回expr3
select NVL2(NULL,'A','B')a1,NVL2(NULL,NULL,'Hello')a2,NVL2('A',NULL,'Hello') a3,NVL2('A','A','Hello') a4 from dual;