oracle&sql

該文章來源於網頁整理.web

 

1.
1)oracle數據庫的權限系統分爲系統權限與對象權限。系統權限( database system privilege )可讓用戶執行特定的命令集。例如,create table權限容許用戶建立表,grant any privilege 權限容許用戶授予任何系統權限。對象權限( database object privilege )可讓用戶可以對各個對象進行某些操做。
 每一個oracle用戶都有一個名字和口令,並擁有一些由其建立的表、視圖和其餘資源。oracle角色(role)就是一組權限(privilege)(或者是每一個用戶根據其狀態和條件所需的訪問類型)。用戶能夠給角色授予或賦予指定的權限,而後將角色賦給相應的用戶
2)建立用戶
create user user01 identified by u01;  sql

 alter user user01 identified by aa;改變口令
3)3種標準角色(role):connect、resource和dba數據庫

grant connect, resource to user01;受權
revoke connect, resource from user01;撤銷權限服務器

4)除了前面講到的三種系統角色----connect、resource和dba,用戶還能夠在oracle建立本身的role。用戶建立的role能夠由表或系統權限或二者的組合構成。爲了建立role,用戶必須具備create role系統權限。
 create role student;
grant select on class to student; class表
5)由於用drop table,delete * from 表名時,tablespace表空間該表的佔用空間並未釋放,反覆幾回drop,delete操做後,該tablespace上百兆的空間就被耗光了。 網絡

2.
加入一個nologging選項
/* +append */session


通常狀況下,只要增長這個重作日誌文件的容量,就能夠爲大批量的更新、刪除等操做提供比較大的重作日誌空間。此時執行一個大批量的更新操做時,可能只須要使用一個重作日誌文件便可。此時,在重作日誌上所花的時間,就是隻有產生重作記錄的那部分時間,而沒有重作日誌切換歸檔時的等待時間。因此,通過相似的調整以後,每每能夠在很大程度上提升數據庫的性能。數據結構


3.oracle提供了100多種系統權限。 
經常使用的有: 
create session   鏈接數據庫         create table            建表 
create view      建視圖             create public synonym   建同義詞 
create procedure 建過程、函數、包   create trigger          建觸發器 
create cluster 建簇併發

顯示全部系統權限。 
select * from system_privilege_map order by nameoracle


通常狀況,授予系統權限是由dba完成的,若是用其餘用戶來授予系統權限,則要求該用戶必須具備grant any privilege的系統權限。在授予系統權限時,能夠帶有with admin option選項,這樣,被授予權限的用戶或是角色還能夠將該系統權限授予其它的用戶或是角色。app

eg.create user ken identfied by ken; 
 給用戶ken受權 
1). grant create session, create table to ken with admin option; 
2). grant create view to ken; 

4.在sql*plus中修改當前會話的日期格式

  SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

5.


數據庫與數據結構

總類別
  類別1
    類別1.1
      類別1.1.1
    類別1.2
  類別2
    類別2.1
  類別3
    類別3.1
    類別3.2
  ……

type_id      type_name          type_father          type_layer
1             總類別               0                 000000
2             類別1                1                 010000
3             類別1.1              2                 010100
4             類別1.2              2                 010200


 去掉商品信息表(Wares_info)中的haspic字段,添加商品額外屬性表(Wares_ex_property)和商品額外信息表(Wares_ex_info)2個表來完成添加新屬性的功能。

 這樣的設計好嗎?咱們來看看爲了列出某個用戶某次借閱的全部書籍,須要如何查詢?


冗餘數據的本質就是用空間換時間,尤爲是目前硬件的發展遠遠高於軟件,因此適當的冗餘是能夠接受的。不過我仍是在最後再強調一下:不要過多的依賴平臺和開發工具的特性來簡化開發,這個度要是沒把握好的話,後期維護升級會栽大跟頭的。


6.
查詢的邏輯執行順序

 (1) FROM < left_table> 

 (3) < join_type>  JOIN < right_table>   (2) ON < join_condition> 

 (4) WHERE < where_condition> 

 (5) GROUP BY < group_by_list> 

 (6) WITH {cube | rollup}

 (7) HAVING < having_condition> 

 (8) SELECT  (9) DISTINCT (11) < top_specification>  < select_list> 

 (10) ORDER BY < order_by_list> 

 1.FROM:對FROM子句中前兩個表執行笛卡爾積生成虛擬表vt1

 2.ON:對vt1表應用ON篩選器只有知足< join_condition> 爲真的行才被插入vt2

 3.OUTER(join):若是指定了 OUTER JOIN保留表(preserved table)中未找到的行將行做爲外部行添加到vt2 生成t3若是from包含兩個以上表則對上一個聯結生成的結果表和下一個表重複執行步驟和步驟直接結束

 4.WHERE:對vt3應用 WHERE 篩選器只有使< where_condition> 爲true的行才被插入vt4

5.GROUP BY:按GROUP BY子句中的列列表對vt4中的行分組生成vt5

 6.CUBE|ROLLUP:把超組(supergroups)插入vt6 生成vt6

 7.HAVING:對vt6應用HAVING篩選器只有使< having_condition> 爲true的組才插入vt7

8.SELECT:處理select列表產生vt8

 9.DISTINCT:將重複的行從vt8中去除產生vt9

 10.ORDER BY:將vt9的行按order by子句中的列列表排序生成一個遊標vc10

 11.TOP:從vc10的開始處選擇指定數量或比例的行生成vt11 並返回調用者

 

---
7.
標準的SQL 的解析順序爲:

 (1).FROM 子句 組裝來自不一樣數據源的數據

 (2).WHERE 子句 基於指定的條件對記錄進行篩選

 (3).GROUP BY 子句 將數據劃分爲多個分組

(4).使用聚合函數進行計算

 (5).使用HAVING子句篩選分組

 (6).計算全部的表達式

 (7).使用ORDER BY對結果集進行排序

數據庫是能進行集合運算的工具,咱們應該儘可能的利用這個工具,所謂集合運算實際就是批量運算,就是儘可能減小在客戶端進行大數據量的循環操做,而用SQL語句或者存儲過程代替。


 

8.
 返回數據到客戶端至少須要數據庫提取數據、網絡傳輸數據、客戶端接收數據以及客戶端處理數據等環節,若是返回不須要的數據,就會增長服務器、網絡和客戶端的無效勞動,其害處是顯而易見的.
A、橫向來看,

  (1)不要寫SELECT *的語句,而是選擇你須要的字段。

  (2)當在SQL語句中鏈接多個表時, 請使用表的別名並把別名前綴於每一個Column上.這樣一來,就能夠減小解析的時間並減小那些由Column歧義引發的語法錯誤。

B、縱向來看,  
 (1)合理寫WHERE子句,不要寫沒有WHERE的SQL語句。  
 (2) SELECT TOP N * --沒有WHERE條件的用此替代 

子查詢在執行計劃通常解釋成外鏈接,多餘的鏈接錶帶來額外的開銷。
合併對同一表同一條件的屢次UPDATE

 

9.
注意臨時表和表變量的用法

在複雜系統中,臨時表和表變量很難避免,關於臨時表和表變量的用法,須要注意:

A、若是語句很複雜,鏈接太多,能夠考慮用臨時表和表變量分步完成。

B、若是須要屢次用到一個大表的同一部分數據,考慮用臨時表和表變量暫存這部分數據。

C、若是須要綜合多個表的數據,造成一個結果,能夠考慮用臨時表和表變量分步彙總這多個表的數據。

D、其餘狀況下,應該控制臨時表和表變量的使用。

E、關於臨時表和表變量的選擇,不少說法是表變量在內存,速度快,應該首選表變量,可是在實際使用中發現,

(1)主要考慮須要放在臨時表的數據量,在數據量較多的狀況下,臨時表的速度反而更快。

(2)執行時間段與預計執行時間(多長)

F、關於臨時表產生使用SELECT INTO和CREATE TABLE + INSERT INTO的選擇,通常狀況下,

SELECT INTO會比CREATE TABLE + INSERT INTO的方法快不少,

可是SELECT INTO會鎖定TEMPDB的系統表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用戶併發環境下,容易阻塞其餘進程,

因此個人建議是,在併發系統中,儘可能使用CREATE TABLE + INSERT INTO,而大數據量的單個語句使用中,使用SELECT INTO.


10.
子查詢是一個 SELECT 查詢,它嵌套在 SELECT、INSERT、UPDATE、DELETE 語句或其它子查詢中。
若是子查詢的條件中使用了其外層的表的字段,這種子查詢就叫做相關子查詢。

相關子查詢能夠用IN、NOT IN、EXISTS、NOT EXISTS引入。
1)NOT IN、NOT EXISTS的相關子查詢能夠改用LEFT JOIN代替寫法。
SELECT PUB_NAME FROM PUBLISHERS WHERE PUB_ID NOT IN (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS') 

==》 SELECT A.PUB_NAME FROM PUBLISHERS A LEFT JOIN TITLES B ON B.TYPE = 'BUSINESS' AND A.PUB_ID=B. PUB_ID WHERE B.PUB_ID IS NULL

 

SELECT TITLE FROM TITLES WHERE NOT EXISTS  (SELECT TITLE_ID FROM SALES WHERE TITLE_ID = TITLES.TITLE_ID)==》
SELECT TITLE FROM TITLES LEFT JOIN SALES ON SALES.TITLE_ID = TITLES.TITLE_ID WHERE SALES.TITLE_ID IS NULL

2)若是保證子查詢沒有重複 ,IN、EXISTS的相關子查詢能夠用INNER JOIN 代替
3) IN的相關子查詢用EXISTS代替
SELECT PUB_NAME FROM PUBLISHERS WHERE PUB_ID IN(SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS')
==》
SELECT PUB_NAME FROM PUBLISHERS WHERE EXISTS (SELECT 1 FROM TITLES WHERE TYPE = 'BUSINESS' AND PUB_ID= PUBLISHERS.PUB_ID)

4)不要用COUNT(*)的子查詢判斷是否存在記錄,最好用LEFT JOIN或者EXISTS

SELECT JOB_DESC FROM JOBS WHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)=0

==》
SELECT JOBS.JOB_DESC FROM JOBS LEFT JOIN EMPLOYEE  ON EMPLOYEE.JOB_ID=JOBS.JOB_ID WHERE EMPLOYEE.EMP_ID IS NULL


SELECT JOB_DESC FROM JOBS WHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)<>0
==》
SELECT JOB_DESC FROM JOBS WHERE EXISTS (SELECT 1 FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)


11.1、普通解鎖

alter user username account unlock;

 

2、特別解鎖

1).設置無限期鏈接
打開PL/SQL,並登錄指定的數據庫,執行以下操做:
第一步,查詢資源文件,找到CONNECT_TIME所在的profile名。 
select resource_name,profile from dba_profiles; 
第二步,用alter命令修改profile中的值; 
alter profile MONITORING_PROFILE limit connect_time unlimited;
alter profile MONITORING_PROFILE limit idle_time unlimited; 
第三步,用以下命令查看profile中的值; 
select resource_name,limit from dba_profiles where profile='MONITORING_PROFILE';

2).解決默認登錄失敗10次用戶被鎖的問題
打開PL/SQL,並登錄指定的數據庫,執行以下操做:
select * from dba_profiles;
alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;

profile中有設置重試密碼錯誤N次後鎖定賬號

相關文章
相關標籤/搜索