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;