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 視圖名;
志在分享一些學經驗和技巧,如有志同道合的朋友可以添加個人微信,絕不推廣任何廣告,純屬個人交易,廣告請勿擾