您的位置:首页 > 数据库 > Oracle

Oracle表的管理

2016-03-08 01:19 561 查看
字符型char 定长,最大2000字符  char(10) '小明',后面6个字符将被浪费掉,适合定义固定长度和经常被查询的字段,例如身份证号码,效率高varchar2 变长,最大4000字符  varchar2(10) '小明' 后面6个字符空间将被节省clob 字符型大对象,最大4G数字型number -10的38次方~10的38次方   number(5,2) 表示5位有效数字,其中两位小数 -999.99~999.99number(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';          ---取差集
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: