史上最全的ORACLE基礎教程


 ORACLE命令和語句挺多,全部記憶下來不現實,況且有不常用的指令。下面把大部分的指令做了記錄和詳細的注釋。建議收藏、轉發此篇文章,如果忘記可以翻出來查查。關注公眾號it_learn獲取更多學習資源

用戶與權限

創建用戶

create user 用戶名 identified by 密碼;

給用戶修改密碼

alter user 用戶名 identified by 新密碼;

修改自己的密碼

password 用戶名;

刪除用戶

drop user 用戶名 [cascade]可選參數 cascade

在刪除用戶時,注意: 如果要刪除的用戶,已經創建了表,那么就需要在刪除的時候帶一個參數 cascade; Cascade 有級聯的作用

l 給用戶賦權限

grant 權限/角色 to 用戶名;

收回用戶權限

revoke 權限/角色 from 用戶名;

系統權限:是數據庫管理相關的權限:create session(登錄權限)、create table(創建表權限)、create index(創建索引權限)、create view(創建視圖權限)、create sequence(創建序列權限)、create trriger(創建觸發器權限)

connnect 角色:是授予用戶的最基本的權利,能夠連接到 oralce 數據庫中,並在對其他用戶的表有訪問權限時,做 SELECT、UPDATE、INSERTT 等操作。Create session--建立會話;Alter session--修改會話;Create view--建立視圖。Create sequence--建立序列等權限

resource 角色:具有創建表、序列、視圖等權限。Create table--建表;Create trigger-- 建立促發器;Create procedure--建立過程;Create sequence—建立序列;Create type--建立類型等權限;

dba 角色:是授予系統管理員的,擁有該角色的用戶就能成為系統管理員了,它擁有所有的系統權限。

表空間

創建表空間必須使用 system 用戶創建

create tablespace hpu56(表空間名)

datafile 'E:\datebase\hpu6.DBF' //指定指向的數據文件路徑

size 5m      //初始化表空間大小為 5m

autoextend on next 2m      //自動擴展,每次擴展 2m

maxsize unlimited;         // unlimited最大擴展量沒有限制,100M最大擴展到100M

創建用戶指定默認表空間

create user 用戶名 identified by 密碼 default tablespace 表空間名;

修改用戶默認表空間:

alter user 用戶名 default tablespace 表空間名;

查看表空間:

select * from v$tablespace;

查看用戶默認表空間:

select username,default_tablespace from dba_users where username='SCOTT';

注意:這里的用戶名 SCOTT 必須是大寫

表結構的操作

創建表:

create table 表的名稱(字段名稱 1 數據類型, 字段名稱 2  數據類型);

create table 表的名稱 as select 字段名稱 1, 字段名稱 2... from表的名稱 ;

修改表

alter table 語句添加、修改或刪除列的語法

添加列

alter table 表的名稱 add(字段名稱1 數據類型, 字段名稱2  數據類型...);

alter table 表的名稱 add 字段名稱 數據類型;

修改列

alter table 表名 modify(字段名稱1 數據類型, 字段名稱2  數據類型...);

       alter table 表名 modify字段名稱 數據類型;

刪除列

alter table 表名 drop(字段名稱1 , 字段名稱2,...);

alter table 表名 drop 字段名稱;

修改表的名稱

rename 表名 to 新表名;

修改列名

alter table 表名 rename column 舊列名 to 新列名;

查看表結構

desc 表名;

約束

約束分為: 非空(NOT NULL)約束、 唯一(UNIQUE)約束、主鍵(PRIMARY KEY)約束、外鍵(FOREIGN KEY)約束、條件(CHECK)約束,約束存在表user_constraints中。

非空(NOT NULL)

添加非空

create table 表名稱 (字段名稱1 數據類型,字段名稱2 數據類型 not null);

alter table  表名 modify 字段名 not null;

刪除非空

alter table  表名 modify 字段名   null;

唯一(UNIQUE)

添加修改唯一

create table 表名稱 (字段名稱1 數據類型,字段名稱2 數據類型 unique);

alter table 表名 add constraint 約束名 unique (字段名稱1,字段名稱2);

刪除唯一

alter table  表名 drop constratint 約束名稱;

注意:oracle unique 可以為 null,而且允許多行為 null

主鍵(PRIMARY KEY)

添加修改主鍵

create table 表名稱 (字段名稱1 數據類型,字段名稱2 數據類型 primary key);

create table 表名稱 (字段名稱1 數據類型,字段名稱2 數據類型 , constraint 約束名primary key (字段名稱1,字段名稱2));

alter table 表名 add constraint 約束名 primary key (字段名稱1,字段名稱2);

刪除主鍵

alter table  表名 drop primary key cascade;

這是因為如果在兩張表存在主從關系,那么在刪除主要的主鍵約束時, 必需帶上 cascade 選項

注意:每個表只能有且有一個主鍵約束。

特別說明 primary key 與 unique 的區別:

1、一張表可以有多個 unique(唯一)約束;

2、一張表只能有一個主鍵;

3、設置為主鍵的列不能有 null 值;

外鍵(FOREIGN KEY)

外鍵(FOREIGN KEY)約束:用來維護從表(Child Table)和主表(Parent Table)之間的引用完整性.能夠維護數據庫的數據一致性,數據的完整性。防止錯誤的垃圾數據入庫;  

用於定義主表和從表之間的關系,外鍵約束要定義在從表上,主表則必需具有主鍵約束或是 unique 約束,當定義外鍵約束后,要求外鍵列數據必需在主表的主鍵列存在或是為 null

添加修改主鍵

create table 表名稱 (字段名稱1 數據類型,字段名稱2 數據類型 references 主表名稱(字段名) );

create table 表名稱 (字段名稱1 數據類型,字段名稱2 數據類型 , constraint 約束名 foreign key (字段名稱) references主表名稱(字段名)));

alter table 表名 add constraint 約束名  foreign key(字段名稱)  references 主表名稱(字段名); 

刪除主鍵

alter table  表名 drop constratint 約束名稱;

特別說明:froeign key 外鍵的細節

1、外鍵指向主鍵列;

2、外鍵可以指向 unique 列;

3、建表時先建主表,再建從表;刪除表先刪從表,再刪主表。

4、外鍵列屬性值要與主鍵或 unique 列屬性值的類型保持一致

5、外鍵列的值,必需在主鍵列中存在。但外鍵列的值允許為 null

條件(CHECK)

添加修改條件

create table 表名稱 (字段名稱1 數據類型,字段名稱2 數據類型 check (字段名稱2 in (值1,值2...)));

alter table 表名 add constraint 約束名 check (字段名稱 in  (值1,值2...));

刪除條件

alter table  表名 drop constratint 約束名稱;

約束命名規則:

非空約束: NN_表名_列名

唯一約束: UK_表名_列名

主鍵約束: PK_表名   

外鍵約束: FK_表名_列名

條件約束: CK_表名_列名

顯示表約束信息

select  *  from user_constraints  where table_name = '表名';

數據操作

添加數據

insert into  表名[(列名 [,列名 2...])] values(值 [,值 2...]);

插入全部數據

insert into  表名 values(值 [,值 2...]);

從表中導入數據

insert into  表名 (select 值1,值2,值3...from 表名2 );

修改數據

update 表名 set 列名=表達式 [,列名 2=表達式 2,...][where 條件];

刪除數據

delete from 表名 [where 條件表達式];

刪除的幾種方法比較:

delete from 表名;

刪除所有記錄,表結構還在,寫日志,可以恢復的,速度慢

drop table 表名;

刪除表的結構和數據

truncate table 表名;

刪除表中的所有記錄,表結構還在,不寫日志,無法找回刪除的記錄,速度快。

基本查詢數據

基本語法:

select [是否剔除重復數據] *|{字段名(列名),字段名 2(列名 2),字段名 3(列名 3)..} from 表名 [where {條件}];

注意事項:

1、select 指定查詢哪些列的數據;

2、column 指定列名;

3、*代表查詢所有列;

4、from 指定查詢哪張表;

5、distinct 可選,指顯示結果時,是否剔除重復數據;

6、where 條件。

使用列的別名

select ename as "姓名",sal*13+nvl(comm,0)*13 as "年收入" from emp;

特別注意:

oracle 在使用別名時,可以用雙引號或不使用或使用 as 來表明別名。但不能使用單引號。

如何處理 null 值

         nvl 函數:oracle 提供的函數,是用於處理 null 值使用的。

SQL>select ename,sal*13+nvl(comm,0)*13 from emp;

nvl(值 1,值 2) 解釋:nvl 值 1 為 null 時則取值 2,值 1 不為 null 時則取值 1 原值。

如何連接字符串(||)

在查詢的時候,希望把多列內容做為一列內容返回可以使用||連接符。

SQL>select ename ||'年收入'||(sal*13+nvl(comm,0)*13) "雇員的年收入" from emp;

取范圍內的值(between)

SQL>select * from emp where sal between 2000 and 2500;

between 是指定區間內取值,如:between 2000 and 2500,取 2000 至 2500 內的值,同時包含

2000 和 2500

如何使用 like 操作符

%:表示任意 0 到多個字符

_:表示任意單個字符

1)如何顯示首字符為 S 的員工姓名和工資

SQL>select ename,sal from emp where ename like 'S%';

2)如何顯示第三個字符為大寫 O 的所有員工的姓名和工資

SQL>select ename,sal from emp where ename link 'O%';

在 where 條件中使用 in

SQL>select * from emp where empno in(123,345,800);

注意:in 只能放1000個值

使用 is null 的操作符

在查詢語句中不能使用=或者!=null判斷是否為空

SQL>select * from emp where mgr is null;

SQL>select * from emp where mgr is not null;

使用邏輯操作符號

查詢工資高於 500 或是崗位為 manager 的雇員,同時還要滿足他們的姓名首寫字母為大寫的 J

SQL>select * from emp where (sal>500 or job='MANAGER') and (ename like 'J%');

使用 order by 子句

如何按照工資的從低到高的順序顯示雇員的信息

SQL>select * from emp order by sal asc;

注意:asc 寫或不寫都是升序排序即從小到大排序,desc 則是降序排序從大到小排序。

使用列的別名排序

SQL>select ename,sal*12 "年薪" from emp order by "年薪" asc;

別名需要使用“”號圈中。

Oracle分組查詢

在實際應用中經常需要執行復雜的數據統計,經常需要顯示多張表的數據;要用到分組函數 max,min,avg,sum,count

Max(),min()最大最小

如何顯示所有員工中最高工資和最低工資

SQL>select max(sal) "最高工資",min(sal) "最低工資" from emp;

請查詢最高年工資

SQL>select max(sal*13+nvl(comm,0)*13) "最高年工資",min(sal*13+nvl(comm,0)*13) "最低年工資" from

emp;

Avg()求平均

顯示所有員工的平均工資和工資總和

SQL>select avg(sal) "平均工資",sum(sal) "工資總和" from emp;

特別注意:

avg(sal)不會把 sal 為 null 的行進行統計,因此我們要注意,如果為空值也考慮,則可以

SQL>selec sum(sal)/count(*) from emp;

count(*)求總數

計算共有多少員工

SQL>select count(*) "共有員工" from emp;

group by 和 having 子句

group by:用於對查詢的結果分組統計;

having 子句:用於限制(過濾)分組顯示結果

1)如何顯示每個部門的平均工資和最高工資

SQL>select avg(sal) "平均工資",max(sal) "最高工資",deptno "部門編號" from emp group by deptno;

2)顯示每個部門的每種崗位的平均工資和最低工資

SQL>select avg(sal) "平均工資",min(sal) "最低工資",job "職位",deptno "部門編號" from emp group by  deptno,job order by deptno;

對數據分組的總結:

1、分組函數(avg...)只能出現在選擇列表、having、order by 子句中;

2、如果在 select 語句中同時包含有 group by/having/order by 那么他們的順序是 group by/having/order

by;

3、在選擇列中如果有列、表達式和分組函數,那么這些列和表達式必需有一個出現在 group by 子句中,否則會出錯。

Oralce函數

Ascii()

返回與指定的字符對應的十進制數;

SQL>select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;

chr()

給出整數,返回對應的字符;

SQL>select chr(54740) zhao,chr(65) chr65 from dual;

concat()

連接兩個字符串,與||作用相同;

SQL>select concat('hello','world') from dual;

initcap()

返回字符串並將字符串的第一個字母變成大寫;

SQL>select initcap('smith') upp from dual;

instr(C1,C2,I,J)

在一個字符串中搜索指定的字符,返回發現指定的字符的位置;

C1    被搜索的字符串;

C2    希望搜索的字符串;

I    搜索的開始位置,默認為 1;

J       第  j 次出現的位置,默認為 1;

SQL>select instr('oracle training','ra',1,2) instring from dual;

length()

返回字符串的長度;

SQL>select ename, length(ename) , job , length(job), sal, length(to_char(sal)) from emp where ename='SMITH';

lower()

返回字符串,並將所有的字符小寫;

SQL>select lower('AaBbCcDd') "lower-AaBbCcDd" from dual;

upper()

返回字符串,並將所有的字符大寫;

SQL>select upper('AaBbCcDd') "upper-AaBbCcDd" from dual;

rpad 和 lpad(粘貼字符)

rpad 在列的右邊粘貼字符 rpad('顯示內容'或字段,顯示長度,'填充占位符')

lpad 在列的左邊粘貼字符 lpad('顯示內容'或字段,顯示長度,'填充占位符')

SQL>select lpad(rpad('htf',10,'*'),17,'*') from dual;

ltrim 和 rtrim

ltrim  刪除左邊出現的字符串 ltrim('原內容'或字段,'要刪除的字符串')

rtrim  刪除右邊出現的字符串 rtrim('原內容'或字段,'要刪除的字符串')

SQL>select rtrim('**han teng fei**','*') from dual;

substr(string,start,count)

取子字符串,從 start 開始,取 count 個

SQL>select substr('13088888888',3,8) from dual;

replace('string','s1','s2')

string   希望被替換的字符或變量

s1 被替換的字符串

s2 要替換的字符串

SQL>select replace('he love you','he','i') from dual;

trim('s' from 'string')

如果不指定參數,默認為空格符。

SQL>select trim(0 from 0009872348900) "trim example" from dual;

數學函數

ceil(向上取整)

返回大於或等於給出數字的最小整數;

SQL>select ceil(3.14159265) from dual;

floor(向下取整)

對給定的數字取整數;

SQL>select floor(2345.67) from dual;

trunc(精度截取)

按照指定的精度截取一個數;

SQL>select trunc(124.1666,-2),trunc(124.16666,2) from dual;

round 和 trunk

按照指定的精度進行舍入;

round 函數為四舍五入

trunc(直接截取)

SQL>select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;

abs

返回指定值的絕對值;

SQL>select abs(100),abs(-100) from dual;

acos

給出反余弦的值;

SQL>select acos(-1) from dual;

asin

給出反正弦的值;

SQL>select asin(0.5) from dual;

atan

返回一個數字的反正切值;

SQL>select atan(1) from dual;

cos

返回一個給定數字的余弦;

SQL>select cos(-3.14159265) from dual;

mod(n1,n2)

返回一個 n1 除以 n2 的余數;(取模函數)

SQL>select mod(10,3),mod(3,3),mod(2,3) from dual;

日期函數

介紹 :日期函數用於處理 date 類型的數據。

默認情況下日期格式是 dd-mon-yy 12-7 -78

add_months(掌握)

add_months(日期值,增加(減少)值)增加或減去月份;

SQL>select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;

last_day

返回日期當月的最后一天;

SQL>select to_char(last_day(sysdate),'yyyy-mm-dd') from dual;

months_between(date2,date1)

給出 date2-date1 的月份,共有多少個月;

SQL>select months_between('19-12 月-1999','19-3 月-1999') mon_between from dual;

next_day(date,'day')

給出日期 date 和星期 X(day)之后計算下一個星期的日期;

SQL>select next_day('1-3 -2017','星期五') next_day from dual;

Sysdate

用來得到系統的當前日期;

SQL>select to_char(sysdate,'day') from dual;

轉換類型函數

to_char(date,'format')

日期類型轉換成字符串格式(主要用於將日期以習慣的格式輸出顯示)

SQL>select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;

to_char()

特別說明: 日期格式:

yy:兩位數字的年份 2004--04

yyyy:四位數字的年份 2004 年

mm:兩位數字的月份 8 月--08

dd:兩位數字的天數 30 號--30

hh24:二十四小時制 8 點--20

hh12:十二小時制 8 點--08 mi,ss--顯示分鍾\秒

day 顯示星期幾

month 顯示幾月

year 顯示年

數字格式:

9:顯示數字,並忽略前面 0

0:顯示數字,如位數不足,則用 0 補齊

.:在指定位置顯示小數點

,:在指定位置顯示逗號

$:在數字前加美元符號

L:在數字前加本地貨幣符號

C:在數字前加國際貨幣符號

G:在指定位置顯示組分隔符  D:在指定位置顯示小數點符號(.)

說明:,逗號.和小數點可以合在一起使用,G 分隔符和 D 小數點符可以合在一起使用,但,.不能和 GD

綜合使用,否則報錯。

to_date(string,'format')

將字符串轉換成日期(主要用於將日期按習慣的格式輸入到 oracle 數據庫中)

to_number

將給出的數字類型的字符轉換為數字;

系統函數

decode 函數類似於 java 的 switch case 分支語句

decode (value, if1, then1, if2,then2, if3,then3, . . . else )

DECODE(VALUE,‘0’,‘1’,‘2’)
若value為0,則為1,否則為2

表之間的連接

自連接

指在同一張表的連接查詢(把一張表看作兩張表)

顯示員工的上級領導的姓名

SQL>select e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;

內連接(inner join - on)

內連接基本語法:

select 列名 1,.. from 表 1 inner join 表 2 on 條件;

說明:內連接只有兩張表同時滿足條件才會被查詢到。

顯示員工的信息和部門名稱

SQL>select e.*,d.dname from emp e,dept d where e.deptno=d.deptno;

等價於

SQL>select e.*,d.dname from emp e inner join dept d  on e.deptno=d.deptno;

左外連接 (left join - on)

如果左側的表完全顯示我們就說是左外連接

基本語法:

select 列名 1,列名 2,.. from 表 1 left join 表 2 on 條件;

select 列名 1,列名 2,.. from 表 1,表 2 where 條件 1=條件 2(+);

右外連接 (right join - on)   

如果右側的表完全顯示我們就說是右外連接                             

基本語法:

select 列名 1,列名 2,.. from 表 1 right join 表 2 on 條件;

select 列名 1,列名 2,.. from 表 1,表 2 where 條件 1(+)=條件 2;

完全外連 (full outer join - on)

完全顯示兩個表,沒有匹配的記錄置為空

基本語法:

select 列名 1,列 2,.. from 表 1 full outer join 表 2 on 條件;

分頁查詢

select t2.*  from ( select t1.*, rownum rn from (select *  from 表名) t1

where rownum<=大范圍(取到多少條數據)) t2 where rn>=小范圍(從第幾條數據開始取);

特別說明:

oracle 分頁查詢是通過三層篩選法進行查詢的。每一次都可以帶 where 條件來對要查詢的信息進行篩選。

第一層:構建我們所要查詢字段信息並排序;

第二層:構建 rownum 別名 rn

第三層:加 where 條件,rn>=M and rn <=N

oracle視圖

創建視圖基本語法:

create view 視圖名 as select 語句 [with read only]

特別說明:with read only 如果帶上的話,只能查詢,不能改寫。

創建或修改視圖基本語法:

create or replace view 視圖名 as select 語句 [with read only]

特別說明:with read only 如果帶上的話,只能查詢,不能改寫。

刪除視圖基本語法:

drop view 視圖名;

 

 

志在分享一些學經驗和技巧,如有志同道合的朋友可以添加個人微信,絕不推廣任何廣告,純屬個人交易,廣告請勿擾

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM