一、 基本操作 1. 表操作 1.1 复制建表
create table test as select * from dept; --从已知表复制数据和结构
create table test as select * from dept where 1=2; --从已知表复制结构但不包括数据
1.2 复制插入insert into test select * from dept;
1.3 创建临时表临时表是只在会话(SESSION)期间或在事务(TRANSACTION)处理期间存在的表插入数据时,动态分配空间。SESSION级的临时表数据在整个SESSION都存在,直到结束此次 SESSION;而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。语法如下:
create global temporary table 临时表名(表定义)
on commit preserve|delete rows;
说明:
(1) 用preserve时就是SESSION级的临时表,用delete就是TRANSACTION级的临时表;
(2) SESSION级的临时表,被本次会话使用,删除表时需结束本次会话。
示例:
create global temporary table temp_dept
(dno number,
dname varchar2(10))
on commit delete rows;
insert into temp_dept values(10,'ABC');
commit;
select * from temp_dept;-- 无数据显示,事务结束时数据自动清除,应在事务前使用
drop table temp_dept;
2. 序列操作Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方,一般结合触发器使用。
Sequence是数据库系统的特性,有的数据库有Sequence,有的没有。比如Oracle、DB2、PostgreSQL数据库有Sequence,MySQL、SQL Server、Sybase等数据库没有Sequence。
Sequence是数据中一个特殊存放等差数列的表,该表受数据库系统控制,任何时候数据库系统都可以根据当前记录数大小加上步长来获取到该表下一条记录应该是多少,这个表没有实际意义,常常用来做主键用。
2.1 创建要求:
首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。
语法:
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中,可以提高访问效率
示例:
CREATE SEQUENCE LOCATIONS_SEQ
INCREMENT BY 1
START WITH 1
MAXVALUE 9900
MINVALUE 1
CACHE 2;
SELECT LOCATIONS_SEQ.nextval FROM DUAL; --取下一个序列值
SELECT LOCATIONS_SEQ.currval FROM DUAL; --取当前序列值
2.2 修改语法:
alter SEQUENCE sequence //序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
注意事项:
(1)必须是序列的拥有者或对序列有 ALTER 权限
(2)只有将来的序列值会被改变
(3)改变序列的初始值只能通过删除序列之后重建序列的方法实现
2.3 删除使用DROP SEQUENCE 语句删除序列,删除之后,序列不能再次被引用。
二、 运算符算术运算符:+ - * / 可以在select 语句中使用
连接运算符:|| select deptno|| dname from dept;
比较运算符:> >= = != < <= like between is null in
逻辑运算符:not and or
集合运算符: intersect ,union, union all, minus
select * from emp intersect select * from emp where deptno=10 ;--取交集
select * from emp minus select * from emp where deptno=10;--取差集
select * from emp where deptno=10 union select * from emp where deptno in (10,20); --不包括重复行
select * from emp where deptno=10 union all select * from emp where deptno in (10,20); --包括重复行
【注】集合运算符使用注意事项:
1.对应集合的列数和数据类型相同
2.查询中不能包含long 列
3.列的标签是第一个集合的标签
4.使用order by时,必须使用位置序号,不能使用列名、
三、 常用函数 1. 日期函数 1.1 add_months(d,n)返回指定日期加(减)指定月份后(前)的日期:
select sysdate S1,add_months(sysdate,-1) S2,add_months(sysdate,1) S3 from dual;--查询当前时间及其前后一个月的时间
1.2 last_day(d)返回指定日期月的最后一天的日期:
select last_day(sysdate) from dual;
1.3 months_between(d1,d2)返回日期之间的月份差:
select months_between('13-2月-18','15-10月-17') S3 from dual;
1.4 next_day(d,day)返回下个星期的日期(day为1-7或星期日-星期六,1表示星期日):
select sysdate S1,next_day(sysdate,1) S2,next_day(sysdate,'星期日') S3 FROM DUAL
1.5 round(d,[fmt])四舍五入到最接近的日期(不含时间),这里的fmt是可选参数,类似于精确度,默认精确到日,参入day时舍入到最接近的星期日:
select sysdate S1,
round(sysdate) S2,
round(sysdate, 'year') YEAR,
round(sysdate, 'month') MONTH,
round(sysdate, 'day') DAY,
round(sysdate, 'hh') YEAR,
from dual;
1.6 greatest( expr1, ... expr_n )取得值最大值,数字按大小排 ,字符按首字符比较(如果相等则向下比较),日期则返回最晚日期:
select greatest('01-1月-04','04-1月-04','10-2月-04') from dual;
1.7 extract(expr)oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分。
语法如下:
EXTRACT (
{ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }
| { TIMEZONE_HOUR | TIMEZONE_MINUTE }
| { TIMEZONE_REGION | TIMEZONE_ABBR }
FROM { date_value | interval_value } )