Oracel数据库学习
1、小型数据库 access,foxbase
中型数据库 mysql,sqlserver,informix
大型数据库 sybase,Oracle,db2
Oracle数据库需求量最大
2、 Oracle安装完会默认产生三个用户
3、 Oracle管理工具
4、 sql*plus常用命令
5、 创建用户
6、 使用profile管理用户口令
7、 Oracle的表的管理
字符型:char()定长的,定长多少个字符,就是多
少个字符,不够的会用空格补齐。查询速度非常快。如
果这个字段经常被查询,而查询长度不变,比如都是身
份证号码就用这个char()类型
varchar2() 变长
clob 字符型大对象,最大4G
数字型:number
小数一个(5,2)表示一个小数有五位有效数,二
位小数
时间型:data
------------查询从这里开始-----------------------
8、 字段名:jop:职位 sal:工资 comm:奖金
empno:编号 mgr:上级编号 ename:姓名
hiredate :入职日期 deptno:部门编号
emp 雇员表
dept部门表
salgrade 工资级别表
desc+表名 查看表结构
select+列名,列名 from 表名
set timing on 打开显示操作时间的开关,执行后
会显示以后查询的时间
疯狂复制表中数据:
insert into users
(userid,username,userpss)select*from users
select distinct 列名 from 表名 去除重复行
select sal*13+ as "年工资" ,ename from emp
9、如何处理null值:comm为列名
select sal*13+nvl(comm,0) as "年工资" ,ename
from emp
10、where子句
select ename,sal from emo where sal>3000
selectename,hiredate from emp where
hiredate>'1-1月—1982' 查询入职日期在1982年以后
的,注意查询的时间日期格式
select ename,sal from emp where sal>=2000
and sal<=2500 多个条件加and
11、like操作符
% 表示任意0到多个字符
_ 表示单个字符
select ename,sal from emp where ename like 'S
%'
12、where条件中加in
select*from emo where empno in()
select*from emo where mgr is null
13、使用逻辑操作符号
select*from emp (where sal>500 or
job='mangger') and eame like ‘S%’
14、order by语句
select*from emp order by sal asc/desc
部门号升序,工资降序
select*from emp order by deptno,dal desc
按年薪升序
select ename,(sal+nvl(comm,0))*12 from emp
order by "年薪";
复杂查询:max,min,avg,sum,count
15、分页查询。oracle数据库分页查询很难理解!!!
第一步:rownum分页
select* from emp
第二步:显示rownum[oracel分配的]
select a1.*,rownum rn from (select* from emp) a1
第三步:查询数据(查询一个表中第五条和第十条数据)
select*from(
select*from(select a1.*,rownum rn from(select*from emp) a1 where rownum<=10)
)where rownum>=5
比较难理解,先查出10条数据,在去掉前5条数据,查询语句难写,但是查询速度快
第四步:
a:指定查询列,只需修改最里层的子查询
select*from(
select*from(select a1.*,rownum rn from(select ename,sal from emp) a1 where rownum<=10)
)where rownum>=5
b:排序
select*from(
select*from(select a1.*,rownum rn from(select ename,sal from emp order by sal) a1 where rownum<=10)
)where rownum>=5
这种分页查询可以当成一个公式来记住
16、子查询
查最高工资.查两个列,两个列都必须是分组函数
select max(sal),min(sal) from emp
select ename,sal from sal=(select max(sal)
from emp)
查询比平均工资的人高的员工的情况
select*from emp where sal>(select avg(sal)
from emp)
17、group by和having子句
group by对于查询的结果分组统计
having子句用于限制分组显示结果
显示每个部门的平均工资和最高工资
select avg(sal),max(sal),deptno from emp gr
oup by deptno
显示每个部门的每种岗位的平均工资和最低工资
select avg(sal),max(sal),deptno,job from emp
group by deptno,jop
显示平均工资大于2000的部门号和它的平均工资
select avg(sal),max(sal),deptno from
emp group by deptno having avg(sal)>2000
!!!!对数据分组查询的总结
第一条:分组函数只能出现在选择列、having、order
by子句中
第二条:如果在select语句中同时包含有group
by,having,order by那么他的顺序是group
by,having,order by——分组—筛选—排序
第三条:在选择列中如果有列、表达式、和分组函数,
那么这些列和表达式必须有一个出现在group by子句中
18、多表查询
select a1.ename,a1.sal,a2.dname from emp
a1,dept a2 where a1.deptno=a2.deptno
笛卡尔积:多表查询的条件是条件至少不能少于表的个
数减1
select a1.dname,a2.ename,a2.sal from dept
a1,emp a2 where a1.deptno=a2.deptno and
a1.deptno=10
三表查询:between...and 语句
显示员工的姓名,工资,及工资的级别
select a1.ename,a1.sal,a2.grade from emp
a1,aslgrade a2 where a1.salbetween a2.losal and a2.hisal
显示雇员名,雇员工资及所在部门的名字,并按部门排序.多表可以排序,order by 前面不一定非要排序的字段名
select a1.ename,a2.dname,a1.sal from emp a1,dept a2 where a1.deptno=a2.deptno order by
a1.deptno
20、自连接
显示某个员工的上级领导的姓名。在同一个表中,可以默认是两个相同的表,语句这样写:
select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno
and worker.ename=‘fot’
21、子查询,也叫嵌套查询
嵌套在一个嵌入在其它sql语句中的select语句
第一种:单行子查询是指返回一行数据的子查询语句
查询和某个人一个部门的员工:
select*from emp where deptno=
(select deptno from emo where eanme=“jop”)
第二种:多行子查询.
关键字 in
select*from emp where job in(select destinct job from emo where deptno=10)
关键字 all
显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号,也可以用max
select ename,sal,deptno from emp where sal>all
(select sal from emp where deptno=30)
关键字any
显示工资比部门30的任何一个员on个的工资高的员工的姓名、工资和部门号
select ename,sal,deptno from emp where sal>any
(select sal from emp where deptno=30)
22、多列子查询
select*from emp where(deptno,job)=(select deptno,jop from emp where ename='job')
23、在from子句中使用子查询
查询高于自己部门平均工资的员工的信息
第一步:查询出各个部门的平均工资和部门号
select deptno,avg(sal) mysal from emp group by deptno
第二步:把上次查询的结果当成一个新表
select a2.ename,a2.sa1,a1.deptno,a1.mysal from emp a2,(select deptno,avg(sal) mysal from emp group by deptno)a1 where a2.deptno=a1.deptno and a2.sal>a1.mysal
这里需要说明的是当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫作内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名
24、查询表中数据
select count(*) from emp
25、用查询结果创建新表
creat talbe mytable(id,name,sal)
as select empno ,ename,sal from emp
26、合并查询,可以使用集合操作符号
union,union all,intersect,minus
union:
select ename,sal,job from emp where sal>2500
union select ename ,sal,job from emp where job='MANGER'