Loading

Oracle表的管理

字符型

char 定长,最大2000字符

      char(10) '小明',后面6个字符将被浪费掉,适合定义固定长度和经常被查询的字段,例如身份证号码,效率高

varchar2 变长,最大4000字符

      varchar2(10) '小明'  后面6个字符空间将被节省

clob  字符型大对象,最大4G

 

数字型

number   -10的38次方~10的38次方

     number(5,2) 表示5位有效数字,其中两位小数   -999.99~999.99

number(5)  表示5位整数

 

日期类型

   date   包含年月日时分秒

 

图片

     blob  可以存放声音和图片

 

建表

create table student (--表名
ID number(4),          --学号
name varchar2(20),     --姓名
sex char(2),           --性别
birthday date,         --生日
sal number(7,2)        --奖学金
)
注意:查看你数据库的字符类型 SELECT * FROM v$nls_parameters WHERE PARAMETER = 'NLS_CHARACTERSET'; 如果value=AL32UTF8  那么一个中文字符占用3个字节,你要设char(3)

删除表


drop table table_name purge

清空表,保留表结构

delete from student;     --保留表结构,写日志,用rollback可以恢复
truncate table student;  --截断表,不写日志,无法恢复,速度快
 

增加字段

alter table student add(classID number(2));

修改字段

alter table student modify (name varchar2(30));     --更改字符型
alter table student modify name not null; --更改约术条件

删除一个字段

alter table student drop column sal;

修改表名

rename student to stu;

添加数据

insert into student values('01','张三' ,'','11-11月-82',10000.98);
insert into student(ID,name,sex) values('02','null','女') --插入部分字段,并且姓名为空
默认的日期格式是:11-11月-82,这种格式如果看着别扭,可以改变成我们习惯的输入格式
alter  session set nls_date_format='yyyy_mm_dd';
insert into student values('3','王五','男','2000-12-03','6999'

 使用to_date函数

insert into test (birthday,name) values (to_date('1981-03-12','yyyy-mm-dd'),'zy');

更新数据

update student sal set sal=sal/2 where sex='';
update myemp set (sal,mdeptno)=(select sal,mdeptno from myemp where mname='SMITH') where mname='JAMES'; --通过子查询更

删除数据

delete from student where sex=''

回滚数据

rollback;    --回滚到上次commit的数据
savepoint a8;    --创建保存点
rollback to a8;  --回滚到保存点

 表的查询

 查询表结构

desc student;

显示操作所消耗的时间

set timing on;

通过子查询复制

insert into users (uno,uname,upass) select * from users;     --自我复制
insert into myemp select ename,deptno,sal from emp where depto='30'; --非自我复

查询多少行

select  count(*)  from tables_name;

去除重复行

select distinct deptno,job from emp;

普通查询

elect sal,deptno,job from emp where ename='SMITH';

 查询中带有数学计算,并把字段取别名

select ename " 姓名",sal*12+nvl(comm,0)*12 "年薪" from emp     --nvl是将null置0,否则整个计算都将为空

 多条件查询

select sal,deptno,job from emp where sal>='300' and sal <'5000;

模糊查询 

select ename,sal from emp where ename like 'S%';       -- "%"表示0到多个字符

select ename,sal from emp where ename like '__I%';         --"_"表示单个字符    

 在where字句中使用in

select  ename,sal from  emp where  empno in (20,30,40);

使用is null操作符

select empno,ename from emp where mgr is null;

 使用逻辑操作符

 select ename from emp where (sal>'500' or job='manager') and ename like 'J%';

使用order by 排序

select * from emp order by sal;        --默认是asc升序排列
select * from emp order by sal desc;   --desc降序排列
select (sal+nvl(comm,0))*12 "年薪",ename from emp order by "年薪"; --按别名排序
select * from emp order by deptno,sal desc; --混合排列

求最大,最小,平均和总和

 select max(sal),min(sal),avg(sal),sum(sal) from emp;

使用子查询查出工资最高的人

select ename ,sal from emp where sal=(select max(sal) from emp);

 使用group by进行分组查询

select avg(sal),max(sal) from emp group by deptno;      --单字段分组
select avg(sal),max(sal) from emp group by deptno,job;   --多字段分组

select avg(sal),deptno from emp group by deptno order by avg(sal) desc ; ---先分组再排

使用having限制分组查询显示结果

select avg(sal),deptno from emp group by deptno having avg(sal)<2000;  

多表查询

select a.ename,a.deptno,b.dname,b.loc from emp a,dept b where a.deptno=b.deptno;     --条件至少要比表的个数少一个

select a1.sal,a1.deptno
  from emp a1,(select avg(sal) avgsal ,deptno from emp group by deptno) a2
    where a1.deptno=a2.deptno and a1.sal>a2.avgsal; --其中一张表是通过查询得到的

select *
  from dept d,emp e
    where d.deptno=e.deptno(+)
      and  e.deptno is null; --+ 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。

分页查询

select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rn>6; 

复制表

create table myemp as select * from emp;                         --通过查询复制表
create table myemp(mname,mdeptno,sal) as select ename,deptno,sal from  emp; --复制指定字

联合查询

select * from emp where sal>2000 union all select * from emp where job='MANAGER';      ---取并集
select * from emp where sal>2000 intersect select * from emp where job='MANAGER';      ---取交集
select * from emp where sal>2000 minus select * from emp where job='MANAGER';          ---取差集

 

posted @ 2016-03-08 01:19  头痛不头痛  阅读(290)  评论(0编辑  收藏  举报