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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章