1.表名和列的命名规则
必须以字母开头
长度不能超过30字符
不能使用oracle的保留字
只能使用如下字符 A-Z,a-z,0-9,$,#等
2.oracle支持的数据类型
a.字符型
char:定长,最大2000字符
例:char(10) ‘小小’前四个字符放’小小’,后添6个空格补全,但这样的查询效率较varchar2高
varchar2(20):变长,最大4000字符
例:varchar(10) ‘小小’oracle分配四个字符,这样可以节省空间
clob(character large object):字符型大对象,最大4G
b.数字型
number:范围是-10的38次方~10的38次方,可以表示整数,也可以表示小数
number(5,2):表示一个小数有5位有效数,2位小数,范围是-999.99~999.99
number(5):表示一个五位整数,范围是-99999~99999
c.日期类型
date:包含年月日和时分秒
timestamp:这是oracle9i对date数据类型的扩展
d.图片
blob:二进制数据,可以存放图片/声音 4G
出于安全考虑,将图片放到数据库中,普通的可以存在一个文件夹下,数据库中存放路径即可。
3.创建表
create table student(--表名
stuNo number(4),--学号
stuName varchar2(20),--姓名
sex char(2),--性别
birthday date,--出生日期
sal number(7,2) –奖学
);
4.修改表
添加一个字段
alter table student add(classid number(2));
修改字段的长度
alter table student modify (stuName varchar2(30));
修改字段的类型/名字(不能有数据)
alter table student modify (stuName char(30));
删除一个字段
alter table student drop column sal;
修改表的名字
rename student to stu;
删除表
drop table student;
5.查询
set time on:打开显示操作时间的开关
a.简单的查询语句
1).查看表结构:desc dept;
2).查询所有列:select * from dept;
3).查询指定列:select ename,sal,job,deptno from emp;
4).如何取消重复行:select distinct deptno,job from emp;
附加知识点:
疯狂复制:insert into users(userid,username,userpss) select * from users;
5).查询SMITH的薪水、工作、所在部门
select deptno,sal from emp where ename=’SMITH’;
6).使用算数表达式
显示每个雇员的年工资:
select sal*13 + nvl(comm.,0)*13 “年工资”,ename,comm. from emp;
7).使用列的别名
select ename “姓名”,sal*12 as “年收入” from emp;
8).处理null值
使用nvl函数来处理
9).如果连接字符串(||)
select ename || ‘is a ‘ || job from emp;
10).使用where子句
显示工资高于3000的员工:select ename,sal from emp where sal>3000;
查找1982年1月1日后入职的员工:select ename,hiredate from emp where hiredate>’1-1月-1982’;
显示工资在2000到2500的员工情况:select ename,sal from emp where sal>=2000 and sal<=2500;
11).如何使用like操作符
%:表示任意0到多个字符
_:表示任意单个字符
如何显示首字符为S的员工姓名和工资:select ename,sal from emp where ename like ‘S%’;
如何显示第三个字符为大写O的所有员工和工资:select ename,sal from emp where ename like ‘__O%’;
12).在where条件中使用in
如何显示empno为7844,234,456的雇员情况:select * from emp where empno in(7844,456);
13).使用is null的操作符
如何显示没有上级的雇员的情况:select * from emp where mgr is null;
14).查询工资高于500或是岗位为MANAGER的雇员,同时还要满足他们的姓名首写字母为大写的J
select * from emp where (sal>500 or job=’MANAGER’) and ename like ‘J%’;
15).使用order by子句
如何按照工资从低到高的顺序显示雇员的信息
select * from emp order by sal asc;
按照部门号升序而雇员的工资降序排列
select * from emp order by deptno asc,sal desc;
按照部门号升序而雇员的入职时间降序排列
select * from emp order by deptno asc,hiredate desc;
16).使用列的别名排序
select ename,(sal+nvl(comm,0))*12 “年薪” from emp order by “年薪” asc;
别名需要使用””号圈中
按雇员的id号升序取出
select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal desc) a1 where rownum<=10) where rn>=5;
A.根据ROWID来分
select * from test where rowid in( select rid from ( select rownum rn,rid from( select rowid rid,cid from test order by cid desc ) where rownum<10000 where rn>9980 ) order by cid desc;
B.按分析函数来分
select * from (select t.*,row_number() over(order by cid desc) rk from test t) where rk < 10000 and rk > 9980;
C.按ROWNUM来分
select * from (select t.*,rownum rn from (select * from test order by cid desc) t where rownum < 10000) where rn > 9980;
其中test为表名称,cid为表的关键字段,取按CID降序排序后的第9981-9999条记录,test表有70000多条记录。A的效率最好,C次之,B最差。
b.oracle表复杂查询
说明:在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据。
A.数据分组-max,min,avg,sum,count
1).如何显示所有员工中最高工资和最低工资
select max(sal),min(sal) from emp;
2)显示所有员工的平均工资和工资总和
select avg(sal),sum(sal) from emp;
3)计算共有多少员工
select count(*) from emp;
4)显示工资最高的员工的名字,工作岗位
select ename,job from emp where sal=(select max(sal) from emp);
5)显示工资高于平均工资的员工信息
select * from emp where sal>(select avg(sal) from emp);
group by和having子句:group by用于对查询的结果分组统计,having子句用于限制分组显示结果。
1).如果显示每个部门的平均工资和最高工资
select avg(sal),max(sal),deptno from emp group by deptno;
2).显示每个部门的每种岗位的平均工资和最低工资
select avg(sal),deptno,job from emp group by deptno,job;
3).显示平均工资高于2000的部门号和它的平均工资
select avg(sal),deptno from emp group by deptno having avg(sal)>2000;
数据分组的总结:
分组函数只能出现在选择列表、having、order by子句中;
如果在select语句中同时包含有group by,having,order by,那么他们的顺序是group by,order by;
在选择列中,如果有列、表达式、分组函数,那么这些列和表达式必须有一个出现在group by子句中,否则就会出错;
如select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000;这里deptno就一定要出现在group by中。
B.多表查询
说明:多表查询是指基于两个和两个以上的表或是视图的查询,在实际应用中,查询单个表可能不能满足你的需求,如果显示sales部门位置和其员工的姓名,这种情况下需要使用到dept表和emp表。
1)显示雇员名、雇员工资及所在部门的名字
多表查询的条件是至少不能少于表的个数-1
select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno;
2)如何显示部门号为10的部门名、员工名和工资
select a1.dname,a2.ename,a2.sal from dept a1,emp a2 where a1.deptno=a2.deptno and a1.deptno=10;
3)显示各个员工的姓名、工资及其工资的级别
select a1.ename,a2.grade from emp a1,salgrade a2 where a1.sal between a2.losal and a2.hisal;
4)显示雇员名、雇员工资及所在部门的名字,并按部门排序
select a1.ename,dept a2 where a1.deptno=a2.deptno order by a1.deptno;
自连接:自连接是指在同一张表的连接查询
5).显示某个员工的上级领导的姓名,比如显示’FORD’的上级
select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno and worker.ename=’FORD’;
C.子查询
子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询。
1)显示也SMITH同一部门的所有员工
select * from emp where deptno=(select deptno from emp where ename=’SMITH’);
2)查询和部门10的工作相同的雇员的名字、岗位、工资、部门号
select * from emp where job in (select distinct job from emp where deptno=10);
在多行子查询中使用all操作符
3)如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename,deptno from emp where sal>all(select sal from emp where deptno=30);
另法:
select * from emp where sal>(select max(sal) from emp where deptno=30);
在多行子查询中使用any操作符
4)显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号
select ename,deptno from emp where sal>any (select sal from emp where deptno=30);
另法:
select * from emp where sal>(select min(sal) from emp where deptno=30);
多列子查询
说明:单行子查询是指子查询只返回单列、单行数据,多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。
5)查询与SMITH的部门和岗位完全相同的所有雇员
select * from emp where (deptno,job)=(select deptno,job from emp where ename=’SMITH’);
6)在from子句中使用子查询
显示高于自己部门平均工资的员工的姓名、工资、部门号及部门对应的平均工资
select a2.ename,a2.sal,a2.deptno,a1.mysal from emp a2,(select deptno,avg(sal) mysal from emp group by deptno) a1 where a1.deptno=a2.deptno and a2.sal>a1.mysal;
当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此也叫做内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名。
7)用查询结果创建新表
这个命令是一种快捷的建表方法
create table mytable (id,name,deptno) as select empno,deptno from emp;
c. 合并查询
有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus
A.union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。
select ename,job from emp where sal>2500 union select ename,job from emp where job=’MANAGER’;
B.union all
该操作和union相似,但是它不会取消重复行,而且不会排序。
select ename,job from emp where sal>2500 union all select ename,job from emp where job=’MANAGER’;
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。
C.intersect
使用该操作符用于取得两个结果集的交集。
select ename,job from emp where sal>2500 intersect select ename,job from emp where job=’MANAGER’;
D.minus
使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据。
select ename,job from emp where sal>2500 minus select ename,job from emp where job=’MANAGER’;
6. 添加数据
a.所有字段都插入:insert into student values(‘A001’,’张三’,’男’,’01-5月-05’,10);
Oracle中默认的日期格式’DD-MON-YY’
dd:日子(天)
mon:月份
yy:2位的年,如’09-6月-99’表示1999年6月9号
改日期的默认格式:alter session set nls_date_format = ‘yyyy-mm-dd’;
insert into student values(‘A002’,’MIKE’,’1905-05-06’,10);
b.插入部分字段
insert into student(stuNo,stuName,sex) values(‘A003’,’JOHN’,’女’);
c.插入空值
insert into student(stuNo,sex,birthday) values(‘A004’,’MARTIN’,null);
7. 修改数据
a. 改一个字段
update student set sex=’女’ where stuNo=’A001’;
b. 修改多个字段
update student set sex=’男’,birthday=’1980-04-01’ where stuNo=’A001’;
c. 修改含有null值的数据(is null)
8. 删除数据
delete from student;
删除所有记录,表结构还在,写日志,可以恢复的,速度慢
drop table student;
删除表的结构和数据
delete from student where stuNo=’A001’;
删除一条记录
truncate table student;
删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快
9. 创建新的数据库
a.通过oracle提供的向导工具
oracle->Configuration and Migratin Tools->Database Configuration Assistant
b.可以用手工步骤直接创建