轉:https://blog.csdn.net/qq_36537094/article/details/79619141
一、.DDL語言(data definition language)數據定義語言
1.建表 create table
2.操作表 alter table
a.添加字段:alter table 表名 add 要添加的字段名;
b.刪除字段:alter table 表名 drop column 要刪除的字段名;
c.修改字段:alter table 表名 rename 原字段名 to 新字段名;
d.修改字段類型:alter table 表名 modify 字段名 字段類型;
3.刪除表 drop table
二、DML語言(Data Manipulation Language)
1.新增記錄:insert into 表名(字段名...) values(信息...);
2.修改記錄:update 表名 set 要修改的字段記錄 where 判斷條件;
3.刪除記錄:delete from 表名 where 判斷條件;
4.查詢記錄:select 查詢的字段 from 表名 where 判斷條件;
三、約束
約束:保證數據庫中數據的安全性
1.主鍵約束(唯一性、非空性):primary key
語法:alter table 表名 add constraint 約束名 primary key(約束的字段名)
2.唯一約束(唯一性,可以為空):unique
語法:alter table 表名 add constraint 約束名 unique(約束的字段名)
3.檢查約束:check
語法:alter table 表名 add constraint 約束名 check(約束的字段名)
4.外鍵約束:foreign key
語法:alter table 表名 add constraint 約束名 foreign key(約束的字段名) references 主表 名(關聯的字段名) 【on delete cascade(刪除主表時,從表也刪除)/on delete null(刪除主表時,從表的關聯設為空)】
四、查詢
1.單表查詢
語法:select [distinct] 字段名 from 表名 where 條件 order by 排序字段 [asc/desc]
a. 去除重復行:distinct
b. 模糊查詢:like '%*%'(包含*的)、like '*%'(以*開頭的)、like '%*'(以*結尾的)
c.除此之外的:not
d.排序(必須在sql最后):order by 排序依據 【 desc:降序/asc:升序(默認)】
2.分組查詢
語法:select 分組的字段 ,查詢的字段 from 表名 group by 分組的字段 having 查詢條件
分組函數:
a.函數:count(統計函數)、max(最大值)、min(最小值)、avg(平均值)、sum(求和)
數字函數:dual
a. abs(絕對值)、sqrt(求平方根)、power(求冪)、round(四舍五入)
字符函數:dual
a.連接兩個字符串:concat(字符1,字符2)
b.替換字符串:replace(字符串,被替換的字符,替換的字符)
c.截取字符串:substr(字符串,從第幾個開始,截取幾個)
d.轉大寫 upper(被轉的字符串)
e.轉小寫 lower(被轉的字符串)
轉換函數:dual
a.將字符轉串換為日期 to_date(字符串,日期格式)
b.將日期轉換為cahr數據類型
to_char(日期,'yyyy')得到日期的年份、 to_char(日期,'mm')得到日期的月份
to_char(日期,'dd')得到日期的日(幾號)、 to_char(日期,'day')得到日期的星期
日期函數:dual
a.返回在日期基礎上再加3個月后新的日期 select sysdate,add_months(sysdate,3) hz from dual;
b.返.回日期所在月份最后一天的日期 select sysdate,last_day(sysdate) hz from dual;
c.截取日期的指定部分 select extract (year/month/day from date '2001-2-16' ) from dual;
3.內聯查詢:將一個查出來的結果當做條件來查詢
4.多表關聯查詢
連接運算:連接運算是由一個笛卡爾積運算和一個選取運算構成的。首先用笛卡爾積完成對兩個數據集合的乘運算,然后對生成的結果集合進行選取運算,確保只把分別來自兩個數據集合並且具有重疊部分(符合選取運算)的行合並在一起
select 查詢的字段 from 表1 left/right/inner join 表2 on 條件
a. left[outer] join(左連接) :返回包括左表(集合)中的所有記錄和右表(集合)中聯結字段相等的記錄
b. right[outer] join(右連接) :返回包括右表中的所有記錄和左表中聯結字段相等的記錄
c. inner join(等值連接) :只返回兩個表中聯結字段相等的行
五、視圖
1.視圖是一種數據庫對象,是從一個或者多個數據表或視圖中導出的虛表,視圖所對應的數據並不真正地存儲在視圖中, 而是存儲在所引用的數據表中,視圖的結構和數據是對數據表進行查詢的結果。
2.作用:
a.簡化數據操作:視圖可以簡化用戶處理數據的方式
b.着重於特定數據:不必要的數據或敏感數據可以不出現在視圖中。
c.視圖提供了一個簡單而有效的安全機制,可以定制不同用戶對數據的訪問權限。
d.提供向后兼容性:視圖使用戶能夠在表的架構更改時為表創建向后兼容接口。
e.自定義數據:視圖允許用戶以不同方式查看數據。
f.導出和導入數據:可使用視圖將數據導出到其他應用程序。
3.語法:
創建: create 【or replace】 view 視圖名(視圖字段名) as 結果集 【 with read only】
or replace :若所創建的試圖已經存在,ORACLE自動重建該視圖;
force :不管基表是否存在,ORACLE都會自動創建該視圖;
noforce :只有基表都存在,ORACLE才會創建該視圖;
with read only :該視圖上不能進行任何DML操作;
with check option :插入或者修改的數據必須滿足視圖定義的約束
刪除: drop view 視圖名;
刪除視圖不影響基表中的數據。
六、索引
1.類似書的目錄結構,索引直接指向包含所查詢值的行的位置,減少磁盤I/O,與所索引的表是相互獨立的物理結構,Oracle 自動使用並維護索引,插入、刪除、更新表后,自動更新索引。
2.作用:提高數據庫查詢語句的速度
3.類型:
a.唯一索引:當某列的值都不相同時(當建立主鍵約束或唯一約束時會自動建立唯一索引)
語法:create unique index 索引名 on 表名(表字段)
b.組合索引:當兩個或多個列一起出現在where條件中時,則在這些列中同時創建組合索引
語法:create unique index 索引名 on 表名(表字段)
c.反向索引:
語法:create unique index 索引名 on 表名(表字段) reverse
d.位圖索引:列中有非常多的重復的值時候。例如某列保存了 “性別”信息。Where 條件中包含了 很多OR操作符。較少的update操作,因為要相應的跟新所有的bitmap
語法:create bitmap index 索引名 on 表名(字段名)
結構:位圖索引使用位圖作為鍵值,對於表中的每一數據行位圖包含了TRUE(1)、FALSE(0)、或NULL值。
優點:位圖以一種壓縮格式存放,因此占用的磁盤空間比標准索引要小得多
e.基於函數索引:在WHERE條件語句中包含函數或者表達式時
語法:create index 索引名 on 表名(function(字段名))
七、PLSQL
1.PSQL:過程化編程語言,用來編寫包含SQL語句的程序。可以向數據庫應用程序中加入業務邏輯處理功能。PL/SQL程序由塊結構組成,每一個塊都包含有PL/SQL和SQL語句。
2.作用:將一些數據的處理過程放在數據庫中,避免因網絡阻塞造成時間的消耗
只能使用DML語言,要用DDL語言必須以動態方式使用。
3.基本語法:
declare 聲明部分
begin 執行語句部分
exception 處理異常部分
end; 結束
變量的幾種賦值方式:
a. 變量名 變量類型 := 值
b. select into (select 字段 into 變量 from 表名 字段 where 條件)
c. 變量名 用戶名.表名.字段名%type (變量類型為表中列的類型)
d.變量名 用戶名.表名%rowtype (變量類型為表的類型)
判斷語法:
a. if 條件 then 執行語句
elsif 條件 then 執行語句
...
else 執行語句
end if;
b. case
when 表達式1 then 執行語句
...
else 執行語句
end case
循環語法:
a. loop
執行語句
if 條件 then 執行語句
exit (條件滿足,跳出循環)
end if
end loop;
b. loop
執行語句
exit when 條件 (條件滿足退出循環)
end loop;
c. while 條件 loop
執行語句
end loop;
d. for 計數器 in 下限..上限 loop
執行語句
end loop;
e. for 計數器 in reverse 上限..下限 loop
執行語句
end loop;
4.異常:exception
raise 異常名 (跳到異常代碼塊)
自定義錯誤代碼:
pragma exception_init(異常名,異常代碼)
raise_application_error(異常代碼,提示信息)
自定義錯誤代碼范圍(-20000,-20999)
5.游標:cursor
a.由於數據庫中不予許出現數組、集合,所以出現了游標
b.游標分類:
靜態游標:顯式游標、隱式游標
動態游標
c.顯式游標:
①定義游標 cursor name is select * from emp
【可以帶參數: cursor name(變量 類型)
is select * from emp where 字段名 = 變量
打開時:open name(變量)】
定義一個變量 c_emp
②打開游標 open name
③循環游標
loop
fetch name into c_emp
exit when name%notfound【當游標循環到最后一條記錄時 跳出循環】
執行語句
end loop
if name%isopen then 【判斷游標是否打開,如果打開,關閉游標】
close name
end if
d.隱式游標:當使用(update,insert,delete)這些DML語言時,我們需要知道到底出現了
什么情況,(是找到了記錄並修改成功,還是沒有找到記錄)【SQL是所有隱式游標的統一名字】
e.動態游標:
① type ref_cur is ref cursor 【定義一個名為ref_cur 的動態游標類型】
② c_emp ref_cur 【定義一個動態游標類型的變量】
③打開動態游標:
open var_cur for 'select * from t_emp where deptno = :v_deptno_var' using v_deptno
【:v_deptno_var 設置參數; -- 通過using 替換參數】
八、存儲過程、函數、包
1.函數 創將語法:
create 【or replace】 procedure 過程名 (參數1 方式 數據類型,...) is/as 過程體
2.方式: in(輸入)、out(輸出)、in out(輸入輸出)
3.游標類型:sys_refcursor
4.函數:create 【or replace】function 函數名 (參數 類型...)return 類型 is/as 過程體
5.包:create【or replace】package 包名 is/as 包內部(變量名/函數名/存儲過程名)
create【or replace】package body 包名 is/as 實現包內部(變量/函數/存儲過程)
九、序列、觸發器
1.序列:就是按照一定的規則,不斷增長(減少)的一個數字,用於我們數據庫里數據的唯一標識。
2.語法:create sequence *** ----創建一個名為***的序列號
increment by 1 -----規定序列每次遞增多少
start with 1 -----規定序列從多少開始
maxvalue 200 -----規定序列最大值
nocycle/cycle -----規定當序列到達最大值時,是繼續循環還是不循環
cache 10 -----規定數據庫每次緩存多少個序列號
取序列:select 序列名.nextval from sys.dual;
修改序列:alter sequence 序列名
[increment by n] --修改序列值的增量
[maxvalue n / nomaxvalue] --設置或撤銷序列的最大值或者最小值
[minvalue n / nominvalue];
3.觸發器:就是相當於js里的監聽器,用來監視數據庫的各種操作,當某個操作時引發觸發器的回應,做相對應的其他數據庫操作。不能被外界調用。
4.觸發器的類型:
a.DML觸發器:當進行DML操作時,就可以創建一個觸發器來響應
b.替代觸發器:為了操作視圖
c.系統觸發器:對於系統時間進行觸發,比如打開或者關閉數據庫。
5.語法:創建一個觸發器(規定在執行哪個動作之前或之后要做什么事)
create or replace trigger *** ----創建一個名為***的觸發器
before/after ----在動作之前/動作之后
insert/update/delete ----哪個動作或那幾個動作
on 表名 ----在哪個表上
declare ----做什么事
begin
end;
十、用戶管理(DCL)
1.解鎖: conn / as sysdba --用sys登錄
alter user 用戶名 account unlock --給用戶解鎖
鎖定:alter user 用戶名 account lock
2.創建用戶:create user 用戶名 identified by 密碼
修改用戶密碼:alter user 用戶名 identified by 密碼
3.刪除用戶:drop user 用戶名
drop user 用戶名 cascade 刪除用戶和用戶創建的對象
4.常用角色:connect【修改會話的權限】
resource【創建table、view、procedure、trigger的·權限】
dba【擁有所有的系統權限,包括配置表空間,賦給其他用戶權限】
5.權限:
a. 系統權限
賦予:grant create session to 用戶名 [with admin option(權限可傳遞)]
撤回:revoke create session from 用戶名
查看當前用戶: select * from session_privs
b. 對象權限
賦予:grant 權限 on 對象 to 用戶名 [with grant option(權限可傳遞)]
撤回:revoke 權限 on 對象 from 用戶名
查看當前用戶:select * from user_tab_privs
6.角色:
a. 常用的系統角色:
connect角色:該角色具有創建會話,修改會話等權限
resource角色: 具有創建表格(create table),創建視圖(create view),創建存儲(create procedure) 等 權限
dba角色:擁有所有的系統權限,包括無限制的空間選額和給其他用戶授予各種權限的能力。用戶SYSTEM 擁有DBA角色。
b. 賦予角色給某一個用戶:grant 角色名... to 用戶名
撤銷用戶的某個角色:revoke 角色名 from 用戶名
查詢當前用戶擁有的角色:select * from user_role_privs
查詢當前用戶的角色的權限信息:select * from role_sys_privs
c. 創建自定義角色:create role 角色名
刪除角色: drop role 角色名
賦予權限給角色:grant 權限名 to 角色名
撤銷角色的權限:revoke 權限名 from 角色名
查看某個角色的具體權限: select * from dba_sys_privs where grantee =角色名; --注意: 當前登錄用需要dba角色的權限才能查看
7. 表空間是數據庫最大的邏輯單元,一個Oracle數據庫至少包含一個表空間,就是名為SYSTEM的系統表空間。每個表空間是由一個或多個數據文件組成的,一個數據文件只能與一個表空間相關聯。在oracle中所有的表都存儲在表空間中。
a. 創建user1_tablespace表空間--------- 注意:創建表空間需要對應的(create tablespace)權限
CREATE TABLESPACE user1_tablespace --表空間名稱
DATAFILE 'E:\user1.DBF' ----路徑名稱
SIZE 100M ----是指定該數據文件的大小,也就是表空間的大小。
AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED ----大小自動擴展,沒有最大限制
LOGGING ----logging 表示在創建表空間時,將生成日志記錄
EXTENT MANAGEMENT LOCAL ----表示創建的表空間采用"本地化"方式管理
SEGMENT SPACE MANAGEMENT AUTO; ----設置表空間中段的管理方式為自動;
b. 創建了表空間怎么樣 (分配給用戶) 如果創建用戶沒有設置默認表空間,則默認為USERS表空間
CREATE USER 用戶名
IDENTIFIED BY 密碼
DEFAULT TABLESPACE user1_tablespace
c. 查看用戶對應的默認表空間
SELECT USERNAME, DEFAULT_TABLESPACE FROM DBA_USERS where USERNAME='user1';
d. 修改用戶的默認表空間
alter user 用戶名 default tablespace user1_tablespace;
e. 查看表空間的名稱及大小
SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) "ts_size(M)"
FROM dba_tablespaces t, dba_data_files d
WHERE t.tablespace_name = d.tablespace_name
GROUP BY t.tablespace_name;
f. 查看表空間物理文件的名稱及大小
SELECT tablespace_name,
file_id,
file_name,
round(bytes / (1024 * 1024), 0) total_space
FROM dba_data_files
ORDER BY tablespace_name;
g. 查看表空間的使用情況
SELECT SUM(bytes) / (1024 * 1024) as "free_space(M)", tablespace_name
FROM dba_free_space
GROUP BY tablespace_name;
h. 增加數據文件
ALTER TABLESPACE user1_tablespace
ADD DATAFILE 'E:\user1_add.DBF' --添加數據文件
SIZE 100M --大小100M
AUTOEXTEND ON -- 大小自動擴展
NEXT 10M --擴展的增量為10M
MAXSIZE 1024M; --最大擴展到1024M
i. 修改數據文件的大小
ALTER DATABASE DATAFILE 'E:\user1_add.DBF' -- 文件路徑
RESIZE 50M;
j. 刪除數據文件
ALTER TABLESPACE user1_tablespace
DROP DATAFILE 'E:\user1_add.DBF'
k. 刪除表空間
刪除user 只是刪除了該user下的schema objects,是不會刪除相應的tablespace的
drop user ×× cascade
刪除tablespace
DROP TABLESPACE tablespace_xxx INCLUDING CONTENTS AND DATAFILES;