////////oracle表的管理////////////////////////
1、表名和列的命名规则
(1)必须以字母开头
(2)长度不能超过30字符
(3)不能使用oracle的保留字
(4)只能使用如下字符A-Z,a-z,0-9,$,#等。
2、oracle的数据类型
(1)字符型
1)char 表示定长, 最大2000字符。查询速度非常快
例如:char(10)"小韩"前四个字符放“小韩”,后添加6个空格补全
2)varchar2(20) 表示变长,最大4000字符。可以节省空间
例如:varchar2(10)“小韩”oracle分配四个字符。这样可以节省空间。
3)clob(character large object) 表示字符型大对象 最大4G
(2)数字类型
number 范围 -10的38次方-10的38次方
可以表示整数,也可以表示小数
number(5,2)表示一个小数有5位有效数字,2位小数,范围是-999.99—999.99
number(5)表示一个5位数,范围-99999—99999
(3)日期类型
1)date 包含年月日和时分秒
2)timestamp 这是oracle9i对date数据类型的扩展。时间戳
(4)图片
blob 二进制数据 可以存放图片/声音 4G
3、建表
学生表
create table student( //表名
xh number(4),//学号
xm varchar2(20),//姓名
sex char(2),//性别
birthday date,//出生日期
sal number(7,2)//奖学金
);
4、修改表 //查看表结构:desc 表名;
(1)添加一个字段
alter table 表名 add (clssid number(2))【增加的字段】 //给表名增加一个字段classid
(2)修改字段的长度
alter table student modify (xm varchar2(30));//将一个字段xm的长度改成30
(3)修改字段的类型/名字,表里面不能有数据
alter table student modify (xm char(30)); //将字段xm的类型改成char类型
(4)删除一个字段
alter table student drop column sal;//删除字段sal
(5)修改表的名字
rename student to stu; //将表student修改成stu
(6)删除表
drop table student;//删除表student
5、添加数据,按行添加,即每次添加一行的数据。
(1)所有字段都插入
1)insert into student values (
'A001','张三',‘男’,‘01-5月-05’,10
);
oracle中默认的日期格式'DD-MM-YY' DD表示日子(天),MM表示月份,YY表示2位的年份,修改日期的格式:
alter session set nls_date_format='yyyy-mm-dd';
修改后,可以用我们熟悉的格式添加日期类型:
insert into student values('A002','MIKE','男','1905-05-06',10);
2)插入部分字段
insert into student (xh,xm,sex) values ('A003','JOHN','女');
3)插入空值
insert into student (xh,xm,sex,birthday) values ('A004','MARTIN','男',null)
如果在查询空值的时候就是这样子:select * from student where birthday is null;或者select * from student where birthday is not null;
6、修改一个字段的值
update student set sex='女' where xh='A001';
修改多个字段的值
update student set sex='男',birthday =‘1980-04-01’where xh='A001';
修改含有null值的数据
注意在查询的时候是查询字段 is null
7、删除字段
delete from student;表示删除所有记录,表结构还在,只是删除数据。需要写日志,被删除的原来的数据可以恢复的,该操作速度慢。
恢复数据是回滚到相应的保存点:rollback to aa(保存点名);即可,但是必须在删除之前需要设置保存数据点savepoint aa(保存点名);因此有经验的数据库管理员经常会隔一段时间创建保存点。
drop table student ;删除表的结构和数据
delete from student where xh='A001' ;删除一条记录
trucate table student ;表示删除表中的所有记录,表的结构还在,不写日志,被删除的原来的数据无法找回删除的记录,该操作速度快
//打开每个命令语句所花费的时间:set timing on;
8、查询(最重要,查询的方法变化较大)
(1)查看表的结构:desc 表名;
(2)查看所有列:select * from 表名;
(3)查看指定列:select ename ,sal, job,deptno from emp;表示从表emp中查看ename 、sal、job、deptno列的情况
(4)取消重复行:select distinct deptno,job from emp; 表示从表emp中无重复地选择deptno和job的列
(5)查询SMITH的薪水,工作,所在部门:select sal,deptno,job from emp where ename='SMITH';//单表查询
(6)使用算数表达式(表达式中如果含有null值,则最后的结果为nnull,这就需要使用nvl函数来处理):如何显示每个雇员的年工资:select sal*12+nvl(comm,0) "年工资",ename from emp; //nvl(comm,0)表示comm字段的时候如果出现null值,则用0代替,否则用原值代替。
9、where子查询
如何查询工资高于3000的员工
select ename,sal from emp where sal>3000;
如何查询1982-01-01年以后入职的员工
select ename ,hiredate from emp where hiredate >'1-1月-1982';
10、如何使用like操作符
%表示任意0到多个字符 _表示单个字符。
例如:如何显示首字符为S的员工姓名和工资:select ename, sal from emp where ename like 'S%'; //%表示所有的人以匹配的字符
如何显示第三个字符为大写的O的所有员工的姓名和工资:select ename, sal from emp where ename like '__O%';//'__O%'表示从第三个字符为O的所有员工
11、如何在where中使用in
例如:如何显示empno为123,345,800等员工的情况:select ename,sal from emp where empno in (123,345,800);
12、使用is null 操作符
如何显示没有上级雇员的情况,也就是某个字段为空的情况的查询:select * from emp where MGR is null;//这里需要查询空值的字段为MGR
13、使用逻辑操作符
如何查询工资高于500或是岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J:
select * from emp where (sal>500 or job='MANAGER') and ename like 'J%';
14、使用oeder by子句
例如:如何按照工资从低到高的顺序显示雇员的信息:
select * from emp order by sal;//默认是从低到高排序asc,若需要从高到低则在后面添加desc。
select * from emp order by sal desc;
如何按照部门号升序而雇员工资降序排列:
select * from emp order by deptno ,sal desc;//多个字段同时排序,先排序的在前面,后排的
使用列的别名排序:
select ename,sal*12 as "年薪" from emp order by "年薪"asc;//这里“年薪”为字段的别名。15
15、表的复杂查询
1、数据分组:max,min,avg,sum,count
例如:如何显示所有员工中最高工资和最低工资:
select max(sal) ,min(sal) from emp;//找出最大值是多少
select ename ,sal from emp where sal=(select max(sal) from emp); //显示了最大值的名字和工资
如何显示所有员工的平均工资和工资总和:
select avg(sal),sum(sal) from emp;
如何计算总共有多少员工:
select count(*) from emp;
如何显示工资最高的员工的名字和工作岗位:
select ename ,deptno,sal from emp where sal=(select max(sal) from emp);
如何显示工资高于平均工资的员工信息
select * from emp where sal>(select avg(sal) from emp);
2、groub by 子句和having子句
groub by子句用于查询的结构分组统计,having子句用于限制分组显示结果。
例如:如何显示每个部门的平均工资和最高工资://主要思考方法是每个部门相当于一个分组。因此是分组查询
select avg(sal),max(sal), deptno from emp group by deptno; //注意按那个字段分组,前面选择查询的必须包含这个字段。即前后都包括了deptno这个字段
如何显示每个部门的每种岗位的平均工资和最低工资:
select avg(sal),min(sal),deptno ,job from emp group by deptno ,job;
如何显示平均工资低于2000的部门号和它的平均工资:(也就是说找出平均工资低于2000的那些部门)
select avg(sal),deptno from emp group by deptno having avg(sal)>2000;//对分组查询的结果进行限制显示就采用having子句
//对数据分组的总结
1、分组函数只能出现在选择列表、having、order by子句中。
2、如果在select语句中同时包含有group by ,having,order by;那么他们的顺序是group by ,having,order by。
3、在选择列中,如果有列、表达式、分组函数,那么这些列和表达式必须有一个出现在group by子句中,否则就会出错。如:
select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000;//这里的deptno必须出现在group by中。
//多表查询
多表查询的原则:多表查询的条件是至少不能少于表的个数-1
1、如何显示雇员名,雇员工资及所在部门的名字
select ename ,sal, dname from emp ,dept where emp.deptno=dept.deptno;//多表查询,dept和emp表靠deptno来连接的。
2、如何显示部门号为10的部门名、员工名和工资
selcet dept.dname,emp.ename,emp.sal from dept,emp where dept.deptno=emp.deptno and dept.deptno=10;
3、如何显示各个员工的姓名、工资、及其工资的级别
select emp.ename,emp.sal,salgreade.greade from emp,salgreade where emp.sal between salgreade.losal and salgreade.hisal;
4、如何显示雇员名、雇员工资及所在部门的名字,并按部门排序。
select emp.ename,emp.sal ,dept.deptno from emp ,dept where emp.deptno=dept.deptno order by dept.deptno;
//自连接
自连接是指在同一张表的连接查询。
例如:如何显示某个员工的上级领导的姓名,比如显示‘FORD’的上级
select worker.ename,boss.ename from emp as worker,emp as boss where worker.MGR=boss.EMPNO and worker.EMPNO='FORD';
/////子查询///////////////数据库在执行sql语句的时候是从右到左来执行的。
子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询
1、单行子查询,注意这里的子查询返回的列是只有一列。
单行子查询是指只返回一行数据的子查询语句。。
例如:如何显示与SMITH同一部门的所有员工?
select * from emp where emp.deptno=(select deptno from emp where ename='SMITH');//单行子查询是指的select deptno from emp where ename='SMITH'子查询返回的是一行数据
在这里括号里面的语句就叫做子查询,子查询返回一行数据的叫做单行子查询。
2、多行子查询,注意这里的子查询返回的列是只有一列。
多行子查询是指返回多行数据的子查询。
例如:如何查询和部门10的工作相同的雇员的名字、岗位、工资、部门号
select * from emp where job in (select distinct job from emp where deptno=10);//多行子查询是指的select job from emp where deptno=10子查询返回的结果是多行数据
在这里括号里面的语句叫做子查询,子查询返回的多行数据叫做多行子查询
3、在多行子查询中使用all操作符,注意这里的子查询返回的列是只有一列。
例如:如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号?注意,这里比较的是工资,因此子查询需要查询出来工资
select sal from emp where deptno=30;//子查询的结果
select * from emp where sal>all(select sal from emp where deptno=30);//all表示子查询的所有结果
也可以用max来实现:
select * from emp where sal>(select max(sal) from emp where deptno=30);//这种方法效率较高
4、在多行子查询中使用any操作符,注意这里的子查询返回的列是只有一列。
例如:如何显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号?
select * from emp where sal>any(select sal from emp where deptno=30);//any表示只需要大于子查询的任意一个结果即可
也可以用min来实现:
select * from emp where sal>(select min(sal) from emp where deptno=30);//这种方法效率较高
5、多列子查询
单行子查询是指子查询只返回单列,单行数据,多行子查询是指返回单列,多行的数据。都是单列而言的。
而多列子查询则是指子查询返回的是多个列数据的子查询语句。
例如:如何查询与smith的部门号和岗位完全相同的所有雇员
select deptno,job from emp where ename='SMITH';//子查询,它返回的结果是两列
select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');
6、在from子句中使用子查询,当在from中使用子查询的时候必须给子查询取一个别名,而且记住给表取别名时,不要添加as,否则报错。而给列取别名的时候可以加as。
例如:如何显示高于各个部门平均工资的员工信息?//需要思考各个部门怎么选择出来?
select deptno,avg(sal) as mysal from emp group by deptno;//子查询的结果,这个时候将这个查询看作一个临时的表来看待
select emp.ename,emp.sal,emp.deptno,temp.mysal from emp,(select deptno,avg(sal) from emp group by deptno) temp where emp.deptno=temp.deptno and emp.sal>temp.mysal;
7、分页查询
(1)rownum【rownum是oracle分配的】来分页
select temp.* ,rownum rn from (select * from emp ) temp;
select temp.* ,rownum rn from (select * from emp ) temp where rownum<=10;
select temp.* ,rownum rn from (select * from emp ) temp where rownum<=10 and rownum>=6;//这个是错误的,因为oracle中rownum只能在后面使用一次
select * from (select temp.* ,rownum rn from (select * from emp ) temp where rownum<=10) where rn >=6;//可以
假如需要指定的查询列的话,只需修改最里层的列即可。例如:
select * from (select temp.* ,rownum rn from (select ename,sal from emp ) temp where rownum<=10) where rn >=6;//可以
假如需要排序的话,也只需要在最里层排序即可。例如:
select * from (select temp.* ,rownum rn from (select ename,sal from emp order by sal ) temp where rownum<=10) where rn >=6;//可以
假如需要显示4-9的记录。
select * from (select temp.* ,rownum rn from (select ename,sal from emp order by sal ) temp where rownum<=9) where rn >=4;//可以
(2)rowid来分页,效率极高
select * from t_xioxi where rowid in(select rid from (select rownum rn,rid from (select rowid ,cid from t_xiaoxi order by cid desc )where rownum <10000)where rn>9980)order by cid desc;
(3)按分析函数来分,效率极低
select * from (select t.*,row_number() over(order by cid desc)rk from t_xiaoxi t)where rk<10000 and rk>9980;
8、将查询的结果用来创建一个新表.(也就是将一个表的内容导入到一个新表当中)
这个命令是一个快捷的建表方法:
create table mytable (id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;
9、合并查询
有时候在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,mins。
(1)union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。
select ename ,sal,job from emp where sal >2500 union select ename,sal,job from emp where job='MANAGER';
(2)union all
该操作符类似于union,但是他不取消重复行,而且不会排序。
select ename ,sal ,job from emp where sal>2500 union all select ename, sal,job from emp where job='MANAGER';
(3)intersect
该操作符是取两个select语句结果的的交集。
select ename ,sal,job from emp where sal>2500 intersect select ename,sal,job from emp where job='MANAGER';
(4)minus
使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中(也就是第一个select语句),而不存在第二个集合(也就是第二个select语句)中的数据,如果第一个集合被包含在第二个集合中,返回的是空集。
select ename,sal,job from emp where sal>2500 minus select ename,sal ,job from emp where job='MANAGER';
10、创建新的数据库:
(1)通过oracle提供的向导工具。即dbca(数据库助手)
(2)我们可以用手工步骤直接创建。
即选择oracle--->Configuration and migration tools-->Database Configuration Assistant。即可出现一个提示。再选择创建数据库,再选择newDatabase,再取名,最后一步一步进行。
浙公网安备 33010602011771号