1.删除重复项, 只保留第一条
delete table t1 where t1.ID not in ( select min(t2.ID) from table t2 group by t2.ColName)
2.查找重复记录
select t1.ID, count(*) from table group by t1.ID having count(*) > 1 order by count(*) desc
3.导入数据时, 如果目标表存在主键且主键在源表中没有对应的字段时, 使用触发器+序列
create or replace trigger res_circuit_uuid_insert
before insert on table
for each row
begin
select SEQ_TABLE_ID.Nextval into :new.ID from dual;
end ;
4.导入数据(目标表已存在, 目标表没有主键或主键约束禁用)
insert into table2 t2
(
t2.col1, t2.col2, ...
)
select distinct
t1.col1, t1.col1, ...
from table1 t1;
5.通过查询直接生成一个新表(结构+数据)
create table new_table
as select * from old_table
nologging
6.通过查询直接生成一个新表(复制表结构)
(1).复制所有字段
create table new_table
as select * from old_table
where 1=2;
(2).复制部分字段
create table new_table
as select col1, col2
from old_table
nologging;
7.修改表结构
(1). 添加列
alter table tableName
ADD
( col1 col_type,
col2 date default sysdate
);
(2). 修改列
alter table tableName
MODIFY
(col1 new_col_type, --更改为新类型
col2 default null
);
(3).删除列
alter table department
DROP
(col1, col2...)
cascade constraints; --删除相关约束
(4).软删除(标记为 unused 状态);
alter table tableName
set UNUSED
(col1, col2)
cascade constraints;
(5).彻底删除
alter table tableName
drop unused columns;
8.删除表
(1).删除所有记录(适用于记录数量小的表)
delete from tableName;
(2).drop table tableName
create table new_table
as select * from old_table;
(3).(适用于大量记录的表)
truncate table tableName;
9.表重命名
rename old_tableName
to new_tableName
10.添加注释
(1). 给表添加注释
comment on table tableName
is
'这是一个新表...'
(2). 给列添加注释
comment on COLUMN
tableName.columnName is
'这是一个列'
11.字典表
<1>.用户和概要文件相关的数据字典视图
(1).dba_users
--DBA视图描述数据库中的所有用户
select * from dba_users db
db.username --用户名
db.user_id --用户ID
db.password --口令(加密)
db.account_status --账户状态:OPNE || EXPIRED || LOCKED
db.expiry_date --终止日期
db.default_tablespace --表空间
db.created --创建日期
(2).all_users
--all视图列出当前用户可以看见的用户,
--但不予描述, 即只列出 UserName, User_ID, Created(date)
select * from all_users
(3).user_users
--仅仅列出当前用户的信息
select * from user_users
(4).dba_profiles
--显示所有的概要文件的资源参数
--pro.profile: 概要文件名称
--pro.resource_name: 资源名称:如 password_grace_time
--pro.resource_type: 资源类型:如:password
--pro.limit: 是否限制
select * from dba_profiles pro
(5).user_password_limits
--通过概要文件为用户设置的口令资源参数视图
--resusece_name: 资源名称:failed_login_attempts
--limit:限制状态
select * from user_password_limits
<2>.权限与角色字典视图
(1).dba_col_privs
--DBA视图描述了数据库中的所有列对象的授权
select * from dba_col_privs pri
pri.grantee --用户或角色(因为权限可以直接赋予用户)
pri.owner --所有者
pri.table_name --(列所属表名称)
pri.column_name --列
pri.grantor --
pri.privilege --权限
pri.grantable
(2).user_col_privs
--当前用户的所有列对象的授权
(3).dba_tab_privs
--DBA视图描述了数据库中的所有对象的(非系统的)授权
select * from dba_tab_privs pr
pr.grantee --用户或角色(被授权者)
pr.owner --使用者
pr.table_name --表
pr.grantor --授权者
pr.privilege --权限
pr.grantable --是否table对象
(4).user_tab_privs
--当前用户被授予的所有 对象的(非系统)授权
--对象权限包括:privilege:select, delete, update....
select * from user_tab_privs
(5).user_sys_privs
--当前用户的所有系统权限
select * from user_sys_privs
--系统权限包括:
--: create role,rule, type, user, view, table, cluster, trigger
--: create library, session, synonym, trigger, sequence, procedure.
select * from user_sys_privs p1 where p1.privilege like 'CREATE%'
(6).dba_sys_privs
--dba的系统权限
select * from dba_sys_privs
(7).user_role_privs
--授予给当前用户的角色
--userName: 用户名
--granted_role: 被授予的角色
--admin_option: 此用户下的用户是否可以被继承此用户的角色
(8).role_sys_privs
--授予给角色的系统权限的信息
--role : name
--privilege: 权限
--amdin_option: 是否可以被继承
(9).role_tab_privs
--授予给角色的对象的(table)权限
--role:Name
--owner: user
--table_name:tableName
--column_name:
--privilege:alter, debuge, insert;;;;;
(10).session_privs
--用户当前启用的权限
(11).session_roles
--用户当前启用的角色
<3>.其他字典表
(1). 注释表
user_tab_comments
(2).软删除表
user_unused_col_tabs;
12.添加约束
(1).Not NULL
Alter table tableName
Modify column Not null;
相当于是更改列定义,故为 Modify
(2).Unique
Alter table tableName
Add Unique(col1, col2);
一个列只能定义一个唯一约束(名称)
(3).Check
Alter table tableName Add Constraint Check_Col1
Check(col1 betweetn 12 to 34);
不适当的数据类型上定义约束条件(如字符类型上定义数字范围)会报错
(4).Foreign Key
Alter table tableName Add Constraint new_FK
Foreing Key (col1) References
tableName2 (col2) on
Delete Set NULL;
说明: a: Delete Cascade: 删除子表中所有相关的记录
b: Delete Set NULL: 将所有相关记录的外键列的值设置为NULL
c: Delete No Action: 不进行任何操作,关联表没影响
d: 父表: tableName2; 子表: tableName
e: 外键不可重复定义(尽管可能名称不同)
13.激活,禁用, 验证约束
(1).激活 CHK_SEX 约束
Alter table tableName
Enable constraint to CHK_SEX;
(2).激活 Unique 约束
Alter table tableName
Enable Unique (col1);
(3).禁用约束 CHK_SEX
Alter table tableName
Disable constraint CHK_SEX;
(4).验证约束
Alter Table tableName
Enable Validate constraint CHK_SEX;
(5).非验证约束
Alter table tableName
Enable NoValidate constraint CHK_SEX;
14.删除约束
(1).删除名称 Chk_Sex约束
Alter table tableName Drop Contraint Chk_Sex;
(2).删除 Unique 约束
Alter table tableName drop unique (col1);
(3).删除外键 约束
Alter table tableName Drop primary key cascade;
说明: 加入 casecade表示删除主键时同时会删除 子表中的外键约束
(4).删除 Not NULL
Alter Table tableName modify col1 NULL;
15. 修改约束名
(1).alter table tableName rename constraint check_sex to chk_sex;
16.延迟执行约束
原因:有时必须得延迟某个约束
比如: 如果某个表有外键约束(子表), 当向此表插入一条数据时, 而此记录数据还没有相应的父表中插入;
因为约束是默认是立即执行的, 这时通不过外键约束, 插入到子表中的记录会被回退.
但是如果延迟些外键约束, 把给子表和父表插入记录的过程放在在一个事务中,
用户可以随便颠倒父子表的次序的插入记录
当提交事务时再执行外键约束.
e.g
alter table tableName
modify constraint FK_tableName
Initially Deferred;
SQL>Insert Into tablName (xx, xx) values (xx, xx);
SQL>Insert Into tableName2(xx, xx) values (xx, xx);
SQL>Commit;
OK!
17.前 n 行
where rownum <= num
18.触发器
create or replace trigger tr_emp_sal_comm
before update of sal, comm
or delete
on emp
for each row
when( old.job='salesman') --指定条件: 此触发器只针对销售部门有效
begin
case
when updating ( 'sal') then
if :NEW.sal < :OLD.sal then
Raise_application_error(-20001, '销售人员工资只能涨不能降');
end if;
when deleting then
Raise_application_error(-20003, '不能删除emp表的销售人员记录');
end case;
end;
19.过程
(1).定义过程
create or replace procedure query_emp
(v_no emp.impno%TYPE,
v_name out emp.ename%TYPE,
v_sal out emp.sal%TYPE
)
IS
e_sal_error exception;
begin
select ename, sal --给变量赋值
into v_name, v_sal
from emp where empon=v_no;
if v_sal <= 2500 then
DBMS_OUTPUT.PUT_LINE('该员工工资: '|| v_sal);
Raise e_sal_error; --捕获异常: 如果不符合条件都可以当作异常来对待
end if;
exception --抛出异常
when no_data_found then
dbms_output.put_line('没有该员工':'||v_no);
when e_sal_error then
dbms_output.put_line('该员工工资高于 2500了');
end query_emp;
(2).调用过程
set serveroutput on --开启输出
declare
v_a1 emp.ename%TYPE;
v_a2 emp.sal%TYPE;
BEGIN
--调用存储过程;
-- => 表示按名称 对应关系;注: 后面必须要有分号
query_emp(v_name => v_a1, v_sal => v_a2, v_no => 5678);
if v_a2 > 2500
dbms_output.put_line('工资高于2500')
end if;
End;
20.函数
(1)创建函数
函数与过程的区别
1.函数必须要有 return;
2.函数更侧重于数据相关;过程更侧重于常用操作相关;
create or replace function get_salary_by_deptno
(v_dept_no in emp_deptno%TYPE, --输入部门号
v_emp_cnt out number) --输出部门人数
return number
IS
v_sum number(10, 2); --返回指定部门的工资总和
begin
select sum(sal), count(*) into v_sum, v_emp_cnt from emp
where deptno=v_dept_no;
return v_sum;
end get_salary_by_deptno;
(2)调用函数
set serveroutput on
declare
v_a1 emp.deptno%TYPE;
v_a2 number;
v_sum number(10,2);
begin
v_sum := get_salary_by_deptno
(v_emp_cnt => v_a2, v_dept_no => 10);
if v_a2 =0 then --可直接使用 v_a2; 因为它是函数输出的;
DBMS_OUTPUT.PUT_LINE('该部门无人');
else
DBMS_OUTPUT.PUT_LINE('该部门工资总合: ' || v_sum || '人数: ' || va2 );
end if;
end;
21. Oracle客户端用户管理文件
(Oracle客户端安装目录)
C:\oracle\ora92\network\ADMIN\tnsnames
22.创建序列
create sequence SEQ_TABLE_ID
minvalue 1
maxvalue 999999
start with 10001
increment by 1
cache 20;
23.游标应用
create or replace procedure curor_check_wrong_cols is
begin
EXECUTE IMMEDIATE 'DELETE FROM result_table;
DECLARE
S_TABLENAME VARCHAR(100);
S_CHECK_VALUES VARCHAR(4000);
CURSOR C_FOR_TABLE IS
SELECT TABLE_NAME, NAME FROM table;
BEGIN
OPEN C_FOR_TABLE;
LOOP
FETCH C_FOR_TABLE
INTO S_TABLENAME;
EXIT WHEN C_FOR_TABLE%NOTFOUND;
S_CHECK_VALUES := 'INSERT INTO table_result (TABLE_NAME, ID, ERROR_ROWS_COUNT)
(SELECT ''' || S_TABLENAME || ''', ''', '1001', COUNT(*) FROM ' || S_TABLENAME ||
' WHERE col2 IS NULL)'; --NOT IN ( SELECT table2.col2 FROM table2 GROUP BY col2))';
EXECUTE IMMEDIATE S_CHECK_VALUES;
END LOOP;
S_CHECK_VALUES := 'DELETE FROM table_result WHERE ERROR_ROWS_COUNT < 1 ';
EXECUTE IMMEDIATE S_CHECK_VALUES;
END;
end curor_check_wrong_cols;
24. 利用 union 结合游标将 表1中的字段1, 字段2插入到 表2字段 1中.
create or replace procedure pro_imp_colName is
begin
DECLARE
col1 varchar(1000);
sqlstr VARCHAR(4000);
CURSOR C_FOR_TABLE IS
select distinct col1 from
(select distinct col1 from tableName union select distinct col2 from tableName
BEGIN
OPEN C_FOR_TABLE;
LOOP
FETCH C_FOR_TABLE
INTO col1;
EXIT WHEN C_FOR_TABLE%NOTFOUND;
sqlstr := 'INSERT INTO table2(col1,col2) values
( ''' || col1|| ''', 0)';
EXECUTE IMMEDIATE sqlstr;
END LOOP;
END;
end pro_imp_colName;
25.导入数据时屏蔽重复记录(从table1向table2导入数据)
create or replace trigger table2_col1_insert
after insert
on table1
for each row
declare
-- local variables here
col1Count integer;
begin
--调用存储过程判断 col1 字段是否有已经存在当前要插入的值.
col1_is_null(colName1 => :NEW.colName1, intcount => col1Count);
EXECUTE IMMEDIATE sqlstr;
if( col1Count =0) then
insert into table2
(col1, col2, col3)
values
(:NEW.col1, :NEW.col2,0);
end if;
end ;
--对应的存储过程
create or replace procedure col1_is_null
(colName1 in varchar, intcount out integer )
as
begin
select count(*) into intcount from table2 where col1=colName;
end ;
26. 创建3种类型的索引
创建索引过程:
1.创建索引时会对全表进行扫描
2.对索引列的数据进行排序 --原理
3.为索引分配存储空间
4.将索引的定义信息保存到数据字典中.
创建:
<1>. 创建标准(B树)索引:
条件: 如果在 where 条件子句中要经常引用 某列或某几列, 就应该基于这些列创建B树索引.
1.创建单列索引
create INDEX idx_table_col on table(colName)
PCTFREE 30
TABLESPACE tablespace_Index;
说明: pctfree 指定将来 insert 操作预留的空间.
因为插入新记录总会创引入新索引值进来.因此预留空间要求较大.
2.创建多列索引
create INDEX idx_table_col1_col2 on table(col1, col2)
pctfree 30
tablespace tablespace_index;
<2>.创建位图索引
条件: 某列上记录值的基数很小, 只是有限的几个固定值,如性别,婚姻状态等如果需要建立索引,
就应该建立位图索引.
1.单列位图索引
create bitmap index bmidx_table_col on table(colName);
<3>.创建函数索引.
条件: 当 where 子句中使用了函数和表达式时, 为这些函数和表达式建立函数索引后,
select 的速度会提高.
1. 创建函数索引
create Index funidx_col on table(col1+col2+col3*0.5)
查询下列语句时速度会加快:
select * from table where (col1+col2+col3*0.5) < 500;
2.创建函数索引2
create Index funidx_table_col on table Substr(col1, 1, 2)
compute statistics;
查询col1列的头两位时速度会明显加快
select * from table where Substr(col1, 1, 2) in ('12', '34');
27.更改,重命名,合并, 重建
(1).更改:
Alter Index indexName **;
(2).重命名:
Alter Index indexName RENAME TO indexName2;
(3).合并索引: (清除更新产生的磁片)
Alter Index indexName COALESCE;
(4).重建索引:(重新建立一个索引, 删除还来的索引, 但是各种参数不变);
Alter Index indexName REBUILD
TABLESPACE ANOTHER;
28.监视索引
(1).查询 V$object_usage, 了解索引的被监视情况
select index_name, monitoring, used, start_monitoring, end_monitoring
from V$OBJECT_USAGE;
结果:
未选定行
说明没有任何索引被监视.
(2).修改索引使之被监视.
Alter Index indexName MONITORING USAGE;
(3).再查询被监视情况:
结果:
indexName, yes, no, timeNow;
(4).执行查询后(利用索引)
再查询结果:
indexName, yes, yes, timeNow;
可见, usered=yes; 表示从开始监视以来索引已经被使用过了.
29.索引的空间控制
(1).分配索引空间
Alter index indexName ALLOCATE EXTENT(SIZE 100K);
(2).释放多余空间
Alter INDEX indexName DEALLOCATE UNUSED;
30.查看与删除索引
(1).查看
select index_name, index_type, tablespace_name, uniquesness, logging
from user_indexes
where table_name='tableName';
--DBA_INDEXES; --所有索引
--ALL_INDEXES;
--USER_INDEXES;
--DBA_IND_COLUMNS; --索引列
--ALL_IND_COLUMNS;
--USER_IND_COLUMNS;
(2).删除
drop INDEX indexName;
31.同义词
引入同义词原因:
在开发数据库应用程序时, 应该普遍遵守的规则是尽量避免直接引用表,视图或其他对象.
否则,当DBA改变了表的名称或者结构,就必须重新改变并编译应用程序.
因此需要为对象建立同义词.
建立对象条件:
1.重要的对象;
2.分布式系统;
3.名称长而复杂;
语法:
create [or replace] public Synonym synonym_name
for [schema.]ojbect;
ege:
create or replace SYNONYM syn_students
for students
使用同义词:
select * from syn_students;
insert into syn_students values (**, **, **,..);
32.序列
需求
1.主键, 外键;
2.流水号;
创建:
create Sequence sequence
[start with n1] --起始值
[increment by n2] --递增量
[{maxvlue n3 | nomaxvalue }] --最大值(如果没有指定最大值则为:1027)
[{minvlue n4 | nominvalue }] --最小值(同上:-1026)
[{cache n5 | nocache}] --预分配的序列个数,使用不完作废
[{cycle | nocycle}] --序列使用完后是否循环
[order]; --按顺序生成序列
ege;
create SEQUENCE Seq_id
Increment by 1
Start with 300
MaxVulue 999999999
MinVule 1
Cache 10
Order;
使用序列:
(1).下一个序列
sequence_name.nextval;
(2).当前序列
sequence_name.currval;
ege:
select * from sequence_name.currval from dual;
更改序列
Alter Sequence sequence
--同创建相同;
删除:
Drop Sequence sequence;
查看所有序列:
select * from user_sequence;
33. 视图
引入视图目的:
(1).提供各种数据表现形式
(2).提供某些数据的安全性
(3).隐藏数据的复杂性
(4).简化数据的查询语句
(5).执行特殊查询
(6).保存复杂查询
<1>.创建视图:
Create [Or Replace] [force] View [Schema.] view_name
[(col1, col2, ...)]
As select ...
[With Check Option] [Constraint constraint_name]
[Woth Read Only];
说明:
--force: 强制创建视图,不考虑基础表是否存在或是否有权限, 这样保证操作的独立性;
--With Check Option: 使用视图时,检查涉及的数据是否通过select子查询的约束条件,否则不允许操作。
ege:
创建一般视图
Create View v_table
as
select * from
tableName;
创建连接视图:
Create View v_table
as
select a.col1, a.col2, b.col1, b.col5
from table1 a, table2 b
where a.col1=b.col5
and a.col2 in (values1, values2);
创建复杂视图
Create View v_table
As
select col1, avg(col2), sum(col3), max(col4), min(col5)
from table
group by col1;
<2>.使用视图
1.select
select * from view_name;
2.DML操作
对于基础表为一张表的直接使用 DML语句
对于基础表为多张表的视图使用下列方法:
键保存表概念:
--如果连接视图中的一个基础表的键(主键,唯一键)在它的视图中仍然存在, 则称这个基础表为
键保存表(key-preserved)。键保存表中的主键在他的视图中仍然是主键。
即:子表为键保存表,父表为非键保存表;
原则:
1.一次只能对视图中的一个键保存表进行更新。
2.如果视图有 With Check Option选项
则不能对连接视图执行 DML 操作
<3>.修改视图:
由于视图只是一个虚表,更改只是更改它的定义。
使用下面方法会重新创建一个新的视图,但会保留原视图上的所有设置(如授权等)
Create or replace view v_table
<4>.删除视图
Drop View view_table
<5>.查看视图字典:
user_views;
34. 口令策略
--创建用于口令的概要文件(口令策略)
--此概要文件为系统自带的口令策略文件
create profile default limit
password_life_time 60 --60天内必须使用此口令
password_grace_time 10 --60天后的10天里必须更改此口令
password_reuse_time 1800 --1800天内不可重用此口令
password_reuse_max unlimited --下次使用此口令时中间要换口令无限次(也就是说:永远不再使用此口令)
password_login_attempts 3 --口令输入累计的失败次数, 3次后用户锁死此用户
password_lock_time 1 --锁死时间:1天
--系统自带的口令校验脚本
password_verify_function verify_function; --口令校验脚本(为一函数,名称为:verify_function)
--创建用户或修改用户时添加口令管理(default)
create user userName Profile default;
alter user userName2 profile default;
--锁定账户
Alter user userName Account Lock;
--解锁账户
Alter user userName Account UnLock;
35. ORACLE函数大全 (SQL中的单记录函数)
一. 字符
1.ASCII
返回与指定的字符对应的十进制数;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
A A ZERO SPACE
--------- --------- --------- ---------
65 97 48 32
2.CHR
给出整数,返回对应的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;
ZH C
-- -
赵 A
3.CONCAT
连接两个字符串;
SQL> select concat('010-','88888888')||'转23' 高乾竞电话 from dual;
高乾竞电话
----------------
010-88888888转23
4.INITCAP
返回字符串并将字符串的第一个字母变为大写;
SQL> select initcap('smith') upp from dual;
UPP
-----
Smith
5.INSTR(C1,C2,I,J)
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1
SQL> select instr('oracle traning','ra',1,2) instring from dual;
INSTRING
---------
9
6.LENGTH
返回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;
NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾竞 3 北京市海锭区 6 9999.99 7
7.LOWER
返回字符串,并将所有的字符小写
SQL> select lower('AaBbCcDd')AaBbCcDd from dual;
AABBCCDD
--------
aabbccdd
8.UPPER
返回字符串,并将所有的字符大写
SQL> select upper('AaBbCcDd') upper from dual;
UPPER
--------
AABBCCDD
9.RPAD和LPAD(粘贴字符)
RPAD 在列的右边粘贴字符
LPAD 在列的左边粘贴字符
SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;
LPAD(RPAD('GAO',1
-----------------
*******gao*******
不够字符则用*来填满
10.LTRIM和RTRIM
LTRIM 删除左边出现的字符串
RTRIM 删除右边出现的字符串
SQL> select ltrim(rtrim(' gao qian jing ',' '),' ') from dual;
LTRIM(RTRIM('
-------------
gao qian jing
11.SUBSTR(string,start,count)
取子字符串,从start开始,取count个
SQL> select substr('13088888888',3,8) from dual;
SUBSTR('
--------
08888888
12.REPLACE('string','s1','s2')
string 希望被替换的字符或变量
s1 被替换的字符串
s2 要替换的字符串
SQL> select replace('he love you','he','i') from dual;
REPLACE('H
----------
i love you
13.SOUNDEX
返回一个与给定的字符串读音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');
SQL> select xm from table1 where soundex(xm)=soundex('weather');
XM
--------
weather
wether
14.TRIM('s' from 'string')
LEADING 剪掉前面的字符
TRAILING 剪掉后面的字符
如果不指定,默认为空格符
二.数字处理
15.ABS
返回指定值的绝对值
SQL> select abs(100),abs(-100) from dual;
ABS(100) ABS(-100)
--------- ---------
100 100
16.ACOS
给出反余弦的值
SQL> select acos(-1) from dual;
ACOS(-1)
---------
3.1415927
17.ASIN
给出反正弦的值
SQL> select asin(0.5) from dual;
ASIN(0.5)
---------
.52359878
18.ATAN
返回一个数字的反正切值
SQL> select atan(1) from dual;
ATAN(1)
---------
.78539816
19.CEIL
返回大于或等于给出数字的最小整数
SQL> select ceil(3.1415927) from dual;
CEIL(3.1415927)
---------------
4
20.COS
返回一个给定数字的余弦
SQL> select cos(-3.1415927) from dual;
COS(-3.1415927)
---------------
-1
21.COSH
返回一个数字反余弦值
SQL> select cosh(20) from dual;
COSH(20)
---------
242582598
22.EXP
返回一个数字e的n次方根
SQL> select exp(2),exp(1) from dual;
EXP(2) EXP(1)
--------- ---------
7.3890561 2.7182818
23.FLOOR
对给定的数字取整数
SQL> select floor(2345.67) from dual;
FLOOR(2345.67)
--------------
2345
24.LN
返回一个数字的对数值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;
LN(1) LN(2) LN(2.7182818)
--------- --------- -------------
0 .69314718 .99999999
25.LOG(n1,n2)
返回一个以n1为底n2的对数
SQL> select log(2,1),log(2,4) from dual;
LOG(2,1) LOG(2,4)
--------- ---------
0 2
26.MOD(n1,n2)
返回一个n1除以n2的余数
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;
MOD(10,3) MOD(3,3) MOD(2,3)
--------- --------- ---------
1 0 2
27.POWER
返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual;
POWER(2,10) POWER(3,3)
----------- ----------
1024 27
28.ROUND和TRUNC
按照指定的精度进行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;
ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
56 -55 55 -55
29.SIGN
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual;
SIGN(123) SIGN(-100) SIGN(0)
--------- ---------- ---------
1 -1 0
30.SIN
返回一个数字的正弦值
SQL> select sin(1.57079) from dual;
SIN(1.57079)
------------
1
31.SIGH
返回双曲正弦的值
SQL> select sin(20),sinh(20) from dual;
SIN(20) SINH(20)
--------- ---------
.91294525 242582598
32.SQRT
返回数字n的根
SQL> select sqrt(64),sqrt(10) from dual;
SQRT(64) SQRT(10)
--------- ---------
8 3.1622777
33.TAN
返回数字的正切值
SQL> select tan(20),tan(10) from dual;
TAN(20) TAN(10)
--------- ---------
2.2371609 .64836083
34.TANH
返回数字n的双曲正切值
SQL> select tanh(20),tan(20) from dual;
TANH(20) TAN(20)
--------- ---------
1 2.2371609
35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;
TRUNC1 TRUNC(124.16666,2)
--------- ------------------
100 124.16
三. 日期
36.ADD_MONTHS
增加或减去月份
SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;
TO_CHA
------
200002
SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;
TO_CHA
------
199910
37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;
TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;
LAST_DAY(S
----------
31-5月 -04
38.MONTHS_BETWEEN(date2,date1)
给出date2-date1的月份
SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;
MON_BETWEEN
-----------
9
SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;
MON_BETW
---------
-60
39.NEW_TIME(date,'this','that')
给出在this时区=other时区的日期和时间
SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time
2 (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;
BJ_TIME LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32
40.NEXT_DAY(date,'day')
给出日期date和星期x之后计算下一个星期的日期
SQL> select next_day('18-5月-2001','星期五') next_day from dual;
NEXT_DAY
----------
25-5月 -01
41.SYSDATE
用来得到系统的当前日期
SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;
TO_CHAR(SYSDATE,'
-----------------
09-05-2004 星期日
trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒
SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,
2 to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;
HH HHMM
------------------- -------------------
2004.05.09 11:00:00 2004.05.09 11:17:00
42.CHARTOROWID
将字符数据类型转换为ROWID类型
SQL> select rowid,rowidtochar(rowid),ename from scott.emp;
ROWID ROWIDTOCHAR(ROWID) ENAME
------------------ ------------------ ----------
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES
43.CONVERT(c,dset,sset)
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集
SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;
conver
------
strutz
44.HEXTORAW
将一个十六进制构成的字符串转换为二进制
45.RAWTOHEXT
将一个二进制构成的字符串转换为十六进制
46.ROWIDTOCHAR
将ROWID数据类型转换为字符类型
47.TO_CHAR(date,'format')
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2004/05/09 21:14:41
48.TO_DATE(string,'format')
将字符串转化为ORACLE中的一个日期
49.TO_MULTI_BYTE
将字符串中的单字节字符转化为多字节字符
SQL> select to_multi_byte('高') from dual;
TO
--
高
50.TO_NUMBER
将给出的字符转换为数字
SQL> select to_number('1999') year from dual;
YEAR
---------
1999
四. 其他
51.BFILENAME(dir,file)
指定一个外部二进制文件
SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));
52.CONVERT('x','desc','source')
将x字段或变量的源source转换为desc
SQL> select sid,serial#,username,decode(command,
2 0,'none',
3 2,'insert',
4 3,
5 'select',
6 6,'update',
7 7,'delete',
8 8,'drop',
9 'other') cmd from v$session where type!='background';
SID SERIAL# USERNAME CMD
--------- --------- ------------------------------ ------
1 1 none
2 1 none
3 1 none
4 1 none
5 1