1.簡介 1.1.sql:Structured Query Language 結構化查詢語言 1.2.windows在目錄路徑中使用反斜線\,unix和linux使用正斜線/ 1.3.Number(a,b) a為總有效位數,b為最多小數位數 1.4.Insert into 表名(需指定主鍵及要求非空 ...
1.簡介
1.1.sql:Structured Query Language 結構化查詢語言
1.2.windows在目錄路徑中使用反斜線\,unix和linux使用正斜線/
1.3.Number(a,b) a為總有效位數,b為最多小數位數
1.4.Insert into 表名(需指定主鍵及要求非空的欄位,允許為空的欄位如果不給值預設插入null)......
1.5.Binary_float和Binary_double是對number類型的補充,適合涉及大量數字運算的系統
1.6.oracle大小寫不敏感,列名和表名都可以大小寫替換
2.從資料庫表中檢索信息
2.1.rowid又被稱為偽列,記錄了該行在oracle中的物理位置(eg:AAASUiAAFAAAAHsAAA)
2.2.date格式日期可以直接相互加減,單位為天
2.3.字元串間通過||合併列
2.4.null和空字元串是兩個不同的概念,select的時候都顯示空的值,可通過nvl()函數加以區分,null會被替換,空字元串不會被替換
2.5.between a and b 包含邊界
2.6.連接本身包含
內連接(兩者公共的部分,inner join..on)
外連接(左連接,右連接,全外連接)(left join,right join,(+))
Eg: select...from a,b where a.id(+)=b.id 則以b表為主表
自連接(eg:員工信息和老闆信息在一個表
select w.name||'works for'||m.name from employees w,employees m where w.manager_id(+)=m.employee_id )
3.使用簡單函數
3.1.count()函數避免使用*,增加了運算量,應該使用某一列
3.2.select後面的欄位(除聚合函數)group by後面必須都有,反過來,group by後面的欄位select後面卻並不要求一定有
3.3.分組依據的所有欄位值完全相同時才視為相同然後合併為一行
3.4.欄位值為null的也會被分成一組
3.5.聚合函數包括avg,count,max,median,min,stddev,sum,variance(聚合函數會忽略null值)
3.6.
a.如果查詢中包含聚合函數,而所選擇的列並不在聚合函數中,那麼這些列必須在group by子句中,錯誤事例如下:
eg: select a,avg(b) from table
後面應該加group by a
b.不能在where子句中使用聚合函數來限制行,因為where子句只能用來對單行而不是分組過濾,過濾分組行要用having,使用having的前提是必須有group by
Eg:select a,avg(b) from table where avg(b)>20 group by a
4.日期和時間的存儲與處理
5.使用sqlplus
6.子查詢
6.1.錯誤事例:
Eg:select a,b from table where a=(select a from products where b like ‘%e%’)
= 只能處理一行
6.2.子查詢不能包含order by
6.3.多行子查詢可以使用IN,ANY,ALL操作符
6.4.可以使用多列子查詢
Select a,b,c,d from table where (a,b) in (select a,min(b) from table group by a)
6.5.關聯子查詢,內部查詢可以調用外部表簡稱(檢索價格高於同類產品平均價格的產品)
Eg:select product_id,product_type_id,name,price from products outer
Where price>
(select avg(price) from products inner where inner.product_type_id=outer.product_type_id)
外部查詢從表中檢索出所有的行,並將其傳遞給內部查詢,內部查詢依次讀取每一行數據
6.6.使用exits時可以返回一個常量值,提高查詢的性能
Eg:select employee_id,last_name from employees outer where exits(select 1 from employees inner where inner.manager_id=outer.employee_id)
檢索負責管理其它員工的員工記錄(關聯子查詢)
6.7.select 1 from table where id=...
無值:列名為1,行數為空
有值:返回一列,列名為1,列值也為1,行數為返回的行數
6.8.一般exits的性能比in性能高,為了避免空值影響,最好使用nvl函數
6.9.表連接的查詢性能高於嵌套查詢,嵌套最多255
6.10.單行子查詢
多行子查詢
多列子查詢
關聯子查詢
嵌套子查詢
7.高級查詢
7.1.UNION操作符返回查詢檢索出的所有非重覆行,要求表的列數和類型要一樣,列名可以不一樣,UNION ALL操作符才返回所有行,包括重覆行
8.修改表內容
8.1.事務:一組不可分割的SQL語句,一個邏輯工作單元
8.2.原子性,一致性,隔離性,持久性
8.3.併發事務間相互獨立,除非有事務提交了才可能有影響
8.4.事務鎖:讀程式不會阻塞讀程式,寫程式不會阻塞讀程式,只有在試圖對相同的行進行修改時,寫程式才會阻塞寫程式
9.資料庫安全性
10.創建表,序列,索引,視圖
10.1添加列
Alter table 表名 add 列名 類型
10.2.truncate,delete
11.PL/SQL編程簡介
11.1.聲明變數可通過
X 表名.列名%TYPE
11.2.迴圈中經常使用exit when.....
Eg:exit when 游標名%notfound
11.3.oracle有很多內置的異常,異常發生時,控制權交給EXCEPTION模塊
12.資料庫對象
13.集合
14.大對象(LOB)
14.1.CLOB 字元數據
NCLOB 多位元組字元數據(常用於非英語字元)
BLOB 二進位數據
BFILE 文件指針,文件位於資料庫之外
15.使用JAVA運行SQL
15.1.JDBC(Java Database Connectivity)
API(Application Programming Interface)應用編程介面
15.2.JDBC驅動程式有4種
Thin驅動程式
OCI驅動程式
伺服器端內部驅動程式
伺服器端Thin驅動程式
16.SQL優化
16.1.表連接查詢時,將行較少的表連接到後面
16.2.為表起別名,查詢欄位利用別名去調可以減少執行時間
16.3.當單個查詢檢索的行數不大於表總行數的10%,建立索引是有用的,且索引的候選列應該用於存儲範圍廣泛的值,比如主鍵列
17.select * from nls_database_parameters where parameter='NLS_CHARACTERSET';
select userenv('language') from dual;
18.資料庫用戶具有的角色許可權在存儲過程中失效,即使這個用戶名有dba的角色也沒用,必須手動賦予
比如:grant create any table to 用戶名
sqlplus管理員連接:
sqlplus 用戶名/密碼@ip:port/實例 as sysdba
或者先sqlplus /nolog
然後 conn 用戶名/密碼@ip:port/實例 as sysdb
sys dba system sysoper
sqlplus執行sql: @sql路徑名
角色授予:grant
dba to
用戶名
;
18.oracle創建主鍵時會預設給主鍵欄位加上唯一索引,便於檢索, 在同一個namespace的oracle對象名字不能相同
19.查看用戶具有LOB對象的時哪些表,哪些欄位(dba),lob是由創建表中含有blob,clob造成的
select owner,TABLE_NAME,column_name,DATA_TYPE from dba_TAB_COLUMNS where data_type like '%LOB%' and owner='SCOTT';