Oracle基礎

一、 Oracle數據庫的體系結構

在這裏插入圖片描述

1 數據庫 database

Oracle數據庫是數據的物理存儲,這就包括(數據文件ORA或者DBF、控制文件、聯機日誌、參數文件),其中Oracle數據庫的概念和其他數據庫不一樣,這裏的數據庫是一個操作系統只有一個庫,可以看做是Oracle就只有一個大數據庫。

2 實例

用Oracle官方描述:實例是訪問Oracle數據庫所需的一部分計算機內存和輔助處理後臺進程,是由進程和這些進程所使用的內存(SGA)所構成一個集合。其實就是用來訪問和使用數據庫的一塊進程,它只存在於內存中。就像Java中new出來的實例對象一樣。我們訪問Oracle都是訪問一個實例,但這個實例如果關聯了數據庫文件,就是可以訪問的,如果沒有,就會得到實例不可用的錯誤。實例名指的是用於響應某個數據庫操作的數據庫管理系統的名稱。她同時也叫SID。實例名是由參數instance_name決定的。查詢當前數據庫實例名:select instance_name from v$instance;數據庫實例名(instance_name)用於對外部連接。在操作系統中要取得與數據庫的聯繫,必須使用數據庫實例名。比如我們作開發,要連接數據庫,就得連接數據庫實例名:
jdbc:oracle:thin:@localhost:1521:orcl(orcl就爲數據庫實例名),一個數據庫可以有多個實例,在作數據庫服務集羣的時候可以用到。

3 表空間

Oracle數據庫是通過表空間來存儲物理表的,一個數據庫實例可以有N個表空間,一個表空間下可以有N張表。有了數據庫,就可以創建表空間。表空間(tablespace)是數據庫的邏輯劃分,每個數據庫至少有一個表空間(稱作SYSTEM表空間)。爲了便於管理和提高運行效率,可以使用一些附加表空間來劃分用戶和應用程序。例如:USER表空間供一般用戶使用,RBS表空間供回滾段使用。一個表空間只能屬於一個數據庫。創建表空間語法:
Create TableSpace 表空間名稱 DataFile 表空間數據文件路徑 Size 表空間初始大小 Autoextend on
如:create tablespace db_test datafile 'D:\oracle\product\10.2.0\userdata\db_test.dbf' size 50m autoextend on;
查看已經創建好的表空間:

select default_tablespace, temporary_tablespace,d.username from dba_users d;

查看當前用戶的缺省表空間:

select username,default_tablespace from user_users;

4 用戶

Oracle數據庫建好後,要想在數據庫裏建表,必須先爲數據庫建立用戶,併爲用戶指定表空間。上面我們建好了數據庫和表空間,接下來建用戶,創建新用戶:CREATE USER 用戶名 IDENTIFIEDBY 密碼 DEFAULT TABLESPACE 表空間(默認USERS)
TEMPORARY TABLESPACE 臨時表空間(默認TEMP)
如:CREATE USER utest IDENTIFIED BY utestpwd DEFAULT TABLESPACE db_test TEMPORARY TABLESPACE temp;(這裏臨時表空間不能使用我們創建的db_test,不知爲何?)有了用戶,要想使用用戶賬號管理自己的表空間,還得給它分權限:

GRANT CONNECT TO utest;
GRANT RESOURCE TO utest;

GRANT dba TO utest;–dba爲最高級權限,可以創建數據庫,表等。
查看數據庫用戶:

select * from dba_users;

5 Oracle用戶與表空間的關係

用戶=商家 表=商品 表空間=倉庫
(1). 1個商家(用戶)能有很多商品(表),1個商品(表)只能屬於一個商家(用戶)
(2)1個商品(表)可以放到倉庫A(表空間),也可以放到倉庫B(表空間),但不能同時放入A(表空間)和B(表空間)
(3)倉庫(表空間)不屬於任何商家(用戶)
(4)商家(用戶)都有一個默認的倉庫(表空間),如果不指定具體倉庫(表空間),商品(表)則放到默認的倉庫(表空間)中
oracle中用戶的所有數據都是存放在表空間中的,很多個用戶可以共用一個表空間,也可以指定一個用戶只用某一個表空間。
表空間:創建表空間會在物理磁盤上建立一個數據文件,作爲數據庫對象(用戶、表、存儲過程等等)的物理存儲空間;
用戶:創建用戶必須爲其指定表空間,如果沒有顯性指定默認表空間,則指定爲users表空間;創建用戶後,可以在用戶上,創建表、存儲過程等等其他數據庫對象;
表:是數據記錄的集合;
創建過程: 表空間—>用戶—>表;
所屬關係: 表空間 包含 用戶 包含 表

6 實例、表空間、用戶、表的關係

在這裏插入圖片描述

二、過濾排序和基本查詢

1 select

emp-員工表:
EMPNO NUMBER(4) 員工號
ENAME VARCHAR2(10) 員工名字
JOB VARCHAR2(9) 職位
MGR NUMBER(4) 老闆
HIREDATE DATE 入職日期
SAL NUMBER(7,2) 月薪
COMM NUMBER(7,2) 獎金
DEPTNO NUMBER(2) 部門號

select empno,ename,sal,sal*12,comm,comm+sal*12 from emp;

在這裏插入圖片描述
(1)包含null的表達式都爲null
(2)null永遠!=null,判斷爲null應該使用is null
針對於以上第一個問題:
需要了解兩個函數:
nvl函數的格式如下:nvl(expr1,expr2)
含義是:如果oracle第一個參數爲null那麼結果爲第二個參數的值,如果第一個參數的值不爲null,則結果爲第一個參數本來的值。
nvl2函數的格式如下:nvl2(expr1,expr2, expr3)
含義是:如果該函數的第一個參數爲null那麼結果第二個參數的值,如果第一個參數的值不爲null,則結果爲第三個參數的值。
因此針對第一個問題:

select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0) from emp;

在這裏插入圖片描述
針對第二個問題:

select * from emp where comm is null; 

在這裏插入圖片描述
(3)distinct 去掉重複記錄

select distinct job,deptno from emp;

distinct作用於後面所有列,只要後面列組合起來是唯一的。
在這裏插入圖片描述

(4)dual 僞表

select 3+2 from dual;

在這裏插入圖片描述
(5)字符串的連接使用連接符 ||

select 'hello' || 'world' "你好世界" from dual;

在這裏插入圖片描述
(6)比較運算符
在這裏插入圖片描述
在這裏插入圖片描述
(7)邏輯運算符
在這裏插入圖片描述
(8)非空和空的限制
非空:is not null
空:null

select * from emp where comm is not null;
select * from emp where comm is null; 

(9) Demo

--查詢月薪大於1500並且有獎金領取的僱員
select * from emp where comm is not null and sal>1500;
--查詢工資不大於1500並且沒有獎金的僱員
select * from emp where comm is null and  not(sal>1500); 
--查詢員工編號7369,7499,7521的員工具體信息
select * from emp where empno in (7369,7499,7521)

(10) 模糊查詢
通配符:
“%”:可以匹配任意長度的內容;
“_”:可以匹配一個長度的內容。

--查詢出所有僱員姓名中第二個字母爲'M'的僱員
select * from emp where ename like '_M%'
--查詢姓名中帶有'M'的僱員
select * from emp where ename like '%M%'

(11)排序
desc:降序;asc:升序,未指定默認升序

--查詢僱員工資從低到高
select * from emp order by sal;
--部門升序,工資降序
select * from emp order by deptno asc,sal desc;

(12)排序中的空值問題
通過nulls first、nulls last 指定null顯示的位置

select * from emp order by sal nulls first;
select * from emp order by sal desc nulls last;

三、函數

在這裏插入圖片描述
在這裏插入圖片描述

1 單行函數

在這裏插入圖片描述

--字符函數
select lower('Hello World') 轉小寫,upper('Hello World') 轉大寫,initcap('hello world') 首字母大寫 from dual;

在這裏插入圖片描述

--substr(a,b) 從a中,第b位開始取
select substr('Hello World',4) 子串 from dual;

在這裏插入圖片描述

--substr(a,b,c) 從a中,第b位開始取,取c位
select substr('Hello World',4,3) 子串 from dual;

在這裏插入圖片描述

--length 字符數 lengthb 字節數
select length('Hello World') 字符,lengthb('Hello World') 字節 from dual;

在這裏插入圖片描述

--instr(a,b) 在a中,查找b的位置
select instr('Hello World','ll') 位置 from dual;

在這裏插入圖片描述

--lpad 左填充到固定長度  rpad 右填充到固定長度
select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右 from dual;

在這裏插入圖片描述

--trim 去掉前後指定的字符
select trim('H' from 'Hello WorldH') 去掉前後指定的字符 from dual;

在這裏插入圖片描述

--replace(a,b,c)
select replace('Hello World','l','*') "將hello world中的l替換爲*" from dual;

在這裏插入圖片描述

--四捨五入
select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,round(45.926,-1) 四,round(45.926,-2) 五 from dual;

在這裏插入圖片描述

--截斷
select trunc(45.926,2) 一,trunc(45.926,1) 二,trunc(45.926,0) 三,trunc(45.926,-1) 四,trunc(45.926,-2) 五 from dual;

在這裏插入圖片描述

--當前時間
select sysdate from dual;

在這裏插入圖片描述

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') currentdate from dual;

在這裏插入圖片描述

select to_char(sysdate-1,'yyyy-mm-dd') 昨天,to_char(sysdate,'yyyy-mm-dd') 今天,to_char(sysdate+1,'yyyy-mm-dd') 明天 from dual;

在這裏插入圖片描述

--計算員工的工齡:天 星期  月 年
select ename 員工姓名,
hiredate 入職日期,
'已入職'||round(sysdate-hiredate,2)||'天' 入職天數,
'已入職'||round((sysdate-hiredate)/7,2)||'星期' 入職星期數,
'已入職'||round((sysdate-hiredate)/30,2)||'月' 入職月數,
'已入職'||round((sysdate-hiredate)/365,2)||'年' 入職年數 
from emp;

在這裏插入圖片描述

select sysdate+hiredate from emp;

在這裏插入圖片描述

select ename 員工姓名,hiredate 入職日期,round(months_between(sysdate,hiredate),2) 現在距離入職已經過去的月數 from emp;

在這裏插入圖片描述

--53個月後
select to_char(sysdate,'yyyy-mm-dd') "今天",to_char(add_months(sysdate,53),'yyyy-mm-dd') "53個月後" from dual;

在這裏插入圖片描述

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