JavaEE学习日志(一百): oracle系统函数,oracle的查询语句

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人的部门名称
注意:

  • 分组后能查询的列
  1. 聚合函数
  2. 在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

分页查询

  1. oracle没有limit关键字
  2. 伪列:该列为虚拟列,但是可以使用
  3. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章