JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
oracle
序列
作用:替代mysql中的自增
创建语法(最简单的语法):从1开始,没有上限,默认缓存20个
create sequence 序列名;
属性
nextval
:下一个值currval
:当前值,必须先使用一次nextval,才能使用currval
用法
select 序列名.nextval from dual;
select 序列名.currval from dual;
dual:是一张虚表,作用:完善语法结构
- 在mysql中:
select length('abc')
可以没有from关键字 - 在oracle中:
select length('abc') from dual
完善语法结构
select customer_seq.nextval from dual;
select customer_seq.currval from dual;
给customer表添加一条数据
insert into customer(custId,custName) values(customer_seq.nextval,'aaa')
完整的语法
create sequence 序列名
start with 1 --起始值
increment by 2 --每次的递增量
maxvalue 9999/nomaxvalue/minvalue 1/nominvalue --最大值与最小值设置
cycle --循环(超过最大值或最小值后循环)
cache 20; --缓存,提前创建20个值
scott下的表结构
scott:oracle公司的第一位程序员
在oracle安装完之后,在数据库中内置了一个用户scott,默认创建了4张表,可以用作学习使用
默认是锁定的
解锁用户
alter user scott account unlock;
重置密码
alter user scott identified by tiger;
系统函数
一、单行函数:一行记录查询返回一行结果
1、字符串函数
lower
:将字符串转化为小写
select lower(ename) from emp;
upper
:将字符串转化为大写
select upper(ename) from emp;
2、日期函数
- 两个日期相减,得到天数
select sysdate - hiredate from emp
- 两个日期相减/7,得到周数
select (sysdate - hiredate)/7 from emp
- 两个日期相差的月数
select months_between(sysdate,hiredate) from emp;
3、数值函数
- 四舍五入
select round(2.66) from dual; --3
select round(2.66,1) from dual; --2.7
select round(2.666,2) from dual; --2.67
- 截取
select trunc(2.66777777777777,2) from dual; --2.66
- 模运算符:求余数
select mod(3,10) from dual; --3
4、转换函数(重要)
to_char(p1,p2)
:将日期类型转换为字符串类型
p1:将要转换的日期
p2:转换的格式
select to_char(sysdate,'yyyy-MM-dd hh24:mi:ss day') from dual;
to_date(p1,p2)
:将字符串类型转换为日期类型
p1:将要转换的字符串
p2:转换的格式
select to_date('2020-05-13 13:40:59 wednesday','yyyy-MM-dd hh24:mi:ss day') from dual;
实际应用:
insert into emp(empno,hiredate) values(2001,to_date('2018/08/08','yyyy/mm/dd'))
5、通用函数
注意:null+数值=null
nvl:如果第一个参数为null,则返回第二个参数
select sal * 12 + nvl(comm,0), sal, comm from emp;
二、多行函数(分组函数,聚合函数):多行记录查询返回一行结果
count,avg,min,max,sum
分组统计
查询部门人数大于5人的部门名称
注意:
- 分组后能查询的列
- 聚合函数
- 在group by 中出现的列
- where语句必须在group by之前使用,在where中不能使用分组函数,having是分组后的进一步筛选
select e.deptno, count(*),d.dname,d.loc
from emp e, dept d
where e.deptno = d.deptno
group by e.deptno,d.dname,d.loc
having count(*) > 5
内连接
内连接:只能查询符合条件的记录
emp:员工表
dept:部门表
salgrade:员工的工资等级表
查询每位员工的领导信息:一张表当两张表查询
select e.empno,e.ename,m.empno,m.ename
from emp e, emp m
where e.mgr = m.empno;
在此基础上,增加员工部门信息
select e.empno,e.ename,m.empno,m.ename,d.dname
from emp e, emp m, dept d
where e.mgr = m.empno
and d.deptno = e.deptno;
在此基础上,增加领导部门信息
select e.empno,e.ename,m.empno,m.ename,d1.dname as edname,d2.dname as mdname
from emp e, emp m, dept d1,dept d2
where e.mgr = m.empno
and d1.deptno = e.deptno
and d2.deptno = m.deptno;
在此基础上,增加员工和领导的工资等级
select e.empno,e.ename,m.empno,m.ename,d1.dname as edname,d2.dname as mdname,s1.grade as egrade,s2.grade as mgrade
from emp e, emp m, dept d1,dept d2,salgrade s1, salgrade s2
where e.mgr = m.empno
and d1.deptno = e.deptno
and d2.deptno = m.deptno
and e.sal between s1.losal and s1.hisal
and m.sal between s2.losal and s2.hisal;
结果
外连接
外连接:能查询显示基准表中的所有的记录
一、左外连接(基准表为左表):left join on
查询每位员工的领导信息,增加董事长信息
select e.empno,e.ename,m.empno,m.ename
from emp e left join emp m
on e.mgr = m.empno;
二、右外连接(基准表为右表):right join on
查询每位员工的领导信息,增加董事长信息
select e.empno,e.ename,m.empno,m.ename
from emp m right join emp e
on e.mgr = m.empno;
三、全外连接:full join on
等于左外+右外
四、特殊外连接(只要oracle才有)
注意:(+)
以对方表为基准表
select e.empno,e.ename,m.empno,m.ename
from emp m , emp e
where e.mgr = m.empno(+);
子查询
一个查询语句包含另一个查询语句
一、查询与7499员工工作一致的员工
select * from emp
where job = (select job from emp where empno = 7499)
二、查询存在员工的部门信息
select * from dept where deptno in (select distinct deptno from emp)
三、查询员工薪水大于本部分平均薪水的员工信息
select e.empno,e.ename,t.avgsal,e.sal,e.deptno,t.deptno
from emp e, (select deptno,avg(sal) avgsal from emp group by deptno) t
where e.deptno = t.deptno
and e.sal > t.avgsal
分页查询
- oracle没有limit关键字
- 伪列:该列为虚拟列,但是可以使用
- rownum:行号,在加载行数据时生成,从1开始,依次递增,没有上限
一、生成行号
select e.*,rownum from emp e;
二、查询前3条记录
select e.*,rownum from emp e where rownum<=3;
三、查询4到6条记录
注意,这种查询方式错误
select e.*,rownum from emp e where rownum between 4 and 6;--错误的
应该先生成行号,作为表,再进行分页查询
select t.* from (select e.*,rownum rn from emp e) t
where t.rn between 4 and 6
扩展:
查询工资最高的前三名
思路:先按工资降序排序,再生成行号
注意:要先排序,作为表,再生成行号
select e.*,rownum from (select * from emp order by sal desc) e
where rownum<=3
查询工资最高的4到6名
最终的思路:先降序排序,作为表,再生成行号,再作为表进行分页条件查询
select t.* from (select e.*,rownum rn from (select * from emp order by sal desc) e) t
where t.rn between 4 and 6