主頁 > 資料庫 > Oracle筆記

Oracle筆記

2021-04-04 14:39:09 資料庫

一、創建表空間及用戶授權

-- 創建表空間

create tablespace zhous --檔案的名字
datafile 'f:\zhou.dbf' --檔案的儲存地址
size 100m --檔案大小
autoextend on next 10m; --每次擴容大小 


--洗掉表空間
drop tablespace zhous;


--創建用戶
create user zhouxs --用戶名字
identified by 123123 --用戶密碼
default tablespace zhous --默認表空間

--授權
connect --連接角色
resource --開發者角色
dba --超級管理員

grant dba to zhouxs; --給用戶賦予超級管理員權限

二、對表的基本操作

--創建資料表
create table person(
       pid number(21),
       pname varchar(25)
)

--修改表結構
alter table person add(sex number(2)); --添加一列

alter table person modify sex varchar(2); --修改表欄位型別

alter table person rename column sex to sexs; --修改列名稱

alter table person drop column sexs; --洗掉一列

insert into person values('1','張三'); --插入資料

delete from person; --洗掉整個表
drop from person; --洗掉表結構

truncate table person; --先洗掉表再創建表

 
update person set pname='李四' where pid=1 --修改

select * from person; --查詢



--創建序列 每次自增1
create sequence s_person;

insert into person values(s_person.nextval,'王五')

三、函式

3.1、單行函式

--scott用戶,密碼tiger
--解鎖scott用戶
alter user scott account unlock;

--解鎖用戶密碼(也可以設定密碼)
alter user scott identified by tiger;

select * from emp e


--單行函式:作用于一行,回傳一個值
--字符函式
select upper('hello') from dual --小寫轉大寫
select lower('HELLO') from dual --小寫轉大寫

--數值函式
select round(45.6,-1) from dual --四舍五入,后面顯示保留的小數
select trunc(46.7,-1) from dual --直接截取,不看后面的數字

--日期函式
--查出所偶有員工距離現在有多少天
select sysdate-e.hiredate from emp e 

--算出明天此刻
select sysdate+1 from dual

--算出所有員工入職距離現在有多少個月
select months_between(sysdate,e.hiredate) from emp e;

--算出所有員工入職距離現在有多少年
select months_between(sysdate,e.hiredate)/12 from emp e;

--算出所有員工入職距離現在有多少周
select round((sysdate-e.hiredate)/7) from emp e;

--日期轉換函式,日期轉字串
select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss') from dual;

--字串轉日期
select to_date('2021-4-2 20:58:56','fm yyyy-mm-dd hh24:mi:ss') from dual;

--通用函式
--null值運算結果都為null
select e.sal*12+nvl(e.comm,0) from emp e;

3.1、多行函式

-多行函式 作用域多行函式,回傳一個值

select count(1) from emp; --查詢總數量

select sum(e.sal) from emp e; --求和

select min(e.sal) from emp e; --求最大值

select avg(e.sal) from emp e; --求平均值

select max(e.sal) from emp e; --求最大值

四、條件運算式

--條件運算式

--相當于switch

select e.ename,
       case e.ename
         when 'SMITH' then '史密斯'
           when 'ALLEN' then '艾倫'
             else '無名'
               end
 from emp e;
 
 
 --判斷工資范圍
 select e.sal,
          case
       when e.sal>3000 then '高收入'
         when e.sal>1500 then '中等收入'
           else '低收入'
             end
from emp e;


--oracle專用運算式
select e.ename,
 decode(e.ename,
 'SMITH','史密斯',
 'ALLEN','艾倫',
 '無名') "中文名" 
from emp e;


五、復雜查詢和分頁查詢

--分組查詢,group by后面的列才能出現在select 后面,想要出現在group by后面加聚合函式
select e.deptno,avg(e.sal) from
emp e group by e.deptno;



--查詢部門平均工資大于2000的人
--所有條件不能使用別名來判斷
select e.deptno,avg(e.sal) from
emp e group by e.deptno having avg(e.sal)>2000;

--where過濾分組前的資料,having過濾分組之后的資料
select e.deptno,avg(e.sal) from
emp e 
where e.sal>800
group by e.deptno;


--查詢部門大于800的員工工資,再查詢除部門平均工資大于2000的人
select e.deptno,avg(e.sal) 
from emp e 
where e.sal>800
group by e.deptno having avg(e.sal)>2000;


--笛卡爾積
select * from emp e,dept d;

--等值連接
select * from emp e,dept d where e.deptno=d.deptno;

--內連接
select * from emp e inner join dept d on e.deptno=d.deptno;

--外連接
--右連接
select * from emp e right join dept d on e.deptno=d.deptno;


--左連接
select * from emp e left join dept d on e.deptno=d.deptno;


--oracle專用的外連接
select * from emp e,dept d where e.deptno(+)=d.deptno;


--自連接
select e1.ename,e2.mgr
from emp e1,emp e2
where e1.mgr=e2.empno


--子查詢
select * from emp where sal in
(select sal from emp where ename='scott')

--查詢工資和10號部門任意工資一樣的員工
select * from emp where sal in
(select sal from emp where deptno=10)


--查詢每個部門的最低工資,最低工資員工姓名,員工所在部門
select t.deptno,t.msal,e.ename,d.dname 
from (
select deptno,min(sal) msal from emp group by deptno
)t,emp e,dept d
where t.deptno =e.deptno and t.msal=e.sal
and e.deptno =d.deptno


--分頁查詢
--rownum行號
--查詢一行記錄,就會在該行加上一個行號,從一開始,依次遞增,不能跳著走
select rownum,e.* from emp e order by e.sal desc

select rownum, t.* from (
select rownum,e.* from emp e order by e.sal desc
) t;

select * from (
select rownum rn,tt.* from(
select * from emp  order by sal desc
) tt where rownum<11 
)  where rn>5

六、視圖和索引

--創建視圖,必須有管理員權限
create table emp as select * from scott.emp;

select * from emp;
--創建視圖
create view v_emp as select ename,job from emp;

--查詢視圖
select * from v_emp;

--修改視圖[不推薦]
update v_emp set job='222' where ename='smith';

--創建只讀視圖
create view v_emp1 as  select ename,job from emp with read only;

--視圖的作用
--①屏蔽敏感欄位
--②保證資料的及時統一



--索引
--普通索引
create index idx_name on emp(ename)

select * from emp where ename='KING' --觸發單列索引

--復合索引
create index idx_name on emp(ename,job)

select * from emp where ename='KING' and job='xx'; --觸發索引

select * from emp where ename='KING' or job='xx'; --不觸發索引

七、PLSQL編程

plsql是對sql語言的擴展,使得sql具有程序化編程的特性,靈活高效,主要用來撰寫程序函式和存盤函式,

7.1、變數定義和賦值

--宣告方法
--賦值操作  := 也可以 into查詢陳述句賦值
declare
   i number(3):=1; --賦值
   name varchar(10):='張三'; --參考型變數
   ena emp.ename%type;
   emprow emp%rowtype; --記錄型變數
begin
  dbms_output.put_line(i);
  dbms_output.put_line(name);
  select ename into ena from emp where empno=7788;
  select * into emprow from emp where empno=7788;
  dbms_output.put_line(ena);
  dbms_output.put_line(emprow.ename ||'的作業為:'||emprow.job);
end;

7.2、PLSQL條件判斷和回圈

--PLSQL--IF判斷 dbms_output.put_line--輸出陳述句
declare
     i number(3):=&ii;
begin
  if i<18 
    then dbms_output.put_line('未成年');
    elsif i<40 
      then dbms_output.put_line('中年');
      else
        dbms_output.put_line('老年');
  end if;
end;


--PLSQL--回圈
--三種回圈輸出1-10
declare
  i number(2):=1;
begin
  while i<11 loop --i<10為退出條件
       dbms_output.put_line(i);
       i:=i+1;
  end loop;
end;

--exit回圈
declare
  i number(2):=1;
begin
  loop
    exit when i>10;
    dbms_output.put_line(i);
       i:=i+1;
  end loop;
end;

--for回圈
declare
begin
  for i in 1..10 loop
     dbms_output.put_line(i);
    end loop;
  end;

八、游標

--游標:可以存放多個物件,多行記錄,
--輸出emp表中的所有資料
declare
  cursor cl is select * from emp; --創建游標,游標的資料來自emp表
  emprow emp%rowtype; --用來保存一行資料
begin --開始
  open cl; --打開游標
       loop --開始回圈
         fetch cl into emprow; --將遍歷結果放到變數
         exit when cl%notfound; --沒找到退出
         dbms_output.put_line(emprow.ename); --輸出資訊
         end loop; --結束回圈
         close cl; --關閉游標
  end; --退出
  
--游標:可以存放多個物件,多行記錄,
--輸出emp表中的所有資料
declare
  cursor cl is select * from emp; --創建游標,游標的資料來自emp表
  emprow emp%rowtype; --用來保存一行資料
begin --開始
  open cl; --打開游標
       loop --開始回圈
         fetch cl into emprow; --將遍歷結果放到變數
         exit when cl%notfound; --沒找到退出
         dbms_output.put_line(emprow.ename); --輸出資訊
         end loop; --結束回圈
         close cl; --關閉游標
  end; --退出
  
--員工漲工資方法
declare
  cursor c2(eno emp.deptno%type) 
  is select empno from emp where deptno =eno;
  en emp.empno%type;
begin
  open c2(10);
  loop
    fetch c2 into en;
    exit when c2% notfound;
         update emp set sal=sal+100 where empno=en;
         commit;
    end loop; 
  close c2;
  end;
  
select * from emp where deptno=10;

九、存盤程序、存盤函式

9.1、存盤程序

存盤程序就是提交編譯好的plsql放到資料庫端可以直接被呼叫,

--存盤程序
create or replace procedure pl (eno emp.empno%type)
is
begin
  update emp set sal=sal+1000 where empno=eno;
  commit;
  end;

declare
begin
 pl(7788);
  end;
  
--存盤程序輸出引數
create or replace procedure p_yearsal(eno emp.empno%type,yearsal out number)
is
       s number(10);
       c emp.comm%type;
begin
  select sal*12,nvl(comm,0) into s,c from emp where empno=eno;
  yearsal :=s+c;
end;

--測驗
declare
  yearsal number(10);
begin
  p_yearsal(7788,yearsal);
  dbms_output.put_line(yearsal);
end;


--in 和out的區別
--涉及到into查詢陳述句或者:=賦值的引數,都需要out來修飾

9.2、存盤函式

--存盤函式
--計算員工年薪
create or replace function f_years_sals (eno emp.empno%type) return number --回傳型別為number
is
       s number(10); --定義變數用來接識訓傳結果
begin
  select sal*12+nvl(comm,0) into s from emp where empno=eno;
  return s;
end;

--測驗
declare
  s number(10);
begin
  s :=f_years_sals(7788);
   dbms_output.put_line(s);
  end;
  

存盤程序和存盤函式的區別

語法區別:關鍵字不一樣,

本質區別:存盤函式有回傳值(比存盤程序多了兩個回傳值),存盤程序沒有回傳值,

十、觸發器

10.1、觸發器的概念

當我們做增刪改的時候如果需要做出什么操作,可以使用觸發器,

10.2、觸發器分類

陳述句級觸發器:不包含for each row 的觸發器,

行級觸發器:包含or each row 的觸發器,加觸發器是為了old或者new物件,

--陳述句級觸發器
create or replace trigger t1
after
insert
on person
declare
begin
   dbms_output.put_line('新員工入職');
  end;
  
insert into person values(4,'小黑');

--行級觸發器
create or replace trigger t2
before
update
on emp
for each row
  declare
  
  begin
    if :old.sal>:new.sal then
      raise_application_error(-20001,'不能降薪');
    end if;
   end;

select * from emp where empno=7788;

update emp set sal=sal-1 where empno=7788;
commit;


--觸發器實作主鍵自增
create or replace trigger auid
before
insert
on person
for each row
  declare
  
  begin
    select s_person.nextval into :new.pid from dual;
end;
    
select * from person;


insert into person(pname) values('星星')

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/272302.html

標籤:其他

上一篇:Excel: 批量去除空格的函式——trim函式, substitute函式,clean函式

下一篇:資料庫關系模式的規范化

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more