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'; ---取差集