oracle實戰(一)

来源:https://www.cnblogs.com/WangLei2018/archive/2019/08/03/11295639.html
-Advertisement-
Play Games

一、表空間的創建以及刪除 聲明:此操作環境為windows,oracle10G 二、用戶 1.用戶的創建、設置密碼、設置表空間 2、授權 3、刪除用戶 4.解鎖用戶 三、Oracle數據類型(簡單的) 四、簡單DDL(數據定義語言) 1.創建表 2.修改表結構 五、DML(數據操作語言) =》 增刪 ...


一、表空間的創建以及刪除

聲明:此操作環境為windows,oracle10G

表空間?  ORACLE資料庫的邏輯單元。 
資料庫---表空間 一個表空間可以與多個數據文件(物理結構)關聯
一個資料庫下可以建立多個表空間,一個表空間可以建立多個用戶、一個用戶下可以建立多個表。
create tablespace test
datafile 'c:\test.dbf'
size 100m
autoextend on
next 100m;
test 為表空間名稱
datafile 指定表空間對應的數據文件
size 後定義的是表空間的初始大小
autoextend on 自動增長 ,當表空間存儲都占滿時,自動增長
next 後指定的是一次自動增長的大小。

 

二、用戶

1.用戶的創建、設置密碼、設置表空間

create user test
identified by password
default tablespace test;
​
-- create user 用戶名
-- identified by 後邊是用戶的密碼 
-- default tablespace 後邊是表空間名稱 
-- oracle資料庫與其它資料庫產品的區別在於,表和其它的資料庫對象都是存儲在用戶下的。

 

2、授權

-- oracle資料庫常用角色:
-- connect--連接角色,基本角色
-- resource--開發者角色
-- dba--超級管理員角色
-- 例1:給一個用戶授予dba許可權(這在生產環境中是不推薦的)
grant dba to test;
-- 例2:給一個用戶授予開發者許可權(註意,必須加上connect,不然無法連接資料庫)
grant resource,connect to test;

 

3、刪除用戶

-- 註意:刪除用戶的時候,該用戶需要處於未登陸狀態
-- 例1:刪除一個沒有自己創建對象的用戶
drop user test;
-- 例2:刪除含有自己創建的對象的用戶時(需要使用CASCADE)
drop user test cascade;

 

4.解鎖用戶

-- 例如:解鎖scott用戶(密碼預設是tiger)
-- 解鎖scott用戶
alter user scott account unlock;
-- 設置scott用戶的密碼【此句也可以用來重置密碼】
alter user scott identified by tiger; 

三、Oracle數據類型(簡單的)

NO數據類型描述
1 varchar,varchar2 表示一個字元串
2 number NUMBER(n)表示一個整數,長度是n NUMBER(m,n):表示一個小數,總長度是m,小數是n,整數是m-n
3 date 表示日期類型
4 clob 大對象,表示大文本數據類型,可存4G
5 blob 大對象,表示二進位數據,可存4G

四、簡單DDL(數據定義語言)

1.創建表

語法:
Create table 表名(
欄位1 數據類型 [default 預設值],
欄位2 數據類型 [default 預設值],
...
欄位n 數據類型 [default 預設值]
);
​
-- 創建一個person表
create table person(
       pid number(20),
       pname varchar2(10)
);

 

2.修改表結構

---添加一列 
alter table person add (sex number(1)); 
-- 修改列類型 
alter table person modify sex char(1); 
-- 修改列名稱 
alter table person rename column sex to gender; 
-- 刪除一列 
alter table person drop column gender;

 

 

五、DML(數據操作語言) =》 增刪改

1.插入數據

insert into person (pid,pname) values('1','小李'); commit;

 

2.修改數據

update person set pname = '小張' where pid = '1'; commit;

 

3.三種刪除

-- 刪除表中全部記錄
delete from person;
-- 刪除表結構
drop table person;
-- 先刪除表,再次創建表。效果等同於刪除表中全部記錄。
-- 在數據量大的情況下,尤其在表中帶有索引的情況下,該操作效率高。
-- 索引可以提供查詢效率,但是會影響增刪改效率。
truncate table person;

六、序列

簡介:

序列不真的屬於任何一張表,但是可以邏輯和表做綁定。 序列:預設從1開始,依次遞增,主要用來給主鍵賦值使用。 dual:虛表,只是為了補全語法,沒有任何意義。

 

1、創建序列

create sequence sq_person;

 

2.兩個函數及序列用法

-- sequence.nextval   序列自增並查詢
select sq_person.nextval from dual;
-- sequence.currval    查詢序列當前參數
select sq_person.currval from dual;
-- 註意:序列剛創建的時候不能直接使用currval函數,需要在nextval函數執行後才能執行
-- 充當主鍵(插入數據):
insert into person (pid, pname) values (s_person.nextval, '小明');
commit;

3.刪除序列

drop sequence sq_person;

 

七、DQL(數據查詢語言)

前言:要測試以下部分例子:請切換到scott用戶  以下使用的表為該用戶自帶的預設表

1.簡單查詢

select * from person; -- 開發不推薦

select pid,pname from person; -- 開發推薦

 

2.單行函數、條件表達式、多行函數、分組查詢、多表查詢、子查詢、分頁查詢

a.單行函數

-- 字元函數
-- 接收字元輸入返回字元或者數值,dual是偽表
-- 1. 把小寫的字元轉換成大小的字元 upper('smith')
select upper('yes') from dual;--YES
-- 2. 把大寫字元變成小寫字元
select lower('YES') from dual;--yes
-- 數值函數
select round(56.16, -2) from dual;---四捨五入,後面的參數表示保留的位數
select trunc(56.16, -1) from dual;---直接截取,不在看後面位數的數字是否大於5.
select mod(10, 3) from dual;---求餘數
-- 日期函數
----查詢出emp表中所有員工入職距離現在幾天。
select sysdate-e.hiredate from emp e;
----算出明天此刻
select sysdate+1 from dual;
----查詢出emp表中所有員工入職距離現在幾月。
select months_between(sysdate,e.hiredate) from emp e;
----查詢出emp表中所有員工入職距離現在幾年。
select months_between(sysdate,e.hiredate)/12 from emp e;
----查詢出emp表中所有員工入職距離現在幾周。
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('2018-6-7 16:39:50', 'fm yyyy-mm-dd hh24:mi:ss') from dual;
​
-- 通用函數
-- 算出emp表中所有員工的年薪
-- 獎金裡面有null值,如果null值和任意數字做算術運算,結果都是null。
select e.sal*12+nvl(e.comm, 0) from emp e;

 

b.條件表達式

---條件表達式的通用寫法,mysql和oracle通用
---給emp表中員工起中文名
select e.ename, 
       case e.ename
         when 'SMITH' then '傻瓜'
           when 'ALLEN' then '白痴'
             when 'WARD' then '二流子'
               --else '專家'
                 end
from emp e;
---判斷emp表中員工工資,如果高於3000顯示高收入,如果高於1500低於3000顯示中等收入,
-----其餘顯示低收入
select e.sal, 
       case 
         when e.sal>3000 then '高收入'
           when e.sal>1500 then '中等收入'
               else '低收入'
                 end
from emp e;
----oracle中除了起別名,都用單引號。
----oracle專用條件表達式
select e.ename, 
        decode(e.ename,
          'SMITH',  '關羽',
            'ALLEN',  '張飛',
              'WARD',  '劉備',
                '小白') "中文名"             
from emp e;

 

c.多行函數

-- 多行函數【聚合函數】:作用於多行,返回一個值。
select count(1) from emp;   -- 查詢總數量
select sum(sal) from emp;   -- 工資總和
select max(sal) from emp;   -- 最大工資
select min(sal) from emp;   -- 最低工資
select avg(sal) from emp;   -- 平均工資

 

d.分組查詢

-- 查詢出每個部門的平均工資
-- 分組查詢中,出現在group by後面的原始列,才能出現在select後面
-- 沒有出現在group by後面的列,想在select後面,必須加上聚合函數。
-- 聚合函數有一個特性,可以把多行記錄變成一個值。
select e.deptno, avg(e.sal)--, e.ename 
from emp e
group by e.deptno;
-- 查詢出平均工資高於2000的部門信息
select e.deptno, avg(e.sal) asal
from emp e
group by e.deptno
having avg(e.sal)>2000;
-- 所有條件都不能使用別名來判斷。
-- 比如下麵的條件語句也不能使用別名當條件
select ename, sal s from emp where sal>1500;
​
-- 查詢出每個部門工資高於800的員工的平均工資
select e.deptno, avg(e.sal) asal
from emp e
where e.sal>800
group by e.deptno;
-- where是過濾分組前的數據,having是過濾分組後的數據。
-- 表現形式:where必須在group by之前,having是在group by之後。
-- 查詢出每個部門工資高於800的員工的平均工資
-- 然後再查詢出平均工資高於2000的部門
select e.deptno, avg(e.sal) asal
from emp e
where e.sal>800
group by e.deptno
having avg(e.sal)>2000;

 

e.多表查詢

-- 笛卡爾積
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 * from emp;
-- 查詢出員工姓名,員工領導姓名
-- 自連接:自連接其實就是站在不同的角度把一張表看成多張表。
select e1.ename, e2.ename
from emp e1, emp e2
where e1.mgr = e2.empno;
-- 查詢出員工姓名,員工部門名稱,員工領導姓名,員工領導部門名稱
select e1.ename, d1.dname, e2.ename, d2.dname
from emp e1, emp e2, dept d1, dept d2
where e1.mgr = e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno;

 

f.子查詢

-- 子查詢返回一個值
-- 查詢出工資和SCOTT一樣的員工信息
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);
-- 子查詢返回一張表
-- 查詢出每個部門最低工資,和最低工資員工姓名,和該員工所在部門名稱
-- 1,先查詢出每個部門最低工資
select deptno, min(sal) msal
from emp 
group by deptno;
-- 2,三表聯查,得到最終結果。
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;

 

g.分頁查詢

-- oracle中的分頁
-- rownum行號:當我們做select操作的時候,
-- 每查詢出一行記錄,就會在該行上加上一個行號,
-- 行號從1開始,依次遞增,不能跳著走。
-- 排序操作會影響rownum的順序
select rownum, e.* from emp e order by e.sal desc
-- 如果涉及到排序,但是還要使用rownum的話,我們可以再次嵌套查詢。
select rownum, t.* from(
select rownum, e.* from emp e order by e.sal desc) t;
​
​
-- emp表工資倒敘排列後,每頁五條記錄,查詢第二頁。
-- rownum行號不能寫上大於一個正數。
select * from(
    select rownum rn, tt.* from(
          select * from emp order by sal desc
    ) tt where rownum<11
) where rn>5

 

八、視圖

-- 前言:如果要操作視圖,用戶需要dab許可權
-- 視圖的概念:視圖就是提供一個查詢的視窗,所有數據來自於原表。
-- 查詢語句創建表
create table emp as select * from scott.emp;
select * from emp;
-- 創建視圖【必須有dba許可權】
create view v_emp as select ename, job from emp;
-- 查詢視圖
select * from v_emp;
-- 修改視圖[不推薦]
update v_emp set job='CLERK' where ename='ALLEN';
commit;
-- 創建只讀視圖
create view v_emp1 as select ename, job from emp with read only;
-- 視圖的作用?
-- 第一:視圖可以屏蔽掉一些敏感欄位。
-- 第二:保證總部和分部數據及時統一。

 

九、索引

-- 索引的概念:索引就是在表的列上構建一個二叉樹
-- 達到大幅度提高查詢效率的目的,但是索引會影響增刪改的效率。
-- 單列索引
-- 創建單列索引
create index idx_ename on emp(ename);
-- 單列索引觸發規則,條件必須是索引列中的原始值。
-- 單行函數,模糊查詢,都會影響索引的觸發。
select * from emp where ename='SCOTT'
-- 複合索引
-- 創建複合索引
create index idx_enamejob on emp(ename, job);
-- 複合索引中第一列為優先檢索列
-- 如果要觸發複合索引,必須包含有優先檢索列中的原始值。
select * from emp where ename='SCOTT' and job='xx';-- 觸發複合索引
select * from emp where ename='SCOTT' or job='xx'; -- 不觸發索引
select * from emp where ename='SCOTT';  -- 觸發單列索引。

bug總結:

1.中文亂碼的解決:

1.查看伺服器端編碼
select userenv('language') from dual;
我實際查到的結果為:AMERICAN_AMERICA.ZHS16GBK
2.執行語句
select * from V$NLS_PARAMETERS
查看第一行中PARAMETER項中為NLS_LANGUAGE 對應的VALUE項中是否和第一步得到的值一樣。
如果不是,需要設置環境變數.
否則PLSQL客戶端使用的編碼和伺服器端編碼不一致,插入中文時就會出現亂碼.
3.設置環境變數
電腦->屬性->高級系統設置->環境變數->新建
設置變數名:NLS_LANG,變數值:第1步查到的值, 我的是 AMERICAN_AMERICA.ZHS16GBK
4.重新啟動PLSQL,插入數據正常

 

作者:醉煙

出處:https://www.cnblogs.com/WangLei2018/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux常用目錄——存放 /bin 所有用戶可以使用的可執行文件 /sbin 新管理員使用的執行文件 /boot Linux內核映像文件和與引導載入有關的文件 /dev 設備文件 /etc 系統配置文件 /mnt 掛載點,常用於掛載文件系統 /lib 共用庫文件 /proc 基於記憶體的文件系統,用 ...
  • CRT遠程連接centos7,連接超時 問題原因: 宿主機(win10)和虛擬機(centos7)不在同一個網段 在宿主機無法ping通虛擬機, 首先在cmd視窗ipconfig查看一下vmnet的ip地址 然後在centos使用命令ifconfig查看ip地址 現在宿主機和虛擬機在同一個網段,所以 ...
  • 本文是記錄一下學習docker的過程,希望可以幫助到入門的朋友。 系統:ubuntu16.04 docker:18.09 打開官網:https://docs.docker.com/install/linux/docker-ce/ubuntu/ OS requirements To install D ...
  • 1 拋棄舊文化,迎接Linux命令新文化 Linux第一步,從Windows思維,切換到Linux的“命令行+文件”模式 在Linux中,做什麼都有相應命令。一般就在bin或者sbin目錄下,數量繁多。如果你事先不知道該用哪個命令,很難通過枚舉的方式找到。因此,在這樣沒有統一入口的情況下,就需要你對 ...
  • 基於MySQL Router可以實現高可用,讀寫分離,負載均衡之類的,MySQL Router可以說是非常輕量級的一個中間件了。看了一下MySQL Router的原理,其實並不複雜,原理也並不難理解,其實就是一個類似於VIP的代理功能,其中一個MySQL Router有兩個埠號,分別是對讀和寫的轉 ...
  • 說明:本文主要詳細介紹了關於如何在阿裡雲ECS伺服器上安裝並配置Mysql 環境:Centos 7版本,阿裡雲部署好系統後會預設安裝mariadb資料庫 1、刪除阿裡雲自帶的MariaDB 2、下載與安裝Mysql (1)下載MySql官方的yum repository (2)下載並安裝rpm包 ( ...
  • 哨兵機制存在的意義: 為了實現redis故障轉移的自動化。自動發現,自動轉移。不需要人工參與。 用戶管理多個Redis伺服器,該系統執行三個任務: 監控:哨兵會不間斷的檢查Master和Slave是否正常運行 提醒:當被監控的某個Redis出現問題,哨兵通過API向管理員或者應用程式發送通知 自動故 ...
  • 一句話概括就是Sum(列) 是求和,把所有列的值進行彙總求和;COUNT(列) 是行數彙總,只要列的值不為Null,就會增加1; 舉個例子說明下: --創建臨時表結構 CREATE TABLE TempTB ( ID int , Name varchar(20), Price Int ) --寫入示 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...