Linux_Oracle命令大全



一,啓動java

 

1.#su - oracle              切換到oracle用戶且切換到它的環境node

 

2.$lsnrctl status           查看監聽及數據庫狀態mysql

 

3.$lsnrctl start            啓動監聽面試

 

4.$sqlplus / as sysdba       DBA身份進入sqlplussql

 

5.SQL>startup                啓動db數據庫

 

二,中止windows

 

1.#su - oracle              切換到oracle用戶且切換到它的環境緩存

 

2.$lsnrctl stop             中止監聽服務器

 

3.$sqlplus / as sysdba      DBA身份進入sqlplus網絡

 

4.SQL>SHUTDOWN IMMEDIATE    關閉db

 

 

 

其中startupshutdowm還有其餘一些可選參數,有興趣能夠另行查閱

 

 

 

三,查看初始化參數及修改

 

1.#su - oracle                切換到oracle用戶且切換到它的環境

 

2.$sqlplus / as sysdba        DBA身份進入sqlplus

 

3.SQL>show parameter session;  查看所接受的session數量

######################################################

Oracle processsession20081229 星期一 15:47

 

Connected to Oracle Database 10g Release10.1.0.5.0

Connected as ifsapp

 

SQL> show parameter session

 

NAME                               TYPE      VALUE

----------------------------------------------- ------------------------------

java_max_sessionspace_size         integer   0

java_soft_sessionspace_limit       integer  0

license_max_sessions               integer   0

license_sessions_warning           integer   0

logmnr_max_persistent_sessions     integer  1

session_cached_cursors             integer   0

session_max_open_files             integer   10

sessions                           integer   225

shared_server_sessions             integer  

 

SQL> show parameters processes;

 

NAME                               TYPE      VALUE

----------------------------------------------- ------------------------------

aq_tm_processes                    integer   0

db_writer_processes                integer   1

gcs_server_processes               integer   0

job_queue_processes                integer   3

log_archive_max_processes          integer   2

processes                          integer   200

 

SQL> alter system set processes=600scope=both;

SQL>

 

SQL> alter system set processes=600scope=both;

 

alter system set processes=600 scope=both

 

ORA-02095: specified initializationparameter cannot be modified

 

SQL> alter system set sessions=600scope=both;

 

alter system set sessions=600 scope=both

 

ORA-02095: specified initializationparameter cannot be modified

 

SQL>

 

 

SQL> alter system set processes=600scope=spfile;

 

System altered

 

SQL> show parameters processes;

 

NAME                               TYPE      VALUE

----------------------------------------------- ------------------------------

aq_tm_processes                    integer   0

db_writer_processes                integer   1

gcs_server_processes               integer   0

job_queue_processes                integer   3

log_archive_max_processes          integer   2

processes                          integer   200

 

SQL> alter system set processes=600scope=memory;

 

alter system set processes=600 scope=memory

 

ORA-02095: specified initializationparameter cannot be modified

 

 

 

重啓數據庫以後生效:

 

SQL> show parameters processes;

 

NAME                               TYPE      VALUE

----------------------------------------------- ------------------------------

aq_tm_processes                    integer   0

db_writer_processes                integer   1

gcs_server_processes               integer   0

job_queue_processes                integer   3

log_archive_max_processes          integer   2

processes                          integer   600

 

SQL> show parameter session

 

NAME                               TYPE      VALUE

----------------------------------------------- ------------------------------

java_max_sessionspace_size         integer   0

java_soft_sessionspace_limit       integer  0

license_max_sessions               integer   0

license_sessions_warning           integer   0

logmnr_max_persistent_sessions     integer  1

session_cached_cursors             integer   0

session_max_open_files             integer   10

sessions                           integer   665

shared_server_sessions             integer    

 

 

修改Oracle process session 的方法

 

先備份spfile

1.經過SQLPlus修改

Oraclesessionsprocesses的關係是

sessions=1.1*processes + 5

使用sys,以sysdba權限登陸:

SQL> show parameter processes;

NAME TYPE VALUE

----------------------------------------------- ---------------------------------------

aq_tm_processes integer 1

db_writer_processes integer 1

job_queue_processes integer 10

log_archive_max_processes integer 1

processes integer 150

SQL> alter system set processes=400scope = spfile;

系統已更改。

SQL> show parameter processes;

NAME TYPE VALUE

----------------------------------------------- -----------------------------------------

aq_tm_processes integer 1

db_writer_processes integer 1

job_queue_processes integer 10

log_archive_max_processes integer 1

processes integer 150

SQL> create pfile from spfile;

文件已建立。

重啓數據庫,OK

【注:sessions是個派生值,processes的值決定,公式sessions=1.1*process + 5

2.經過修改oracle配置文件進行修改

修改SPFILEORCL.ORA文件中的processes的值。8.1.5中是init.ora文件,在9i中修改init.ora文件是無效的,這個文件因爲是一個二進制的文件,不能直接使用notepad此類的編輯器打開。

不然會報錯誤ORA-27101 Shared memory realm does not exist。使用UltraEdit或者EditPlus之類的能夠編輯二進制文件的編輯器打開此文件(直接編輯二進制文件),而後在Windows服務中從新啓動Oracle服務器便可。

3.經過Oracle EnterpriseManager Console在圖形化管理器中修改

a.以系統管理員的身份登入

b.進入數據庫的例程-配置-通常信息-全部初始化參數

c.修改processes的值

d.Sessions的值由公式sessions=1.1*process+ 5派生獲得

 

 

一個process能夠有0個,1個或多個session

 

=============================================

Oracle中系統processsession的關係

 

在實際的應用中,Shared Server中的ProcessOracle數據庫中的Session並非一一對應的,Shared Server中的Process(一個)對應着Oracle中的一個或者一個以上的Session

 

  在dedicated server機器上的測試以下:

 

  數據庫的session和操做系統process是對應的。

 

  這表示一個session對應一個process,可是一個process未必對應一個session

 

  你們能夠經過SELECT spid

 

  FROM v$process

 

  WHERE NOT EXISTS ( SELECT 1

 

  FROM v$session

 

  WHERE paddr = addr); 查看

 

  或

 

  SQL> select count(*) from v$process;

 

  COUNT(*)

 

  ----------

 

  53

 

  SQL> select count(*) from v$session;

 

  COUNT(*)

 

  ----------

 

  50

 

 

oracle10g中只要指定processessessions就會自動計算出,因此不須要指定sessions也可,除非對sessions有特殊要求,要求其比oracle自動計算出的sessions要大,那麼就須要手動指定sessions

 

#########################################################

 

4.SQL>alter system setshared_servers=10;   shared_servers的數量設置爲10

 

 

 

四.數據庫鏈接數目

 

其中一個數據庫鏈接須要一個session,它的值由processes決定,sessionprocesses一般有如下關係:

 

session = 1.1 * processes + 5

 

不過這也不是絕對的,還要受到CPU和內存等硬件條件的限制。另外processessession不能夠經過alter system語句直接修改,只能夠修改服務器參數文件來更改(Server Parameter File)。若是存在一個serverparameter file,經過alter system語句所做的更改將會被持久化到文件中。

 

首先以Oracle用戶登陸

 

1$/oracle/oracle/app/product/101/bin/dbstart:啓動數據庫。

 

2 $/oracle/oracle/app/product/101/bin/dbshut:關閉數據庫。

 

3$/oracle/oracle/app/product/101/bin/dbca:數據庫配置助理,進行數據庫安裝、刪除和修改。

 

4$/oracle/oracle/app/product/101/bin/netca:數據庫網絡服務配置管理。

 

5$/oracle/oracle/app/product/101/bin/netmgr:數據庫網絡服務和監聽配置助理。

 

6$/oracle/oracle/app/product/101/bin/sqlplus:可運行SQL,進行數據庫操做,並可起停數據庫。運行sqlplus命令,輸入sys用戶和口令登錄之後,運行以下命名:

 

shutdown immediate 當即關閉數據庫

 

startup 啓動數據庫

 

7$/oracle/oracle/app/product/101/bin/lsnrctl start:啓動數據庫監聽

 

$/oracle/oracle/app/product/101/bin/lsnrctlstop:關閉數據庫監聽

 

$/oracle/oracle/app/product/101/bin/lsnrctlstatus:察看數據庫監聽運行狀態

 

Oracle數據庫命令速查

 

Oracle數據庫命令速查

 

Oracle數據庫命令速查

 

1.       日誌管理

 

1.1.       強制日誌切換(forcing log switches

 

sql> alter system switch logfile;

 

1.2.       強制執行檢查點(forcing checkpoints

 

sql> alter system checkpoint;

 

1.3.       增長一個重作日誌組(adding online redo log groups

 

sql> alter database add logfile [group4]sql> ('/disk3/log4a.rdo','/disk4/log4b.rdo') size 1m;

 

1.4.       增長一個重作日誌文件(adding online redo log members

 

sql> alter database add logfile member

 

sql> '/disk3/log1b.rdo' to group 1,

 

sql> '/disk4/log2b.rdo' to group 2;

 

1.5.       改變重作日誌文件名(changes the name of the online redo logfile

 

sql> alter database rename file'c:/oracle/oradata/oradb/redo01.log'

 

sql> to 'c:/oracle/oradata/redo01.log';

 

1.6.       刪除重作日誌組(drop online redo log groups

 

sql> alter database drop logfile group3;

 

1.7.       刪除重作日誌文件(drop online redo log members

 

sql> alter database drop logfile member'c:/oracle/oradata/redo01.log';

 

1.8.       清空重作日誌文件(clearing online redo log files

 

sql> alter database clear [unarchived]logfile 'c:/oracle/log2a.rdo';

 

1.9.       使用logminer分析重作日誌文件(using logminer analyzing redo logfiles

 

a. in the init.ora specify utl_file_dir = ''

 

b. sql> executedbms_logmnr_d.build('oradb.ora','c:\oracle\oradb\log');

 

c. sql> executedbms_logmnr_add_logfile('c:\oracle\oradata\oradb\redo01.log',

 

sql> dbms_logmnr.new);

 

d. sql> executedbms_logmnr.add_logfile('c:\oracle\oradata\oradb\redo02.log',

 

sql> dbms_logmnr.addfile);

 

e. sql> executedbms_logmnr.start_logmnr(dictfilename=>'c:\oracle\oradb\log\oradb.ora');

 

f. sql> select * fromv$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters

 

sql> v$logmnr_logs);

 

g. sql> execute dbms_logmnr.end_logmnr;

 

2.       表空間管理

 

2.1.       創造表空間(create tablespaces

 

sql> create tablespace ts_name datafile'c:\oracle\oradata\file1.dbf' size 100m ,

 

sql>'c:\oracle\oradata\file2.dbf' size100m minimum extent 550k [logging/nologging]sql> default storage (initial500k next 500k maxextents 500 pctinccease 0)

 

sql> [online/offline][permanent/temporary] [extent_management_clause]

 

2.2.       建立本地管理的表空間(locally managed tablespace

 

sql> create tablespace user_datadatafile 'c:\oracle\oradata\user_data01.dbf'

 

sql> size 500m extent management localuniform size 10m;

 

2.3.       建立臨時表空間(temporary tablespace

 

sql> create temporary tablespace temptempfile 'c:\oracle\oradata\temp01.dbf'

 

sql> size 500m extent management localuniform size 10m;

 

2.4.       改變表空間的存儲參數(change the storage setting

 

sql> alter tablespace app_data minimumextent 2m;

 

sql> alter tablespace app_data defaultstorage(initial 2m next 2m maxextents 999);

 

2.5.       使表空間離線或連線(taking tablespace offline or online

 

sql> alter tablespace app_data offline;

 

sql> alter tablespace app_data online;

 

2.6.       設置表空間爲只讀/可寫模式(read_only tablespace

 

sql> alter tablespace app_data readonly|write;

 

2.7.       刪除表空間(droping tablespace

 

sql> drop tablespace app_data includingcontents;

 

2.8.       容許數據文件自動擴展(enableing automatic extension of data files

 

sql> alter tablespace app_data adddatafile 'c:\oracle\oradata\app_data01.dbf' size 200m

 

sql> autoextend on next 10m maxsize500m;

 

2.9.       手工改變數據文件的大小(change the size fo data files manually

 

sql> alter database datafile'c:\oracle\oradata\app_data.dbf' resize 200m;

 

2.10.       更名錶空間中的數據文件(Moving data files: alter tablespace

 

sql> alter tablespace app_data renamedatafile 'c:\oracle\oradata\app_data.dbf

 

sql> to 'c:\oracle\app_data.dbf';

 

2.11.       改變數據庫中的數據文件(moving data files:alter database

 

sql> alter database rename file'c:\oracle\oradata\app_data.dbf' to 'c:\oracle\app_data.dbf';

 

3.       

 

3.1.       建立表(create a table

 

sql> create table table_name (columndatatype,column datatype]....)

 

sql> tablespace tablespace_name [pctfreeinteger] [pctused integer]

 

sql> [initrans integer] [maxtransinteger]sql> storage(initial 200k next 200k pctincrease 0 maxextents 50)

 

sql> [logging|nologging] [cache|nocache]

 

3.2.       複製一個已存在的表(copy an existing table

 

sql> create table table_name[logging|nologging] as subquery

 

3.3.       建立一個臨時表(create temporary table

 

sql> create global temporary tablexay_temp as select * from xay;

 

on commit preserve rows/on commit deleterows

 

3.4.       pctfreepctused參數計算公式

 

pctfree = (average row size - initial rowsize) *100 /average row size

 

pctused = 100-pctfree- (average rowsize*100/available data space)

 

這是標準的計算公式。

 

PCTFREE:指定表內每一個數據塊中空間的百分比。PCTFREE 的值必須介於 0 99 之間。若是值爲零,表示能夠經過插入新行來填充整個塊。缺省值爲 10。此值表示每一個塊中保留着 10% 的空間,用於更新現有的行以及插入新行,每一個塊最多可填充到 90%

 

PCTUSED:指定爲表內每一個數據塊維護的已用空間的最小百分比。若是一個塊的已用空間低於 PCTUSED,則可在該塊中插入行。PCTUSED 的值爲介於 0 99 之間的整數,缺省值爲 40 

 

結合 PCTFREE PCTUSED 就能夠肯定將新行插入到現有數據塊中,仍是插入到新塊中。這兩個參數值的和必須小於或等於 100。使用這兩個參數能夠更有效地利用表內的空間。

 

設置 PCTFREE PCTUSED

 

設置 PCTFREE

 

PCTFREE 值越高,可爲數據庫塊內的更新提供的空間就越大。若是表存在下面兩種狀況,則應設置一個更高的值:

 

?       某些列最初爲 NULL,後來更新爲某個值

 

?       某些列因爲更新,大小可能增長

 

PCTFREE 的值越高,塊密度就越低,即每一個塊容納的行數就越少。

 

上面的公式確保塊中有足夠的空閒空間供行增加使用。

 

設置 PCTUSED

 

設置 PCTUSED 以確保只有在具有足夠空間來容納一個平均大小的行時纔將塊返回到空閒列表中。若是空閒列表中的某個塊沒有足夠的空間來插入一行,Oracle 服務器將查找空閒列表中的下一個塊。直到找到具有足夠空間的塊或者到達列表的末尾,這種線性掃描纔會結束。使用給定的公式能夠增長找到具備所需空閒空間的塊的機率,從而縮短掃描空閒列表的時間。

 

注:可使用 ANALYZE TABLE 命令估算平均行大小的值。

 

注:Oracle9i 「自動段空間管理」功能可替代 PCTUSEDFREELISTS FREELIST GROUPS

 

3.5.       改變存儲和塊利用率參數(change storage and block utilization parameter

 

sql> alter table table_name pctfree=30pctused=50 storage(next 500k minextents 2 maxextents 100);

 

3.6.       手工分配區間(extents)(manually allocating extents

 

sql> alter table table_name allocateextent(size 500k datafile 'c:/oracle/data.dbf');

 

3.7.       改變表的所屬表空間(move tablespace

 

sql> alter table employee movetablespace users;

 

3.8.       釋放表中未用空間(deallocate of unused space

 

sql> alter table table_name deallocateunused [keep integer]

 

3.9.       截斷表(truncate)(truncate a table

 

sql> truncate table table_name;

 

截斷一個表將刪除表中全部行,從而釋放已使用的空間。

 

對應的索引將被截斷。

 

(注:truncate table不是DML語句,是DDL語句

 

另外,truncate delete的區別是,delelte不釋放空間,truncate釋放空間。)

 

3.10.       刪除表(drop a table

 

sql> drop table table_name [cascadeconstraints];

 

3.11.       刪除列(drop a column

 

sql> alter table table_name drop columncomments cascade constraints checkpoint 1000;

 

alter table table_name drop columnscontinue;

 

3.12.       標識某一列爲未使用(unused)(mark a column as unused

 

sql> alter table table_name set unusedcolumn comments cascade constraints;

 

alter table table_name drop unused columnscheckpoint 1000;

 

alter table orders drop columns continuecheckpoint 1000

 

data_dictionary : dba_unused_col_tabs

 

除將列從表中刪除之外,還能夠先將列標記爲「未使用」,之後再刪除。由於沒有刪除數據,因此此操做不回收磁盤空間,於是具備速度比較快的優勢。被標爲「未使用」 的列可在之後系統活動較少時從表中刪除。

 

未使用的列就像不屬於表同樣。查詢時看不到未使用列中的數據。此外,在執行 DESCRIBE 命令時,也不會顯示這些列的名稱和數據類型。用戶能夠添加與未使用的列同名的新列。

 

若是想刪除同一表中的兩列,則可先將列設置爲「未使用」 而後再刪除。在刪除兩列時,表中的全部行都會更新兩次;但若是將這些列設置爲「未使用」 而後再刪除,則全部的行僅更新一次。

 

4.       索引

 

4.1.       建立一個基於函數的索引(creating function-based indexes

 

sql> create index summit.item_quantityon summit.item(quantity-quantity_shipped);

 

基於函數的索引(Function-based indexes)

 

若是在表中要創建索引的一列或多列上使用了函數或表達式,則建立的是基於函數的索引。基於函數的索引預先計算函數或表達式的值,並將結果存儲在索引中。能夠將基於函數的索引建立爲 B 樹或位圖索引。

 

4.2.       建立一個B樹索引(create a B-tree index

 

sql> create [unique] index index_name ontable_name(column,.. asc/desc) tablespace

 

sql> tablespace_name [pctfree integer][initrans integer] [maxtrans integer]

 

sql> [logging | nologging] [nosort]storage(initial 200k next 200k pctincrease 0 maxextents 50);

 

B樹:平衡二叉樹,oracle中用的最多的索引模式,適用於取值惟一性高的狀況。只有兩層,非葉級、葉級(指針所在級)

 

4.3.       索引中pctfree參數計算公式

 

pctfree(index)=(maximum number ofrows-initial number of rows)*100/maximum number of rows

 

4.4.       建立一個反向鍵索引(creating reverse key indexes

 

sql> create unique index xay_id onxay(a) reverse pctfree 30 storage(initial 200k next 200k pctincrease 0maxextents 50) tablespace indx;

 

4.5.       建立位圖索引(create bitmap index

 

sql> create bitmap index xay_id onxay(a) pctfree 30 storage( initial 200k next 200k pctincrease 0 maxextents 50)tablespace indx;

 

在下列狀況中,位圖索引比 B 樹索引更有利:

 

?       當表包含數百萬行且鍵列的基數很低(即,該列中重複的值不少)時。例如,對於包含護照記錄的表的性別列和婚姻情況列而言,位圖索引比 B 樹索引更適合

 

?       當查詢常用涉及 OR 運算符的多個 WHERE 條件組合時

 

?       當鍵列上存在只讀或不多的更新操做時

 

(位圖索引適用於取值的惟一性很低的狀況)

 

4.6.       改變索引的存儲參數(change storage parameter of index

 

sql> alter index xay_id storage (next400k maxextents 100);

 

4.7.       爲索引分配空間(allocating index space

 

sql> alter index xay_id allocateextent(size 200k datafile 'c:/oracle/index.dbf');8.alter index xay_iddeallocate unused;

 

手動分配索引空間:

 

在表上進行頻繁的插入操做前,可能須要向索引添加區。添加區可防止索引動態擴展並致使性能下降。

 

(其中指定的數據文件必定是索引所在表空間的數據文件)

 

5.       約束(constraints

 

5.1.       將約束定義爲當即(immediate)或延遲(deferred)define constraints as immediate or deferred

 

sql> alter session set constraint[s] =immediate/deferred/default;

 

set constraint[s] constraint_name/allimmediate/deferred;

 

SET CONSTRAINTS 語句用於將特定事務處理的約束設置爲 DEFERRED IMMEDIATE。可使用此語句設置約束名稱列表或約束的模式。SET CONSTRAINTS 模式將一直持續到事務處理完成或者另外一個 SET CONSTRAINTS 語句重置模式。SET CONSTRAINTS 語句不容許在觸發器內部使用。

 

ALTER SESSION 語句還包含將約束設置爲IMMEDIATE DEFERRED 的子句 SET CONSTRAINTS。此命令缺省爲設置全部 (ALL) 可延遲的約束(不能指定約束名稱列表)。ALTER SESSION SET CONSTRAINTS 語句僅適用於當前的會話。

 

5.2.       刪除表或表空間時連帶刪除其上的外鍵(約束)

 

sql> drop table table_name cascadeconstraints

 

sql> drop tablespace tablespace_nameincluding contents cascade constraints

 

在刪除父表以前,必須先刪除外鍵。可使用如下一條語句同時執行這兩個操做:

 

       DROP TABLE table CASCADE CONSTRAINTS

 

在未刪除或禁用外鍵以前沒法截斷(truncated)父表。

 

在刪除包含父表的表空間以前,必須先刪除外鍵。可以使用下列命令完成該操做:

 

       DROP TABLESPACE tablespace INCLUDING CONTENTS

 

       CASCADE CONSTRAINTS

 

若是從父表中刪除行時沒有使用 DELETE CASCADE 選項,Oracle 服務器必須確保子表中的行不包含相應的外鍵。一樣,僅當子行中不包含舊鍵值時,才容許更新父鍵。若是子表的外鍵上沒有索引,則 Oracle 服務器鎖定子表並禁止更改以確保引用完整性。若是表上有索引,則可經過鎖定索引項並避免子表上有更具限制性的鎖來維護引用完整性。若是必須從不一樣的事務處理同時更新兩個表,則在外鍵列上建立索引。

 

5.3.       在建立表時定義約束(define constraints while create a table

 

sql> create table xay(id number(7)constraint xay_id primary key deferrable

 

sql> using index storage(initial 100knext 100k) tablespace indx);

 

primary key/unique/referencestable(column)/check

 

5.4.       啓用當前禁用的約束(enable constraints

 

sql> alter table xay enable novalidateconstraint xay_id;

 

啓用 NOVALIDATE:

 

對於當前已有索引的 PRIMARY KEY UNIQUE 約束,啓用 NOVALIDATE 約束比啓用 VALIDATE 約束要快得多,這是由於,若是約束是可延遲的,則不檢查現有數據是否違反約束。若是使用該選項啓用約束,則不要求鎖定表。這種方法適合表上有許多 DML 活動的狀況,如在 OLTP 環境中。

 

可是,若是須要建立索引,使用這種啓用約束的方法並不能比 ENABLE VALIDATE 帶來更多的好處,由於 Oracle 服務器在創建索引時鎖定表。

 

5.5.       啓用約束(enable constraints

 

sql> alter table xay enable validateconstraint xay_id;

 

6.       加載(load)數據

 

6.1.       使用insert語句從另外一張表中「直接加載」數據到新表(loading data using direct_load insert

 

sql> insert /*+append */ into empnologging

 

sql> select * from emp_old;

 

6.2.       使用insert方式的「並行直接加載」數據(parallel direct-load insert

 

sql> alter session enable parallel dml;

 

sql> insert /*+parallel(emp,2) */ intoemp nologging

 

sql> select * from emp_old;

 

6.3.       使用sql*loader加載數據(using sql*loader

 

sql> sqlldr scott/tiger \

 

sql> control = ulcase6.ctl \

 

sql> log = ulcase6.log direct=true

 

7.       重整數據(reorganizing data

 

7.1.       使用export倒出數據(using export

 

$exp scott/tiger tables(dept,emp)file=c:\emp.dmp log=exp.log compress=n direct=y

 

7.2.       使用import倒入數據(using import

 

$imp scott/tiger tables(dept,emp)file=emp.dmp log=imp.log ignore=y

 

7.3.       以移動表空間(transporting)方式導入導出一個表(transporting a tablespace

 

sql>alter tablespace sales_ts read only;

 

$exp sys/.. file=xay.dmptransport_tablespace=y tablespace=sales_ts

 

triggers=n constraints=n

 

$copy datafile

 

$imp sys/.. file=xay.dmptransport_tablespace=y datafiles=(/disk1/sles01.dbf,/disk2

 

/sles02.dbf)

 

sql> alter tablespace sales_ts readwrite;

 

7.4.       checking transport set

 

sql>DBMS_tts.transport_set_check(ts_list =>'sales_ts'..,incl_constraints=>true);

 

在表transport_set_violations 中查看

 

sql> dbms_tts.isselfcontained true 是,表示自包含

 

8.       管理口令及相關資源(managing password security and resources

 

8.1.       修改用戶賬號加/解鎖及口令(controlling account lock and password

 

sql> alter user juncky identified byoracle account unlock;

 

8.2.       user_provided password function

 

sql> function_name(userid invarchar2(30),password in varchar2(30),

 

old_password in varchar2(30)) returnboolean

 

8.3.       建立概要文件:設置口令參數(create a profile : password setting

 

sql> create profile grace_5 limitfailed_login_attempts 3

 

sql> password_lock_time unlimitedpassword_life_time 30

 

sql>password_reuse_time 30password_verify_function verify_function

 

sql> password_grace_time 5;

 

8.4.       修改概要文件(altering a profile

 

sql> alter profile default limit

 

sql> failed_login_attempts 3

 

sql> password_life_time 60;

 

8.5.       刪除概要文件(drop a profile

 

sql> drop profile grace_5 [cascade];

 

8.6.       建立概要文件:設置資源限額(create a profile : resource limit

 

sql> create profile developer_prof limitsessions_per_user 2

 

sql> cpu_per_session 10000 idle_time 60connect_time 480;

 

8.7.       view => resource_cost : alter resource cost

 

dba_Users,dba_profiles

 

8.8.       容許資源限額(enable resource limits

 

sql> alter system setresource_limit=true;

 

9.       管理用戶(Managing users

 

9.1.       建立用戶(數據庫認證方式)(create a user: database authentication

 

sql> create user juncky identified byoracle default tablespace users temporary tablespace temp quota 10m/unlimitedon data password expire [account lock|unlock] [profile profilename|default];

 

9.2.       修改用戶的表空間限額(change user quota on tablespace

 

sql> alter user juncky quota 0 on users;

 

9.3.       刪除用戶(drop a user

 

sql> drop user juncky [cascade];

 

9.4.       監控用戶的視圖(monitor user

 

view: dba_users , dba_ts_quotas

 

10.       管理權限(managing privileges

 

10.1.       系統權限視圖(system privileges:

 

view => system_privilege_map,dba_sys_privs,session_privs

 

10.2.       受權系統權限(grant system privilege

 

sql> grant create session,create tableto managers;

 

sql> grant create session to scott withadmin option;

 

with admin option can grant or revokeprivilege from any user or role;

 

10.3.       sysdbasysoper的權限(sysdba and sysoper privileges:

 

sysoper: startup,shutdown,alter databaseopen|mount,alter database backup controlfile,alter tablespace begin/endbackup,recover database,alter database archivelog,restricted session

 

sysdba:sysoper privileges with adminoption,create database,recover database until

 

10.4.       口令文件成員視圖(password file members:

 

view:=> v$pwfile_users

 

10.5.       O7_dictionary_accessibility =true

 

 restriction access to view or tables in other schema

 

10.6.       撤銷系統權限(revoke system privilege

 

sql> revoke create table from karen;

 

sql> revoke create session from scott;

 

10.7.       受權對象權限(grant object privilege

 

sql> grant execute on dbms_pipe topublic;

 

sql> grant update(first_name,salary) onemployee to karen with grant option;

 

10.8.       顯示對象權限的視圖(display object privilege :

 

view => dba_tab_privs, dba_col_privs

 

10.9.       撤銷用戶的對象權限(revoke object privilege

 

sql> revoke execute on dbms_pipe fromscott [cascade constraints];

 

10.10.        審計記錄視圖(audit recordview :

 

=> sys. aud$

 

10.11.        保護審計線索(protecting theaudit trail

 

sql> audit delete on sys.aud$ by access;

 

保護審計線索:

 

應保護審計線索,以防添加、修改或刪除審計信息。發出如下命令:

 

       SQL> AUDIT delete ON sys.aud$ BY ACCESS;

 

可防止審計線索未經受權即被刪除;只有 DBA 才擁有 DELETE_CATALOG_ROLE 角色。

 

10.12.        語句審計(statementauditing

 

sql> audit user;

 

語句審計:該種審計對 SQL 語句進行選擇性審計,而並不審計語句針對的特定方案對象。例如,AUDIT TABLE 跟蹤多個 DDL 語句,而與這些語句針對的表無關。能夠設置語句審計,以便對數據庫中的所選用戶或每一個用戶進行審計。

 

10.13.        權限審計(privilegeauditing

 

sql> audit select any table by summit byaccess;

 

權限審計:

 

該種審計對執行操做應具備的相應系統權限進行選擇性審計,如 AUDIT CREATE ANY TRIGGER。能夠設置權限審計對數據庫中的所選用戶或每一個用戶進行審計。

 

10.14.        方案對象審計(schema objectauditing

 

sql> audit lock on summit.employee byaccess whenever successful;

 

方案對象審計:

 

該種審計對特定方案對象上的特定語句進行選擇性審計,如 AUDIT SELECT ON HR.EMPLOYEES。方案對象審計始終適用於全部數據庫用戶。

 

11.       審計選項視圖(view audit option :

 

view=>all_def_audit_opts,dba_stmt_audit_opts,dba_priv_audit_opts,dba_obj_audit_opts

 

12.       審計結果視圖(view audit result:

 

view=> dba_audit_trail,dba_audit_exists,dba_audit_object,dba_audit_session,dba_audit_statement

 

13.       管理角色(manager role

 

13.1.       建立角色(create roles

 

sql> create role sales_clerk;

 

sql> create role hr_clerk identified bybonus;

 

sql> create role hr_manager identifiedexternally;

 

13.2.       修改角色(modify role

 

sql> alter role sales_clerk identifiedby commission;

 

sql> alter role hr_clerk identifiedexternally;

 

sql>alter role hr_manager notidentified;

 

13.3.       分配角色給用戶(assigning roles

 

sql> grant sales_clerk to scott;

 

sql> grant hr_clerk to hr_manager;

 

sql> grant hr_manager to scott withadmin option;

 

13.4.       創建缺省角色(establish default role

 

sql> alter user scott default rolehr_clerk,sales_clerk;

 

sql> alter user scott default role all;

 

sql> alter user scott default role allexcept hr_clerk;

 

sql> alter user scott default role none;

 

13.5.       容許和禁止角色(enable and disable roles

 

sql> set role hr_clerk;

 

sql> set role sales_clerk identified bycommission;

 

sql> set role all except sales_clerk;

 

sql> set role none;

 

13.6.       撤銷用戶的角色(remove role from user

 

sql> revoke sales_clerk from scott;

 

sql> revoke hr_manager from public;

 

13.7.       刪除角色(remove role

 

sql> drop role hr_manager;

 

13.8.       顯示角色信息的視圖(display role information

 

view:=>dba_roles,dba_role_privs,role_role_privs,dba_sys_privs,role_sys_privs,role_tab_privs,session_roles

 

14.       備份和恢復(BACKUP and RECOVERY

 

14.1.       備份恢復用相關視圖

 

v$sga,v$instance,v$process,v$bgprocess,v$database,v$datafile,v$sgastat

 

14.2.       Rman設置初始化參數

 

Rman need set dbwr_IO_slaves orbackup_tape_IO_slaves and large_pool_size

 

14.3.       監控並行回滾的視圖(Monitoring Parallel Rollback

 

> v$fast_start_servers ,v$fast_start_transactions

 

14.4.       執行一個冷備份(perform a closed database backup (noarchivelog)

 

> shutdown immediate

 

> cp files /backup/

 

> startup

 

14.5.       改變數據文件的位置(restore to a different location

 

> connect system/manager as sysdba

 

> startup mount

 

> alter database rename file'/disk1/../user.dbf' to '/disk2/../user.dbf';

 

> alter database open;

 

14.6.       恢復命令(recover)語法recover syntax

 

--recover a mounted database

 

>recover database;

 

>recover datafile '/disk1/data/df2.dbf';

 

>alter database recover database;

 

--recover an opened database

 

>recover tablespace user_data;

 

>recover datafile 2;

 

>alter database recover datafile 2;

 

14.7.       設置自動應用重作日誌文件(how to apply redo log files automatically

 

>set autorecovery on

 

>recover automatic datafile 4;

 

14.8.       徹底恢復(completerecovery:

 

--method 1(mounted databae)

 

>copy c:\backup\user.dbfc:\oradata\user.dbf

 

>startup mount

 

>recover datafile 'c:\oradata\user.dbf;

 

>alter database open;

 

--method 2(opened database,initiallyopened,not system or rollback datafile)

 

>copy c:\backup\user.dbfc:\oradata\user.dbf (alter tablespace offline)

 

>recover datafile 'c:\oradata\user.dbf'or

 

>recover tablespace user_data;

 

>alter database datafile 'c:\oradata\user.dbf'online or

 

>alter tablespace user_data online;

 

--method 3(opened database,initially closednot system or rollback datafile)

 

>startup mount

 

>alter database datafile'c:\oradata\user.dbf' offline;

 

>alter database open

 

>copy c:\backup\user.dbfd:\oradata\user.dbf

 

>alter database rename file'c:\oradata\user.dbf' to 'd:\oradata\user.dbf'

 

>recover datafile 'e:\oradata\user.dbf'or recover tablespace user_data;

 

>alter tablespace user_data online;

 

--method 4(loss of data file with no backupand have all archive log)

 

>alter tablespace user_data offlineimmediate;

 

>alter database create datafile'd:\oradata\user.dbf' as 'c:\oradata\user.dbf''

 

>recover tablespace user_data;

 

>alter tablespace user_data online

 

14.9.       對一個打開的數據庫進行備份(perform an open database backup

 

> alter tablespace user_data beginbackup;

 

> copy files /backup/

 

> alter database datafile'/c:/../data.dbf' end backup;

 

> alter system switch logfile;

 

14.10.        備份一個控制文件(backup acontrol file

 

> alter database backup controlfile to'control1.bkp';

 

> alter database backup controlfile totrace;

 

14.11.        非歸檔模式下的恢復(recovery(noarchivelog mode)

 

> shutdown abort

 

> cp files

 

> startup

 

14.12.        備份模式下的文件恢復(recoveryof file in backup mode

 

>alter database datafile 2 end backup;

 

14.13.        清空重作日誌文件(clearingredo log file

 

>alter database clear unarchived logfilegroup 1;

 

>alter database clear unarchived logfilegroup 1 unrecoverable datafile;

 

14.14.        重作日誌的恢復(刪除與重建)(redolog recovery

 

>alter database add logfile group 3'c:\oradata\redo03.log' size 1000k;

 

>alter database drop logfile group 1;

 

>alter database open;

 

or >cp c:\oradata\redo02.log'c:\oradata\redo01.log

 

>alter database clear logfile'c:\oradata\log01.log';

 

Oracle數據庫手邊命令

1、獲得數據庫名和建立日期

SELECT name, created, log_mode, open_modeFROM v$database;

2ORACLE數據庫的計算機的主機名,ORACLE數據庫的實例名及ORACLE數據庫管理系統的版本信息

SELECT host_name, instance_name, versionFROMv$instance;

3、爲了知道oracle數據庫版本的一些特殊信息

select * from v$version;

4、獲取控制文件名字

select * from v$controlfile;

5、獲得Oracle數據庫的重作日誌配置信息

SELECT group#, members, bytes, status,archived FROM v$log;

select GROUP#,MEMBER from v$logfile;

6、獲取oracle的每一個重作日誌(成員)文件所存放的具體位置

select * from v$logfile;

7、知道ORACLE數據庫的備份和恢復策略和歸檔文件的具體位置

archive log list

8、知道ORACLE數據庫中到底有多少表空間以及每一個表空間的狀態

select tablespace_name, block_size, status,contents, logging from dba_tablespaces;

select tablespace_name, status fromdba_tablespaces;

9、知道每一個表空間存在哪一個磁盤上以及文件的名字等信息

SELECT file_id, file_name, tablespace_name,status, bytes from dba_data_files;

select file_name, tablespace_name fromdba_data_files;

10、知道Oracle數據庫系統上到底有多少用戶和都是何時建立的

select username,created from dba_users;

select username, DEFAULT_TABLESPACE fromdba_users;

11、從控制文件中取出信息涉及到如下一些相關的命令

 

select * from v$archived

select * from v$archived_log

select * from v$backup

select * from v$database

select * from v$datafile

select * from v$log

select * from v$logfile

select * from v$loghist

select * from v$tablespace

select * from v$tempfile

12、控制文件由兩大部份組成:可重用的部份和不可重用的部分。可重用的部分的大小可用CONTROL_FILE_RECORD_KEEP_TIME參數來控制,該參數的默認值爲7天,便可重用的部份的內容保留7天,一週以後這部份的內容可能被覆蓋。可重用的部份是供恢復管理器來使用的,這部份的內容能夠自動擴展。Oracle數據庫管理員可使用CREAT DATABASECREAT CONTROLFILE語句中的下列關鍵字(參數)來間接影響不可重用的部份的大小:

      MAXDATAFILES

  MAXINSTANCES

     MAXLOGFILES

     MAXLOGHISTORY

     MAXLOGMEMBERS

13、查看控制文件的配置

SELECT type, record_size, records_total,records_used  FROMv$controlfile_record_section;

14、若是您的顯示被分紅了兩部分,您須要使用相似於set pagesize 100SQL*Plus命令先格式化輸出。有關的格式化輸出命令有如下這些:

record_size 爲每一個記錄的字節數。

records_total:爲該段所分配的記錄個數。

records_used:爲該段所使用的記錄個數。

15、知道控制文件中的全部數據文件(DATAFILE),表空間(TABLESPACE),和重作日誌(REDOLOG)所使用的記錄狀況

SELECT type, record_size, records_total,records_used

 FROMv$controlfile_record_section

 WHERE type IN ( 'DATAFILE', 'TABLESPACE','REDO LOG');

16、獲取控制文件名字

select value from v$parameter where name='control_files';

或者:select * from v$controlfile

17、如何在一個已經安裝的Oracle數據庫中添加或移動控制文件呢?

如下是在一個已經安裝的Oracle數據庫中添加或移動控制文件的具體步驟:

a、利用數據字典v$controlfile來獲取現有控制文件名字。

b、正常關閉Oracle數據庫。

c、將新的控制文件名添加到參數文件的CONTROL_FILES參數中。

d、使用操做系統的複製命令將現有控制文件複製到指定位置。

e、從新啓動Oracle數據庫。

f、利用數據字典v$controlfile來驗證新的控制文件名字是否正確。

g、若是有誤重作上述操做,若是無誤刪除無用的舊控制文件。

注:若是您使用了服務器初始化參數文件(SPFILE),您不能關閉Oracle數據庫並且應該在第3步使用alter system set control_filesOracle命令來改變控制文件的位置。

SQL> alter system set control_files =

   'D:\Disk3\CONTROL01.CTL',

   'D:\Disk6\CONTROL02.CTL',

   'D:\Disk9\CONTROL03.CTL' SCOPE=SPFILE;

18、因爲控制文件是一個極其種要的文件,除了以上所說的將控制文件的多個副本存在不一樣的硬盤上的保護措施外,在數據庫的結構變化以後,您應當即對控制文件進行備份。能夠用Oracle命令來對控制文件進行備份:

alter database backup controlfile to'D:\backup\control.bak';

19、您也可將備份到一個追蹤文件中。該追蹤文件包含有重建控制文件所需的SQL語句。可以使用如下SQL語句來產生這一追蹤文件:

alter database backup controlfile to trace;

20、正常關閉oracle命令

shutdown immeditae

 

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/foresail/archive/2007/10/26/1844695.aspx

 

Oracle數據庫命令集

1sqlplus啓動方式:

Dos下運行sqlplus 用戶名/密碼  as sysdba

例如:c:>sqlplus sys/password AS sydba(系統賬戶)

或者:c:>sqlplus scott/password

2、用戶鏈接(切換)操做:

sql>conn Scott/password(默認爲tiger)

注:connconnect使用方法同樣

3、手動解鎖:

sql>ALTER USER scott Account Unlock;(scott賬戶解鎖)

4、查看用戶(兩種方式)

sql>select user form dual;

sql>show user;

5sql幫助:

sql>help index;

6、數據庫卸載和加載

sql>shutdown[NORMAL][IMMEDLATE][ABORT][TRANSACTIONAL];

sql>startup;

7、查詢select操做:

sql>select *from dept;

sql>select dname,loc from dept;

sql>select *from emp where deptno=20;

注:在sql中,字符串使用單引號。

8、字段別名的定義:

sql>select hiredate AS 僱用日期 from emp

AS能夠省略,可是推薦使用。

9、字符串鏈接

sql>selcet dname||loc from dept;

10、提取表中的前N個記錄:

sql>select *from emp where rownum<=N;

11null的使用:

sql>select ename,job from emp where commis[not] null;

注:null參與數學表達式計算時,結果必定爲null

12like關鍵字(字符串匹配)

sql>select dname from dept where dnamelike '_S%';

注:_表明單個字符,%表明多個字符。

13in關鍵字:

sql>select dname,dpart,log from deptwhere deptno in(10,20);

注:只選擇輸出deptno值爲1020的記錄。

相似於:where deptno=10 or deptno=20;

14between and關鍵字:

sql>select * from dept where deptnobetween 10 and 30;

包括1030.

15set關鍵字:

sql>set pagesize 10;

sql>set linesize 100;

16、鏈接查詢:

求解sal大於平均值的記錄

sql>select * from emp

   where sal>(select avg(sal) from emp);

17、聯合查詢:

字段個數和類型必須保持一致,合併爲一個查詢結果。

sql>select empno,ename from emp

   union[ALL]

   select deptno,dname from dept;

ALL:表明能夠有重複記錄。

18、內鏈接查詢:

內鏈接查詢分爲2中:一是在form後直接加表名,中間用逗號分隔。

sql>select * from emp e,dept d  (e d爲表的別名)

   where e.deptno=d.deptno;

二是使用join關鍵字,條件使用ON

sql>select * from emp join dept

   ON emp.deptno=dept.deptno;

19、自鏈接查詢:將一個表起不一樣的別名,使其在邏輯上成爲兩張表。

sql>select * from emp a,emp b

   where a.mgr=b.empno;

20、外鏈接查詢:

左外鏈接查詢:left join 左表所有顯示

右外鏈接查詢:right join右表所有顯示

全外鏈接查詢:full join 左右表均所有顯示

以左外鏈接爲例:

sql>select * from dept

   left join  emp

   on dept.deptno=emp.deptno;

左表(dept)信息所有顯示,右表(emp)中不符合條件的記錄爲null

21、集合函數(數學表達式)

sql>select AVG(sal) from emp;

sql>select Count([distinct]sal) fromemp;

distinct表示不計算重複數據。

22、插入記錄:

sql>Insert Into tablename (字段列表) values(屬性類表)

sql>Insert Into emp(eno,ename,dept)values(1,'java',20);

23、修改(更新)記錄:

sql>UpDate emp set deptno=80

   where deptno=81;

24、刪除記錄:

sql>Delete from tablename where 條件

sql>Delete from emp where deptno=80;

25、建立視圖:注意權限,本操做是在sys賬戶下進行的。

sql>create view view_name(ename,dname)

   AS

   select emp.ename,dept.dname

   from scott.emp,scott.dept

   with read only;

sql>select * from view_name;

26、同義詞

   create synonym 同義詞名稱  for 原對象

sql>create synonym empbak for scott.emp;

sql>select * from empbak;

27、修改對象(表、視圖等)結構ALTER

sql>alter table 表名add("book_id"VARCHAR2(10));//添加字段,注意雙引號

sql>alter table 表名modify("book_id",not null);

28、修改表的操做

sql>rename 原表名 to 新表名//修改表名

sql>select * from tab;//查找當前用戶表信息

sql>desc 表名//查看錶結構

sql>drop table 表名//刪除表

sql>truncate table 表名//刪除表中數據,保留表結構

29、事務處理

sql>commit 成功提交事務

sql>rollback 返回到事務未開始的狀態

sql>savepoint A 建立事務的保存點

sql>rollback to [savepoint] A 返回保存點

30EXISTS關鍵字

sql>select * from dept where EXISTS(select deptno from emp);

31、從另一個表中拷貝記錄

sql>Insert Into emp(empno,job)

   select dname from dept where deptno=50;

sql>insert into (select deptno,dnamefrom dept)

   values (50,'Java');

32、更新(2個表操做)表記錄:

sql>update emp set ename=(select dnamefrom dept  where deptno=50 ),

   job=(select loc from dept where deptno=50 )

   where ename like 'S%'

33、刪除(2個表操做)操做:

sql>delete from emp where empno=

   (select deptno from dept where deptno=50)

34、合併操做MERGE INTO

sql>MERGE INTO 表名

   Using 表名

   ON(條件)

   when Matched then (匹配)

update set ....

   when not Matched then

insert into....

34any/some操做,表明知足any後面的任何一個條件便可:

sql>select * from emp

   where sal<=any(2500,6000,10000);

35all操做,表明知足all後面的全部條件:

sql>select * from emp

   where sal<=all(2500,6000,10000);

37list操做:列出緩衝區的內容,可簡寫l,後接整型數字或爲空

sql>list(n)

38/操做:執行緩衝區sql命令或PL/SQL

39change操做:修改緩衝區裏的信息,可簡寫c

sql>c/fron/from

fron改寫爲from

40del操做:刪除指定行緩衝區命令

sql>del 2 3 刪除第2行、第3行的信息。

41、在緩衝區中追加信息(追加到末尾)

sql>append where select;

42save命令,保存緩衝區內容到指定的文件中:

sql>save c:\select.sql;

43get命名(save對應)

sql>get c:\select.sql;

44@命令(get類似,get是加載語句,而後執行,而@是加載和執行同時進行)

sql>@ c:\select.sql;

45edit命令,載入windows操做系統的可編輯窗口,簡寫ed

sql>edit

 

1、SQL PLUS

1 引言

 

SQL命令

如下17個是做爲語句開頭的關鍵字:

alter drop  revoke

audit grant  rollback*

commit* insert  select

comment lock  update

create noaudit  validate

delete rename

這些命令必須以「;」結尾

*命令句尾沒必要加分號,而且不存入SQL緩存區。

 

SQL中沒有的SQL*PLUS命令

這些命令不存入SQL緩存區

@ define  pause

# del  quit

$ describe  remark

/ disconnect  run

accept document  save

append edit  set

break exit  show

btitle get  spool

change help  sqlplus

clear host  start

column input  timing

compute list  ttitle

connect newpage  undefine

copy

 

-------

2 數據庫查詢

 

數據字典

TAB 用戶建立的全部基表、視圖和同義詞清單

 

DTAB 構成數據字典的全部表

 

COL 用戶建立的基表的全部列定義的清單

 

CATALOG 用戶可存取的全部基表清單

 

select from tab;

 

describe命令 描述基表的結構信息

describe dept

 

select 

from emp;

 

select empno,ename,job

from emp;

 

select from dept

order by deptno desc;

 

邏輯運算符

= !=<> > >=< <=

in

between value1 and value2

like

%

_

in null

not

no in,is not null

 

謂詞innot in

有哪些職員和分析員

select ename,job

from emp

where job in ('clerk','analyst');

 

select ename,job

from emp

where job not in ('clerk','analyst');

 

謂詞betweennot between

哪些僱員的工資在20003000之間

select ename,job,sal from emp

where sal between 2000 and 3000;

 

select ename,job,sal from emp

where sal not between 2000 and 3000;

 

謂詞like,not like

select ename,deptno from emp

where ename like 'S%';

(以字母S開頭)

select ename,deptno from emp

where ename like '%K';

(K結尾)

select ename,deptno from emp

where ename like 'W___';

(W開頭,後面僅有三個字母)

select ename,job from emp

where job not like 'sales%';

(哪些僱員的工種名不以sales開頭)

 

謂詞is null,is not null

沒有獎金的僱員(即commisionnull

select ename,job from emp

where comm is null;

 

select ename,job from emp

where comm is not null;

 

多條件查詢

select ename,job

from emp

where deptno=20

and job!='clerk';

 

表達式

/

 

算術表達式

選擇獎金高於其工資的5%的僱員

select ename,sal,comm,comm/sal from emp

where comm>.05*sal

 order by comm/sal desc;

 

日期型數據的運算

add two days to 6Mar-87

6-Mar-87 2 = 8-Mar-87

add two hours to 6-Mar-87

6-Mar-87 2/24 = 6-Mar-87 and 2hrs

add 15 seconds to 6-Mar-87

6-Mar-87 15/(24*60*60) = 6-Mar-87 and 15secs

 

列名的別名

select ename employee from emp

 where deptno=10;

(別名:employee

select ename,sal,comm,comm/sal "C/SRATIO" from emp

 where comm>.05*sal

 order by comm/sal desc;

 

SQL命令的編輯

list or l 顯示緩衝區的內容

list 4 顯示當前SQL命令的第4行,並把第4行做爲當前行,在該行號後面有個*

change or c 用新的內容替換原來在一行中第一次出現內容

SQL>c/(...)/('analyst')/

input or i 增長一行或多行

append or a 在一行後追加內容

del  刪除當前行 刪除SQL緩衝區中的當前行

run  顯示並運行SQL緩衝區中的命令

/  運行SQL緩衝區中的命令

edit SQL緩衝區中的命令寫到操做系統下的文本文件,

並調用操做系統提供的編輯器執行修改。

 

-----------

3 數據操縱

數據的插入

insert into dept

 values (10,'accounting','new york');

 

insert into dept (dname,deptno)

 values ('accounting',10);

 

從其它表中選擇插入數據

insert into emp (empno,ename,deptno)

select id,name,department

from old_emp

where department in(10,20,30,40);

 

使用參數

insert into dept

 values(&deptno,&dname,&loc);

執行時,SQL/PLUS對每一個參數將有提示用戶輸入

 

參數對應日期型或字符型數據時,可在參數上加引號,輸入時就可不用引號

insert into dept

 values(&deptno,'&dname','&loc');

 

插入空值(NULL

insert into dept

 values(50,'education',null);

 

插入日期型數據

日期型數據缺省格式:DD-MON-YY

insert into emp

(empno,ename,hiredate)

values(7963,'stone','07-APR-87');

 

系統時間:SYSDATE

insert into emp

(empno,ename,hiredate)

values(7600,'kohn',SYSDATE);

 

數據更新

update emp

set job='manager'

where ename='martin';

 

update emp

set job='market rep'

where ename='salesman';

 

update emp

set deptno=40,job='market rep'

where job='salesman';

 

數據刪除

delete emp

where empno=765;

 

更新的提交

commit

 

自動提交方式

set autocommit on

若是狀態設爲開,則使用inesrt,update,delete會當即提交。

 

更新取消

rollback

 

兩次連續成功的commit之間的操做,稱爲一個事務

 

-------------

4  建立基表、視圖

建立基表

create table dept

(deptno number(2),

dname char(14),

loc char(13));

 

數據字典會自動更新。

一個基表最多254列。

 

表名列名命名規則:

限制

第一個字符必須是字母,後面可任意(包括 $ # 但不能是逗號)。

名字不得超過30個字符。

 

惟一

某一用戶的基表名必須惟一,不能是ORACLE的保留字,同一基表的列名互不相同。

 

使用雙引號

若是表名用雙引號括起來,則可不知足上述規則;

只有使用雙引號,才能區別大、小寫;

命名時使用了雙引號,在之後的操做也必須使用雙引號。

 

數據類型:

char(n)   (不得超過240字符)

number(n,d)

date

long   (最多65536字符)

raw   (二進制原始數據)

 

空值處理

有時要求列值不能爲空

create table dept

(deptno number(2) not null,

dname char(14),

loc char(13));

 

在基表中增長一列

alter table dept

add (headcnt number(3));

 

修改已有列屬性

alter table dept

modify dname char(20);

注:只有當某列全部值都爲空時,才能減少其列值寬度。

只有當某列全部值都爲空時,才能改變其列值類型。

只有當某列全部值都爲不空時,才能定義該列爲not null

例:

alter table dept modify (loc char(12));

alter table dept modify loc char(12);

alter table dept modify (dname char(13),locchar(12));

 

建立視圖

create view managers as

select ename,job,sal

from emp

where job='manager';

 

爲視圖列名取別名

create view mydept

(person,title,salary)

as select ename,job,sal

from emp

where deptno=10;

 

with check option選項

使用with check option,保證當對視圖插入或更新數據時,

該數據必須知足視圖定義中select命令所指定的條件。

create view dept20 as

select ename,job,sal,deptno

from emp

where deptno=20

with check option;

在作下述操做時,會發生錯誤

update dept20

set deptno=30

where ename='ward';

 

基表、視圖的拷貝

create table emp2

as select from emp;

 

基表、視圖的刪除

drop table 表名

drop view 視圖名

 

----------

5 SQLPLUS報表功能

SQL*PLUS的一些基本格式命令

column deptno heading department

 

column ename heading name

 

column sal heading salary

 

column sal format $99,999.00

 

ttitle sample report for|hitech corp

 

btitle strictly confidential

 

break on deptno

 

compute sum of sal on deptno

 

run

 

表頭和表尾

ttitle sample report for|hitech corp

btitle right strictly confidential

 

|」表示換行,結尾沒必要加分號

選項有三種:left right center

 

使用TTITLE,系統將自動地在每頁的頂部顯示日期和頁號。

TTITLETBTITLE命令有效,直至從新設置表頭或表尾,或退出SQL*PLUS

 

下面命令使標題語句失效

TTITLE OFF

BTITLE OFF

 

列名

column命令定義用於顯示列名

若名字爲一個單詞,沒必要加引號

column ename heading employee

 

column ename heading 'employee|name'

|爲換行)

 

取消欄定義

column ename clear

 

列的格式

column ename format A15

 

column sal format $9,999.99

 

column comm like sal

 

like子句,使得某一列的格式參照另外一列格式,它拷貝列名及其格式

 

控制記錄顯示分組順序

break on deptno

(不顯示重複值)

 

select deptno,ename

from emp

order by deptno;

ORDER BY子句用於控制BREAK

 

顯示爲

10 clark

  niller

20 smith

  scott

30 allen

  blake

 

每次只有一個BREAK命令起做用,但一次能夠在多個列上使用BREAK命令

break on 列名1 on 列名2

 

記錄分組

break on deptno skip 2

select deptno,ename

from emp

order by deptno;

 

每一個deptno之間空兩行

clear break(取消BREAK命令)

break on page(每次從一新頁開始)

break on report(每次從一新報表開始)

break on page on report(聯合使用)

 

分組計算

break on deptno skip 2

compute sum of sal on deptno

計算每一個部門的工資總和

skip子句使部門之間的信息分隔開

 

其餘計算命令

compute avg of sal on deptno(平均值)

count 非空值的總數

MAX 最大值

MIN 最小值

STD 標準誤差

VAR 協方差

NUMBER 行數

 

使compute命令失效

一旦定義了COMPUTE,則一直有效,直到

關閉COMPUTEclear compute

 

SQL/PLUS環境命令

show 選項

(顯示當前參數設置狀況)

 

show all(顯示所有參數)

 

設置參數

set 選項 值或開關

 

set autocommit on

 

SET命令包括

set autocommit {off|on|immediate}

(自動提交,OFF缺省)

 

set echo {off|on}

(命令文件執行,是否在終端上顯示命令自己,OFF缺省)

 

set feedback {off|on}

ON:查詢結束時,給出結果,記錄數的信息,缺省;

OFF:無查詢結果,記錄數的信息)

 

set heading {off|on}

ON:列的頭標在報表上顯示,缺省;OFF:不在報表上顯示)

 

set linesize {n}

一行顯示的最大字符數,缺省爲80

 

set pagesize {n}

每頁的行數,缺省是14

 

set pause {off|on|text}

ON:當報表超過一頁時,每顯示一屏就暫停顯示,等待用戶打回車鍵,再接着顯示;

OFF:頁與頁不停頓,缺省;text:頁與頁停頓,並向用戶提示信息)

 

SET BUFFER buffer

設置當頭的命令緩衝區,一般狀況下,SQL命令緩衝區已爲當前緩衝區。

因爲SQL命令緩衝區只能存放一條SQL命令,

因此可用其它緩衝區來存放SQL命令和SQL*PLUS命令。

 

常常用到的設置可放在login.sql文件中。

 

SET NULL

set null 'no data'

 

select ename,comm

from emp

where deptno=30;

把部門30中無佣金僱員的佣金顯示爲「NO DATA」。

 

set nullSQL*PLUS命令,用它來標識空值(NULL),能夠設置爲任意字符串。

 

存盤命令SAVE

save 文件名

 

input

1 select empno,ename,job

2 from emp

3 where job='analyst'

 

save research

 

目錄中會增長一個research.sql文件。

 

編輯命令EDIT

edit

 

EDIT編輯當前緩衝區中的內容。

 

編輯一個文件

edit research

 

調入命令GET

get research

把磁盤上的文件內容調入緩衝區,並顯示在屏幕上,文件名尾沒必要加.sql

 

START命令

運行指定的文件

start research

 

輸出命令SPOOL

spool tryfile

不只可使查詢結果在屏幕上顯示,還可使結果存入文件

 

中止向文件輸出

spool off

 

把查詢結果在打印機上輸出,先把它們存入一個文件中,

而後沒必要使用SPOOL OFF,而用:

spool out

SPOOL OUT關閉該文件並在系統缺省的打印機上輸出

 

製做報表舉例

edit tryfile

 

set echo off

set autocommit on

set pagesize 25

insert into emp (empno,ename,hiredate)

 values(9999,'geiger',sysdate);

insert into emp (empno,ename,deptno)

 values(3333,'samson',20);

spool newemp

select from emp

 where deptno=20

or deptno is null

/

spool off

set autocommit off

 

start命令執行這個文件

 

------

6 函數

字符型函數

initcap(ename);ename中每一個詞的第一個字母改成大寫。

如:jack smith--Jack Smith

 

length(ename);計算字符串的長度。

 

substr(job,1,4);

 

其它

lower

upper

least 取出字符串列表中按字母排序排在最前面的一個串

greatest 取出字符串列表中按字母排序排在最後的一個串

 

日期函數

add_month(hiredate,5) 在僱傭時間上加5個月

month_between(sysdate,hiredate) 計算僱傭時間與系統時間之間相差的月數

next_day(hiredate,'FRIDAY') 計算受僱日期以後的第一個星期五的日期

 

select ename,sal,next_day(sysdate,'FRIDAY')as_of

from emp

where deptno=20;

as_of是別名)

 

若是不用to_char函數,日期在ORACLE中的缺省格式是'DD_MON_YY'

to_char(date,date picture)

 

select ename,to_char(hiredate,'Dy Mondd,yyyy') hired

from emp

where deptno=10;

 

to_date(字符串,格式)

 

insert into emp(empno,ename,hiredate)

values(7999,'asms',to_date('070387083000','MMDDYYHHMISS'));

 

日期型數據的格式

dd 12

dy fri

day friday

ddspth twelfth

 

mm 03

mon mar

month march

 

yy 87

yyyy 1987

 

Mar 12,1987    'Mon dd,yyyy'

MAR 12,1987    'MON dd,yyyy'

Thursday MARCH 12    'Day MONTH dd'

Mar 12 11:00am    'Mon dd hh:miam'

Thu,the twelfth    'Dy,"the"ddspth'

 

算術函數

least(v1,v2)

 

select ename,empno,mgr,least(empno,mgr)lownum

from emp

where empno0

 

trunc(sal,0)

sal的近似值(截斷)

 

空值函數

nvl(v1,v2)

v1爲列名,若是v1不是空值,nvl返回其列值。

v1爲空值,返回v2的值。

 

聚組函數

select sum(comm)

from emp;

(返回一個彙總信息)

不能把sum用在select語句裏除非用group by

 

字符型、日期型、數字型的聚組函數

min max count可用於任何數據類型

 

select min(ename)

from emp;

 

select min(hiredate)

from emp;

 

select min(sal)

from emp;

 

有多少人有工做?

select count(job)

from emp;

 

有多少種不一樣的工種?

select count(distinct job)

from emp;

 

count distinct 計算某一字段中不一樣的值的個數

 

其它聚組函數(只用於數字型數據)

avg 計算平均工資

select avg(sal)

from emp;

 

stddev 計算工資的平均差

select stddev(sal)

from emp;

 

sum 計算總工資

select sum(sal)

from emp;

 

group by子句

select deptno,sum(sal),avg(sal)

from emp

group by deptno;

 

按多個條件分組

每一個部門的僱員數

select deptno,count()

from emp

group by deptno;

 

每一個部門的每一個工種的僱員數

select deptno,job,count(*)

from emp

group by deptno,job;

 

知足條件的分組

where是針對select的,having是針對group by的)

哪些部門的工資總和超過了9000

select deptno,sum(sal)

from emp

group by deptno

having sum(sal)>9000;

 

select小結

除去職員,哪些部門的工資總和超過了8000

select deptno,sum(sal)

from emp

where job!='clerk'

group by deptno

having sum(sal)>8000

order by sum(sal);

 

-------

7 高級查詢

等值聯接

select empno,ename,job,emp.deptno,dname

from emp,dept

where emp.deptno=dept.deptno;

 

外聯接

select ename,dept.deptno,loc

from emp,dept

where emp.deptno(+)=dept.deptno;

若是在dept.deptno中有的數值,在emp.deptno中沒有(如deptno=40),

則做外聯接時,結果中會產生一個空值

 

自聯接:同一基表的不一樣行要作聯接,可以使用自聯接

指出每一個僱員的經理名字

select worker.ename,manager.ename manager

from emp worker,emp manager

where worker.mgr=manager.empno;

 

非等值聯接

哪些僱員的工資屬於第三級別

select ename,sal

from emp,salgrade

where grade=3

and sal between losal and hisal;

(基表salgradegrade losal hisal

 

集合運算

行的鏈接

集合運算把2個或多個查詢結果合併爲一個

union-set union

Rows of first query plus of second query,less duplicate rows

 

intersect-set intersection

Rows both queries have in common

 

minus-set difference

rows unique to the first query

 

介紹幾個視圖

account view

ename sal job

 

sales view

ename sal job

 

research view

ename sal job

 

union運算

返回一個查詢結果中有但又不重要的行,它將基表或視圖中的記錄合併在一塊兒

全部部門中有哪些僱員工資超過2000

對應列的數據類型必須相同

select ename,sal

from account

where sal>2000

union

select ename,sal

from research

where sal>2000

union

select ename,sal

from sales

where sal>2000;

 

intersect運算

返回查詢結果中相同的部分

各個部門中有哪些相同的工種

select job

from account

intersect

select job

from research

intersect

select job

from sales;

 

minus運算

返回在第一個查詢結果中與第二個查詢結果不相同的那部分行記錄。

有哪些工種在財會部中有,而在銷售部中沒有?

select job from account

minus

select job from sales;

 

子查詢

slect ename,deptno

from emp

where deptno=

(select deptno

from emp

where ename='smith');

 

多級子查詢

select ename,job,sal

from emp

where job=

(select job

from emp

where ename='clark')

or sal>

(select sal

from emp

where ename='clark');

 

多個基表與子查詢

select ename,job,sal

from emp,dept

where loc='new york'

and emp.deptno=dept.deptno

and sal>

(select sal

from emp

where ename='scott');

 

子查詢中使用聚組函數

select ename,hiredate

from emp

where hiredate=

(select min(hiredate)

from emp);

 

8 受權

系統權限

DBA 全部權限

RESOURCE 註冊,建立新的基表

CONNECT,註冊,查詢

 

只有DBA纔有權建立新的用戶

grant connect to scott

identified by tiger;

 

DBA或用戶本身能夠改變用戶口令

grant connect to scott

identified by leopard;

 

基表權限1

有兩種方法得到對基表操做的權限

 

建立本身的基表

得到基表建立用戶的許可

grant select,insert

on emp

to scott;

 

這些權限有

select insert update delete alter index

 

把全部權限授於他人

grant all on emp to scott;

 

同義詞

select 

from scott.emp

 

建立同義詞

爲用戶allenEMP基表建立同義詞employee

create synonym employee

for allen.emp

 

基表權限2

你可使其餘用戶有這樣的權力,即其餘用戶能夠把你的基表權限授予他人

grant all

on emp

to scott

with grant option;

 

收回權限

系統權限只有被DBA收回

 

基表權限隨時均可以收回

 

revoke insert

on emp

from scott;

 

-------

9 索引

創建索引

create index emp_ename

on emp(ename);

 

刪除索引

drop index emp_ename;

 

關於索引

只對較大的基表創建索引(至少50條記錄)

創建索引以前插入數據

對一個基表可創建任意多個索引

通常是在做爲主鍵的列上創建索引

創建索引以後,不影響SQL命令的執行

創建索引以後,ORACLE自動維護和使用索引

 

保證數據惟一性

提升執行速度的同時,索引還能夠保證每一個記錄中的每一個列值是不重複的。

create unique index emp_empno

on emp(empno);

 

------

練習和答案

 

有沒有工資比獎金多的僱員?若是有,按工資的降序排列。

若是有兩個以上的僱員工資相同,按他們的名字排序。

select ename employee,sal salary,commcommision

from emp

where sal>comm

order by sal desc,ename;

 

列出有關僱員姓名、獎金佔收百分比的信息。

要求顯示時列名意義明確,按僱員姓名排序,不包括獎金未知的僱員。

select ename employee,(comm/(comm+sal))100incentive

from emp

where comm is not null

order by ename;

 

chicago(部門30)工做的全部僱員的工資上漲10%

update emp

set sal=1.1*sal

where deptno=30;

 

update emp

set sal=1.1*sal

where deptno=(select deptno

from dept

where loc='chicago');

 

hitech公司新建一個部門,編號爲50,其它信息均不可知。

insert into dept(dname,deptno)

values('faclities',50);

 

建立視圖,三個列名,其中不包括職員信息

create view employee("employeename",

"employee number",

"employee job")

as select ename,empno,job

from emp

where job!='clerk';

 

製做工資報表,包括僱員姓名、受僱時間(按星期計算),工資和部門編號,

一頁顯示一個部門的信息,每頁尾,顯示該頁的工資之和以及受僱時間之和,

報表結尾處,顯示全部僱員的工資總和以及受僱時間總和,

工資按美圓計算,受僱時間按星期計算,每頁的上方應有標題。

ttitle 'service'

break on deptno on page on report

compute sum of sal on deptno

compute sum of sal on report

compute sum of service_length on deptno

compute sum of service_length on report

column sal format $99,999.00

column service_length format 9999

select deptno,enameemployee,(sysdate-hiredate)/7 service_length,sal

from emp

order by deptno;

 

製做報表,包括僱員姓名、總收入和受傭日期,

且:姓名的第一個字母必須大寫,僱傭日期格式爲MM/DD/YYYY

總收入包括沒有獎金的僱員的總收入,姓名按字母順序排列。

col "hire date"format A12

col "employee" format A10

col "compensation" format$99,999.00

select initcap(ename) "employee",

(sal+nvl(comm,0)) "compensation",

to_char(hiredate,'MM/DD/YYYY') "hiredate"

from emp

order by ename;

 

列出有超過7個周邊國家的國家名字和麪積。

select nation,area

from nation

where code in

(select nation_code

from border

group by nation_code

having count(*)>7);

 

列出全部面積大於等於日本的島國的國名和人口。

select nation,population

from nation,border

where code=nation_code(+)

and nation_code is null

and area>=

(select area

from nation

where upper(nation)='JAPAN');

 

列出全部邊界在其它國家中的國名,而且顯示其邊界國家名字。

break on nation

select nation1.nation,

nation2.nation borderin_country

from nation nation1,border,nation nation2

where nation1.code=border.nation_code

and border.border_code=nation2.code

order by nation1.nation;

 

---------

---------

PL/SQL

 

2 PL/SQL的塊結構和數據類型

 

塊結構的特色

嵌套

begin

......

 begin

 ......

 exception

 ......

 end;

exception

......

end;

 

標識符:

不能超過30個字符

第一個字符必須爲字母

其他字符能夠是字母,數字,$_,或#

不區分大小寫形式

若是用雙引號括起來,則字符順序能夠任意排列,並區分大小寫形式

SQL保留字

 

數據類型

數字型:

整數,實數,以及指數

 

字符串:

用單引號括起來

若在字符串表示單引號,則使用兩個單引號

字符串長度爲零(兩個單引號之間沒有字符),則表示NULL

 

字符:

長度爲1的字符串

 

數據定義

語法

標識符[常數] 數據類型[NOT NULL][:=PL/SQL表達式];

':='表示給變量賦值

 

數據類型包括

數字型 number(7,2)

字符型 char(120)

日期型 date

布爾型 boolean(取值爲true,falsenull,不存貯在數據庫中)

 

日期型

anniversary date:='05-JUL-95';

project_completion date;

 

布爾型

over_budget boolean not null:=false;

available boolean;

(初始值爲NULL

 

%type類型匹配

books_printed number(6);

books_sold book_printed%type;

manager_name emp.ename%type;

 

變量賦值

變量名:=PL/SQL表達式

numvar:=5;

boolvar:=true;

datevar:='11-JUN-87';

 

字符型、數字型表達式中的空值

null+<數字>=null(空值加數字還是空值)

null><數字>=null(空值與數字進行比較,結果還是空值)

null||'字符串'='字符串'null''

(空值與字符串進行鏈接運算,結果爲原字符串)

 

變量做用範圍

標識符在宣言它的塊中有效

標識符若是不在子塊中從新定義,則在PL/SQL塊的全部子塊中一樣有效

從新定義後的標識符,做用範圍僅在本子塊中有效

 

declare

 e_mess char(80);

begin

  /*子塊1*/

 declare

   v1 number(4);

 begin

   select empno into v1 from emp

   where job='president';

 exception

   when too_many_rows then

     insert into job_errors

     values('more than one president');

 end;

  /*子塊2*/

 declare

   v1 number(4);

 begin

   select empno into v1 from emp

   where job='manager';

 exception

   when too_many_rows then

     insert into job_errors

     values('more than one manager');

 end;

exception

 when others then

   e_mess:=substr(sqlerrm,1,80);

   insert into general errors values(e_mess);

end;

 

-------

3 SQLPL/SQL

 

插入

declare

 my_sal number(7,2):=3040.55;

 my_ename char(25):='wanda';

 my_hiredate date:='08-SEP-88';

begin

 insert into emp

 (empno,enmae,job,hiredate,sal,deptno)

 values(2741,my_ename,'cab driver',my_hiredate,my_sal,20);

end;

 

刪除

declare

 bad_child_type char(20):='naughty';

begin

 delete from santas_gift_list where

 kid_rating=bad_child_type;

end;

 

事務處理

commit[WORK];

rollback[WORK];

(關鍵字WORK可選,但對命令執行無任何影響)

savepoint 標記名;(保存當前點)

在事務中標記當前點

rollback [WORK] to [SAVEPOINT] 標記名;(回退到當前保存點)

取消savepoint命令以後的全部對數據庫的修改

關鍵字WORKSAVEPOINT爲可選項,對命令執行無任何影響

 

函數

PL/SQL塊中可使用SQL命令的全部函數

insert into phonebook(lastname)value(upper(my_lastname));

select avg(sal) into avg_sal from emp;

 

對於非SQL命令,可以使用大多數個體函數

不能使用聚組函數和參數個數不定的函數,如

x:=sqrt(y);

lastname:=upper(lastname);

age_diff:=months_between(birthday1,birthday2)/12;

 

賦值時的數據類型轉換

4種賦值形式:

變量名:=表達式

insert into 基表名 values(表達式1,表達式2,...);

update 基表名 set 列名=表達式;

select 列名 into 變量名 from ...;

 

數據類型間能進行轉換的有:

char轉成number

number轉成char

char轉成date

date轉成char

 

char_var:=nm_var;

數字型轉換成字符型

date_var:='25-DEC-88';

字符型轉換成日期型

insert into 表名(num_col) values('604badnumber');

錯誤,沒法成功地轉換數據類型

 

-------

4 條件控制

declare

 num_jobs number(4);

begin

 select count(*) into num_jobs from auditions

 where actorid=&&actor_id and called_back='yes';

  ifnum_jobs>100 then

   update actor set actor_rating='word class'

   where actorid=&&actor_id;

 elsif num_job=75 then

   update actor set actor_rating='daytime soaps'

   where actorid=&&actor_id;

 else

   update actor set actor_rating='waiter'

   where actorid=&&actor_id;

  endif;

  endif;

 commit;

end;

 

------

5 循環

語法

loop

......

end loop;

exit;(退出循環)

exit [when];(退出循環,當知足WHEN時)

1

declare

  ctrnumber(3):=0;

begin

 loop

   insert into table1 values('tastes great');

   insert into table2 values('less filling');

   ctr:=ctr+1;

 exit when ctr=100;

  endloop;

end;

(注:若是ctr取爲NULL,循環沒法結束)

 

2

FOR語法

for 變量<範圍> loop

......

end loop;

 

declare

 my_index char(20):='fettucini alfredo';

 bowl char(20);

begin

  formy_index in reverse 21..30 loop

 insert into temp(coll) values(my_index);

  /*循環次數從3021*/

  endloop;

 bowl:=my_index;

end;

跟在in reverse後面的數字必須是從小到大的順序,必須是整數,不能是變量或表達式

 

--------

6 遊標

顯式遊標

 

打開遊標

open <遊標名>

open color_cur;

 

遊標屬性

%notfound

%found

%rowcount

%isopen

fetch my_cur into my_var;

while my_cur %found loop

  (處理數據)

 fetch my_cur into my_var;

 exit when my_cur %rowcount=10;

end loop;

 

%notfound屬性

取值狀況以下:

fetch操做沒有返回記錄,則取值爲true

fetch操做返回一條記錄,則取值爲false

對遊標無fetch操做時,取值爲null

<遊標名> %notfound

if color_cur %notfound then...

注:若是沒有fetch操做,則<遊標名> %notfound將致使出錯,

由於%notfound的初始值爲NULL

 

關閉遊標

close <遊標名>

close color_cur;

 

遊標的FOR循環

語法

for <記錄名> in <遊標名> loop

<一組命令>

end loop;

其中:

索引是創建在每條記錄的值之上的

記錄名沒必要聲明

每一個值對應的是記錄名,列名

初始化遊標指打開遊標

活動集合中的記錄自動完成FETCH操做

退出循環,關閉遊標

 

隱式遊標

隱式遊標是指SQL命令中用到的,沒有明肯定義的遊標

insert,update,delete,select語句中沒必要明肯定義遊標

調用格式爲SQL%

存貯有關最新一條SQL命令的處理信息

 

隱式遊標的屬性

隱式遊標有四個屬性

SQL%NOTFOUND

SQL%FOUND

SQL%ROWCOUNT:隱式遊標包括的記錄數

例:

delete from baseball_team wherebatting_avg<100;

if sql%rowcount>5 thn

 insert into temp

 values('your team needs help');

end if;

 

SQL%ISOPEN:取值總爲FALSESQL命令執行完畢,PL/SQL當即關閉隱式遊標。

 

 

7 標號

GOTO語句

用法:

goto you_are_here;

其中you_are_here是要跳轉的語句標號

標號必須在同一組命令,或是同一塊中使用

 

正確的使用

<>(標號)

x:=x+1

if a>b then

b:=b+c;

goto dinner;

end if;

 

錯誤的使用

goto jail;

if a>b then

b:=b+c;

<>(標號)

x:=x+1;

end if;

 

標號:解決意義模糊

標號可用於定義列值的變量

<>

declare

deptno number:=20;

begin

 update emp set sal=sal*1.1

 where deptno=sample.deptno;

 commit;

end sample;

若是不用標號和標號限制符,這條命令將修改每條記錄。

 

--------

8 異常處理

預約義的異常狀況

任何ORACLE錯誤都將自動產生一個異常信息

一些異常狀況已命名,如:

no_data_found SELECT語句無返回記錄時產生

too_many_rows 沒有定義遊標,而SELECT語句返回多條記錄時產生

whenever notfound 無對應的記錄

 

用戶定義的異常狀況

由用戶本身獲取

DECLARE部分定義:

declare

  x number;

 something_isnt_right exception;

用戶定義的異常狀況遵循通常的做用範圍規則

條件知足時,獲取異常狀況:raise something_isnt_right

注意:一樣能夠獲取預約義的異常狀況

 

exception_init語句

容許爲ORACLE錯誤命名

 

調用格式:

pragma exception_init(<表達式>,);

declare

 deadlock_detected exception;

 pragma exception_init(deadlock_detected,-60);

 

raise語句

單獨使用RAISE命令,可再一次獲取當前的異常狀況(就象異常狀況被重複處理了同樣)。

在異常處理中,此語句只能單獨使用。

 

異常處理標識符

一組用於處理異常狀況的語句:

exception

 when <表達式> or [表達式...] then

 <一組語句>

  ...

 when others then--最後一個處理

 <一組語句>

end;既結束PL/SQL塊部分,也結束異常處理部分

 

------

練習與答案

1:

接收contract_noitem_no值,在inventory表中查找,若是產品:

已發貨,在arrival_date中賦值爲今天后的7

已定貨,在arrival_date中賦值爲今天后的一個月

既無定貨又無發貨,則在arrival_date中賦值爲今天后的兩個月,

並在order表中增長一條新的訂單記錄。

 

product_status的列值爲'shipped''ordered'

 

inventory:

product_id number(6)

product_description char(30)

product_status char(20)

std_shipping_qty number(3)

 

contract_item:

contract_no number(12)

item_no number(6)

arrival_date date

 

order:

order_id number(6)

product_id number(6)

qty number(3)

 

答案:

declare

i_product_id inventory.product_id%type;

i_product_descriptioninventory.product_description%type;

i_product_statusinventory.product_status%type;

i_std_shipping_qtyinventory.std_shipping_qty%type;

 

begin

 select product_id,product_description,product_status,std_shipping_qty

 into i_product_id,i_product_description,

      i_product_status,i_std_shipping_qty

 from inventory

 where product_id=(

   select product_id

   from contract_item

   where contract_no=&&contractno and item_no=&&itemno);

  ifi_product_status='shipped' then

   update contract_item

   set arrival_date=sysdate+7

   where item_no=&&itemno and contract_no=&&contractno;

 elsif i_product_status='ordered' then

     update contract_item

     set arrival_date=add_months(sysdate,1)

     where item_no=&&itemno and contract_no=&&contractno;

   else

     update contract_item

     set arrival_date=add_months(sysdate,2)

     where item_no=&&itemno and contract_no=&&contractno;

     insert into orders

     values(100,i_product_id,i_std_shipping_qty);

   end if;

  endif;

 commit;

end;

 

 

2:

1.找出指定部門中的全部僱員

2.用帶'&'的變量提示用戶輸入部門編號

3.把僱員姓名及工資存入prnttable表中,基結構爲:

create table prnttable

(seq number(7),line char(80));

4.異常狀況爲,部門中獎金不爲空值的僱員信息才能存入prnttable表中。

 

答案:

declare

cursor emp_cur is

 select ename,sal,comm

 from emp where deptno=&dno;

emp_rec emp_cur%rowtype;

null_commission exception;

begin

 open emp_cur;

 fetch emp_cur into emp_rec;

 while (emp_cur%found) loop

   if emp_rec.comm is null then

   begin

   close emp_cur;

   raise null_commission;

   end;

   end if;

 fetch emp_cur into emp_rec;

  endloop;

 close emp_sur;

 exception

   when null_commission then

     open emp_cur;

     fetch emp_cur into emp_rec;

     while (emp_cur%found) loop

       if emp_rec.comm is not null then

         insert into temp values(emp_rec.sal,emp_rec.ename);

       end if;

       fetch emp_cur into emp_rec;

     end loop;

     close emp_cur;

     commit;

end

 

第一課:客戶端  

       1. Sql Plus(客戶端),命令行直接輸入:sqlplus,而後按提示輸入用戶名,密碼。  

       2. 從開始程序運行:sqlplus,是圖形版的sqlplus.  

       3. http://localhost:5560/isqlplus  

          

        Toad:管理, PlSqlDeveloper:  

 

 

第二課:更改用戶  

       1. sqlplus sys/bjsxt as sysdba  

       2. alter user scott account unlock;(解鎖)  

 

第三課:table structure  

          

       1. 描述某一張表:desc 表名  

       2. select * from 表名  

第四課:select 語句:  

 

      1.計算數據能夠用空表:好比:.select 2*3 from dual  

 

      2.select ename,sal*12 annual_sal from emp;select ename,sal*12"annual sal" from emp;區別,加雙引號保持原大小寫。不加全變大寫。  

         

      3. select ename || "abcd" 若是鏈接字符串中含有單引號,用兩個單引號代替一個單引號。  

 

第五課:distinct  

       select deptno from emp;  

       select distinct deptno from emp;  

 

       select distinct deptno from emp;  

       select distinct deptno ,job from emp  

       去掉deptno,job二者組合的重複。更多的項,就是這麼多項的組合的不重複組合。  

第六課:Where  

       select * from emp where deptno =10;  

       select * from emp where deptno <>10;不等於10          

       select * from emp where ename ='bike';  

       select ename,sal from emp where sal between 800 and 1500 (>=800 and<=1500)  

       空值處理:  

       select ename,sal,comm from emp where comm is (not) null;  

       select ename,sal,comm from emp where ename ( not)in('smith','king','abc');  

       select ename from emp where ename like '_A%';_表明一個字母,%表明0個或多個字母. 若是查詢%  

        可用轉義字符.\%. 還能夠用escape'$'好比:select ename from emp where ename like '%$a%' escape '$';  

 

第七課: orderby  

          

        select * from dept;   

        select * from dept order by dept desc;(默認:asc)  

        select ename,sal,deptno from emp order by deptno asc,ename desc;  

 

第八課: sql function1:      

       select ename,sal*12 annual_sal from emp  

       where ename not like '_A%' and sal>800 

       order by sal desc;  

 

       select lower(ename) from emp;  

 

       select ename from emp   

       where lower(ename) like '_a%';等同於  

       select ename from emp where ename like '_a%' or ename like '_A%';  

 

       select substr(ename,2,3) from emp;從第二字符截,一共截三個字符.  

       select chr(65) from dual 結果爲:A  

       select ascii('a') from dual 結果爲:65 

       select round(23.652,1) from dual; 結果爲: 23.7 

       select round(23.652,-1) from dual; 20 

    

       select to_char(sal,'$99_999_999') from emp;  

       select to_char(sal,'L99_999_999') from emp;人民幣符號,L:表明本地符號  

 

       這個須要掌握牢:  

       select birthdate from emp;  

       顯示爲:  

       BIRTHDATE  

       ----------------  

       17-12-80 

       ----------------  

 

       改成:  

       select to_char(birthdate,'YYYY-MM-DD HH:MI:SS') from emp;  

          

       顯示:  

           

       BIRTHDATE  

       -------------------  

       1980-12-17 12:00:00 

       -------------------  

          

       select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; //也能夠改成:HH12  

       TO_CHAR(SYSDATE,'YY  

       -------------------  

       2007-02-25 14:46:14 

          

 

       to_date函數:  

       select ename,birthdate from emp where birthdate > to_date('1981-2-2012:34:56','YYYY-MM-DD HH24:MI:SS');  

       若是直接寫 birthdate>'1981-2-20 12:34:56'會出現格式不匹配,由於表中的格式爲:DD-MM-YY.  

    

          

       select sal from emp where sal>888.88 無錯.  

       select sal from emp where sal>$1,250,00;  

       會出現無效字符錯誤.   

       改成:  

       select sal from emp wheresal>to_number('$1.250.00','$9,999,99');  

          

       把空值改成0 

       select ename,sal*12+nvl(comm,0) from emp;  

       這樣能夠防止comm爲空時,sal*12相加也爲空的狀況.  

 

 

第九課: Group function 組函數  

       max,min,avg ,count,sum函數  

          

       select to_char(avg(sal),'99999999,99') from emp;  

          

          

       select round(avg(sal),2) from emp;  

       結果:2073.21 

            

       select count(*) from emp where deptno=10;  

       select count(ename) from emp where deptno=10; count某個字段,若是這個字段不爲空就算一個.  

       select count(distinct deptno) from emp;  

       select sum(sal) from emp;  

 

第十課: Group by語句  

          

       需求:如今想求,求每一個部門的平均薪水.  

       select avg(sal) from emp group by deptno;  

       select deptno avg(sal) from emp group by deptno;  

          

       select deptno,job,max(sal) from emp group by deptno,job;  

          

      求薪水值最高的人的名字.  

      select ename,max(sal) from emp;出錯,由於max只有一個值,但等於max值的人可能好幾個,不能匹配.  

      應以下求:  

      select ename from emp where sal=(select max(sal) from emp);  

 

      Group by語句應注意,  

 

      出如今select中的字段,若是沒出如今組函數中,必須出如今Group by語句中.  

          

      

  第十一課: Having 對分組結果篩選  

         

      Where是對單條紀錄進行篩選,Having是對分組結果進行篩選.  

        

      select avg(sal),deptno from emp   

      group by deptno   

      having avg(sal)>2000;  

         

      查詢工資大於1200僱員,按部門編號進行分組,分組後平均薪水大於1500,按工薪倒充排列.  

      select * from emp   

      where sal>1200 

      group by deptno  

      having avg(sal)>1500 

      order by avg(sal) desc;  

          

   第十二課:字查詢  

         

      誰掙的錢最多(:這我的的名字,  錢最多)  

         

      select 語句中嵌套select 語句,能夠在where,from.  

         

               

      問那些人工資,在平均工資之上.  

         

      select ename,sal from emp where sal>(select avg(sal) from emp);  

 

 

      查找每一個部門掙錢最多的那我的的名字.  

      select ename ,deptno from emp where sal in(select max(sal) from enamegroup by deptno) 查詢會多值.  

 

      應該以下:  

         

      select  max(sal),deptno from empgroup by deptno;當成一個表.語句以下:  

      select ename, sal from emp join(select max(sal) max_sal,deptno from emp group  

      by deptno) t on(emp.sal=t.max_sal and emp.deptno=t.deptno);   

         

      每一個部門的平均薪水的等級.   

      分析:首先求平均薪水(當成表),把平均薪水和另一張錶鏈接.  

         

         

第十四課:self_table_connection  

         

      把某我的的名字以及他的經理人的名字求出來(經理人及這我的在表中同處一行)  

         

      分析:首先求出這我的的名字,取他的編號,而後從另外一張表與其相對應編號,而後找到經理的名字.  

         

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

         

      empno編號和MGR都是編號.  

 

 

第十15: SQL1999_table_connections      

           

     select ename,dname,grade from emp e,dept d, sqlgrade s  

     where e.deptno = d.deptno and e.sql between s.losal and s.hisal and  

     job<>'CLERK';  

        

     有沒有辦法把過濾條件和鏈接條件分開來? 出於這樣考慮,Sql1999標準推出來了.有許多人用的仍是  

     舊的語法,因此得看懂這種語句.  

        

        

        

     select ename,dname from emp,dept;(舊標準).  

     select ename,dname from emp cross join dept;(1999標準)  

         

     select ename,dname from emp,dept where emp.deptno=dept.deptno ()   

     select ename,dname from emp join dept on(emp.deptno = dept.deptno); 1999標準.沒有Where語句.  

     select ename,dname from emp join dept using(deptno);等同上句,但不推薦使用.  

        

     select ename,grade from emp e join salgrade s on(e.sal between s.losaland s.hisal);  

     join 鏈接語句, on過濾條件。鏈接,條件一眼分開。若是用Where語句較長時,鏈接語句和過濾語句混在一塊兒。  

        

     三張錶鏈接:  

     slect ename,dname, grade from   

     emp e join dept d on(e.deptno=d.deptno)  

     join salgrade s on(e.sal between s.losal and s.hisal)  

     where ename not like '_A%';  

     把每張錶鏈接條件不混在一塊兒,而後數據過濾條件所有區分開來。讀起來更清晰,更容易懂一點。  

        

     select e1.ename,e2.ename from emp e1 join emp e2 on(e1.mgr =e2.emptno);  

 

     左外鏈接:會把左邊這張表多餘數據顯示出來。  

     select e1.ename,e2,ename from emp e1 left join emp e2 on(e1.mgr=e2.empno);left 後可加outer  

     右外鏈接:  

   select ename,dname from emp e right outer join dept d on(e.deptno=d.deptno); outer能夠取掉。  

          

      即把左邊多餘數據,也把右邊多餘數據拿出來,全外鏈接。  

     select ename,dname from emp e full join dept d on(e.deptno=d.deptno);   

 

 

16-23 課:求部門平均薪水的等級  

 

      A.求部門平均薪水的等級。  

 

      select deptno,avg_sal,grade from   

      (select deptno,avg(sal) avg_sal from emp group by deptno)t  

      join salgrade s on(t.avg_sal between s.losal and s.hisal)  

         

      B.求部門平均的薪水等級  

      select deptno,avg(grade) from   

      (select deptno,ename, grade from emp join salgrade s on(emp.sal betweens.losal and  

      s.hisal)) t  

      group by deptno  

 

      C.那些人是經理  

      select ename from emp where empno in(select mgr from emp);  

      select ename from emp where empno in(select distinct mgr from emp);  

         

      D.不許用組函數,求薪水的最高值(面試題)  

         

      select distinct sal from emp where sal not in(  

      select distinct e1.sal from emp e1 join emp e2 on(e1.sal<e2.sal));  

###########################################

內鏈接(INNER JOIN

 

內鏈接(INNER JOIN):有兩種,顯式的和隱式的,返回鏈接表中符合鏈接條件和查詢條件的數據行。(所謂的連接表就是數據庫在作查詢造成的中間表)。

 

例如:下面的語句3和語句4的結果是相同的。

語句3:隱式的內鏈接,沒有INNER JOIN,造成的中間表爲兩個表的笛卡爾積。

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME

FROM CUSTOMERS C,ORDERS O

WHERE C.ID=O.ID;

 

語句4:顯示的內鏈接,通常稱爲內鏈接,有INNER JOIN,造成的中間表爲兩個表通過ON條件過濾後的笛卡爾積。

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME

FROM CUSTOMERS C INNER JOIN ORDERS O ONC.ID=O.ID;

語句3和語句4的查詢結果相同

 

#####################################################

         

      E.平均薪水最高的部門編號  

         

      select deptno,avg_sal from  

      (select avg(sal)avg_sal,deptno from emp group by deptno)  

      where avg_sal=  

      (select max(avg_sal)from   

      (select avg(sal) avg_sal,deptno from emp group by deptno)  

      )  

        

      F.平均薪水最高的部門名稱  

      select dname from dept where deptno=  

     (   

       select deptno from  

       (select avg(sal)avg_sal,deptno from emp group by deptno)  

       where avg_sal=  

       (select max(avg_sal)from   

       (select avg(sal) avg_sal,deptno from emp group by deptno)  

       )  

      )  

        

     G.求平均薪水的等級最低的部門的部門名稱  

          

       組函數嵌套  

       如:平均薪水最高的部門編號,能夠E.更簡單的方法以下:  

       select deptno,avg_sal from   

       (select avg(sal) avg_sal,deptno from emp group by deptno)  

       where avg_sal =  

       (select max(avg(sal)) from emp group by deptno)  

          

       組函數最多嵌套兩層  

          

       分析:  

       首先求  

       1.平均薪水: select avg(sal) from group by deptno;  

 

       2.平均薪水等級:  把平均薪水當作一張表,須要和另一張錶鏈接salgrade  

       select  deptno,grade avg_salfrom   

         ( select deptno,avg(sal) avg_sal from emp group by deptno) t  

       join salgrade s on(t.avg_sal between s.losal and s.hisal)  

          

        上面結果又可當成一張表。  

          

       DEPTNO    GRADE    AVG_SAL  

     --------  -------  ----------  

       30           3   1566.66667 

       20           4   2175 

       10           4   2916.66667 

 

       3.求上表平均等級最低值  

          

       select min(grade) from  

       (  

         select deptno,grade,avg_sal from  

          (select deptno,avg(sal) avg_sal from emp group by deptno)t  

         join salgrade s on(t.avg_sal between s.losal and s.hisa)  

        )  

 

        4.把最低值對應的2結果的那張表的對應那張表的deptno,而後把2對應的表和另一張表作鏈接。  

            

         select dname ,deptno,grade,avg_sal from  

           (  

         select deptno,grade,avg_sal from  

              (select deptno,avg(sal) avg_salfrom emp group by deptno)t  

            join salgrade s on(t.avg_sal between s.losal and s.hisal)  

            ) t1  

           join dept on (t1.deptno = dept.deptno)  

           where t1.grade =  

           (   

              select deptno,grade,avg_salfrom  

               (select deptno,avg(sal) avg_salfrom emp group by deptno) t  

                join salgrade s on(t.avg_salbetween s.losal and s.hisal)  

               )  

           )  

        結果以下:  

           

       DNAME    DEPTNO     GRADE   AVG_SAL  

     --------  -------  --------  --------  

       SALES        30        3   1566.6667   

       

           

      H: 視圖(視圖就是一張表,一個字查詢)  

          

      G中語句有重複,能夠用視圖來簡化。  

      conn sys/bjsxt as sysdba;  

      grant create table,create view to scott;  

      conn scott/tiger  

      建立視圖:  

      create view v$_dept_avg-sal_info as  

      select deptno,grade,avg_sal from  

       ( select deptno,avg(sal) avg_sal from emp group by deptno)t  

      join salgrade s on 9t.avg_sal between s.losal and s.hisal)  

        

      而後   

      select * from v$_dept_avg-sal_info  

         

      結果以下:  

      DEPTNO      GRADE    AVG_SAL  

     --------  -------  ----------  

       30           3   1566.66667 

       20           4   2175 

       10           4   2916.66667 

 

      而後G中查詢能夠簡化成:  

      select dname,t1.deptno,grade,avg_sal from  

      v$_dept_avg-sal_info t1  

      join dept on 9t1.deptno =dept.deptno)  

      where t1.grade=  

      (  

   select min(grade) from v$_dept_avg-sal_info t1  

      )   

 

 

 

--desc 表名 描述表的內容     

desc emp;  

 

--加上數學表達式和列名  ""保持格式  

select ename "name space", sal*12year_sal from emp;      

 

select 2*3 from dual;  

 

select sysdate from dual;  

 

--空值的數學表達式 結果都是空值  

select ename, sal*12 + comm from emp;     

 

--"||"字符串鏈接 單引號中的是字符串,字符串中的單引號,''表示  

select ename||sal from emp;       

 

--distinct 修飾兩個字段  

select distinct deptno, job from emp;  

 

select ename, sal from emp where salbetween 800 and 1500;  

select ename, sal from emp where sal >=800 and sal <= 1500;  

 

select ename, sal from emp where comm isnull;  

 

 

--一個事務開始於一條ddl語句,結束語rollbackcommit ddl數據定義語句 dcl數據控制語句語句  

--正常斷開鏈接 提交 非正常斷開鏈接 回滾  

 

select ename, sal from emp where sal not in(800 ,1500);  

 

-- 模糊查詢  

select ename, sal from emp where ename like'_A%';  

select ename, sal from emp where ename like'%\%%';  

 

--轉義字符  

select ename, sal from emp where ename like'%$%%' escape '$';  

 

--排序  

select * from dept order by deptnodesc;  

select ename, sal from emp order by deptnoasc, ename desc;  

 

--函數  

select lower(ename) from emp;  

select substr(ename,1,3) from emp;  

select round(23.652, 1) from dual;  

select to_char(sal, '$99,999.999') fromemp;  

select to_char(sal, 'L000,000.000') fromemp;  

select to_char(hiredate, 'yyyy-mm-dd hh:mi:ss')from emp;  

select to_char(sysdate, 'yyyy-mm-ddhh24:mi:ss') from dual;  

select ename, hiredate from emp  

   where hiredate > to_date('1982-09-11 12:44:44', 'YYYY-MM-DDHH24:MI:SS');  

select sal from emp where sal >to_number('$1,250.000', '$9,999.000');  

select ename,sal*12 + nvl(comm, 0) fromemp;  

 

--組函數  多行輸入,只有一行輸出 selectename, max(sal) from emp; 結果不能保證只有一行  

select max(sal) from emp;  

select sum(sal) from emp;  

select count(distinct deptno) fromemp;  

 

--分組函數  

select deptno,avg(sal) from emp group bydeptno;  

select deptno, job, max(sal) from emp groupby deptno, job;  

 

--出如今select後,不是組函數的,必須出如今group by  

--where語句對單挑記錄進行過濾,分組後過濾用having  

 

--子查詢 把一次查詢結果當成表  

select ename from emp where sal = (selectmax(sal) from emp);  

select ename, sal from emp  

   join (select max(sal)max_sal, deptno from emp group) t  

   on(t.max_sal = emp.sal and t.deptno = emp.deptno);  

 

--自鏈接  

select t1.ename, t2.ename from emp t1, empt2 where t1.mgr = t2.empno;  

 

 

select ename, dname, grade from emp e, deptd, salgrade s where e.deptno = d.deptno and   

 

e.sal between 

s.losal and s.hisal and job <>'CLERK';  

 

--SQL 1999 連接條件不寫在where中,where只負責過濾數據  

select ename, dname from emp cross joindept;  

select ename, dname from emp join dept on(emp.deptno = dept.deptno);  

select ename, dname from emp join deptusing (deptno)  

 

select ename, grade from emp e joinsalgrade s on (e.sal between s.losal and s.hisal);  

select e1.ename, e2.ename from emp e1 joinemp e2 on (e1.mgr = e2.empno);  

 

--左外鏈接  

select e1.ename, e2.ename from emp e1 leftjoin emp e2 on (e1.mgr = e2.empno);  

--右外鏈接  

select ename, dname from emp e right joindept d on (e.deptno = d.deptno);  

select ename, dname from emp e full outerjoin dept d on (e.deptno = d.deptno);  

 

--求部門中那些人薪水最高  

select ename, sal  from emp   

join (select deptno, max(sal) max_sal fromemp group by deptno) t   

on (emp.sal = t.max_sal and emp.deptno =t.deptno);  

 

--求部門平均薪水的等級  

select deptno, grade from salgrade s   

join (select avg(sal) avg_sal, deptno fromemp group by deptno) t   

on (avg_sal between losal and hisal);  

 

--求平均薪水最高的部門的部門標號  

select deptno, avg_sal from 

(select avg(sal) avg_sal, deptno from empgroup by deptno)  

where avg_sal =  

(select max(avg(sal)) from emp group bydeptno);  

 

--平均薪水的等級最低的部門的部門名稱  

select dname, t1.deptno, grade, avg_salfrom 

( select deptno, grade, avg_sal from 

 (select deptno, avg(sal) avg_sal from emp group by deptno) t  

 join salgrade s on (t.avg_sal between s.losal and s.hisal)  

) t1  

join dept on (t1.deptno = dept.deptno)  

where t1.grade =   

(  

 select min(grade) from 

 (  select deptno, grade, avg_salfrom 

   (select deptno, avg(sal) avg_sal from emp group by deptno) t  

   join salgrade s on (t.avg_sal between s.losal and s.hisal)  

 )  

)  

 

--創建視圖  

create view v$_dept_avg_sal_info as 

select deptno, grade, avg_sal from 

 (select deptno, avg(sal) avg_sal from emp group by deptno) t  

join salgrade s on (t.avg_sal betweens.losal and s.hisal);  

 

--變簡單了  

select dname, t1.deptno, grade, avg_salfrom 

v$_dept_avg_sal_info t1  

join dept on (t1.deptno = dept.deptno)  

where t1.grade =   

(  

 select min(grade) from v$_dept_avg_sal_info  

)  

 

--求部門平均薪水的等級  

select deptno, avg_sal, grade from 

 (select avg(sal) avg_sal, deptno from emp group by deptno)  

join salgrade s   

on (avg_sal between s.losal ands.hisal);  

 

--求部門平均的薪水等級  

select avg(grade), deptno from 

(  

 select deptno, ename, grade from emp  

 join salgrade s  

  onemp.sal between s.losal and s.hisal  

)   

group by deptno  

 

--僱員中有哪些人是經理人  

select ename from emp where empno in 

(select distinct mgr from emp);  

 

--不使用組函數,求薪水的最高值  

select distinct sal from emp where sal notin 

(select distinct e1.sal from emp e1 joinemp e2 on (e1.sal < e2.sal));  

 

--平均薪水最高的部門的部門名稱  

select dname from dept where deptno =  

(  

 select deptno from 

   (select avg(sal) avg_sal, deptno from emp group by deptno)  

 where avg_sal =  

 (select max(avg_sal) from 

   (select avg(sal) avg_sal, deptno from emp group by deptno)  

 )  

)  

 

--求比普通員工的最高薪水還要高的經理人名稱  

select ename from emp   

where empno in (select distinct mgr fromemp where mgr is not null) and sal >  

(  

 select max(sal) from emp where empno not in 

 (select distinct mgr from emp where mgr is not null)  

)  

 

--rownum只能和小於等於號聯合使用  

--使用rownum 要關聯表  

select ename from 

(select rownum r, ename from emp) where r> 10;  

 

--薪水最高的5我的  

select ename, sal from 

(select ename, sal from emp order by saldesc)  

where rownum <= 5;  

 

--薪水最高的第六個到第十個僱員  

select ename, sal from 

 (  

 select ename, sal, rownum r from 

   (select ename, sal from emp order by sal desc)  

 )  

where r >= 6 and r <= 10  

 

 

--http://penghao122.javaeye.com/blog/54810  

--SQL面試題  

--找出沒選過「黎明」老師的全部學生姓名。   

select sname from s   

join sc on (sc.sno = s.sno)  

join c on (c.cno = s.cno)   

where c.cteacher <> 'liming';  

 

--列出2門以上(含2門)不及格學生姓名及平均成績。   

select sname where sno in   

 (  

 select sno from sc where scgrade < 60  

 group by sno having count(*) >= 2  

 )  

 

--即學過1號課程有學過2號課全部學生的姓名  

select sno from sc where cno = 1 and snoin 

(  

 select sno from sc where cno = 2  

);  

 

--一個事務開始於一條ddl語句,結束語rollbackcommit ddl數據定義語句 dcl數據控制語句語句  

--正常斷開鏈接 提交 非正常斷開鏈接 回滾 

 

--desc 表名 描述表的內容  

desc emp;

 

--加上數學表達式和列名  ""保持格式

select ename "name space", sal*12year_sal from emp;   

 

select 2*3 from dual;

 

select sysdate from dual;

 

--空值的數學表達式 結果都是空值

select ename, sal*12 + comm from emp;  

 

--"||"字符串鏈接 單引號中的是字符串,字符串中的單引號,''表示

select ename||sal from emp;    

 

--distinct 修飾兩個字段

select distinct deptno, job from emp;

 

select ename, sal from emp where salbetween 800 and 1500;

select ename, sal from emp where sal >=800 and sal <= 1500;

 

select ename, sal from emp where comm isnull;

 

 

--一個事務開始於一條ddl語句,結束語rollbackcommit ddl數據定義語句 dcl數據控制語句語句

--正常斷開鏈接 提交 非正常斷開鏈接 回滾

 

select ename, sal from emp where sal not in(800 ,1500);

 

-- 模糊查詢

select ename, sal from emp where ename like'_A%';

select ename, sal from emp where ename like'%\%%';

 

--轉義字符

select ename, sal from emp where ename like'%$%%' escape '$';

 

--排序

select * from dept order by deptno desc;

select ename, sal from emp order by deptnoasc, ename desc;

 

--函數

select lower(ename) from emp;

select substr(ename,1,3) from emp;

select round(23.652, 1) from dual;

select to_char(sal, '$99,999.999') fromemp;

select to_char(sal, 'L000,000.000') fromemp;

select to_char(hiredate, 'yyyy-mm-ddhh:mi:ss') from emp;

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

select ename, hiredate from emp

   where hiredate > to_date('1982-09-11 12:44:44', 'YYYY-MM-DDHH24:MI:SS');

select sal from emp where sal >to_number('$1,250.000', '$9,999.000');

select ename,sal*12 + nvl(comm, 0) fromemp;

 

--組函數  多行輸入,只有一行輸出 select ename, max(sal) from emp; 結果不能保證只有一行

select max(sal) from emp;

select sum(sal) from emp;

select count(distinct deptno) from emp;

 

--分組函數

select deptno,avg(sal) from emp group bydeptno;

select deptno, job, max(sal) from emp groupby deptno, job;

 

--出如今select後,不是組函數的,必須出如今group by

--where語句對單挑記錄進行過濾,分組後過濾用having

 

--子查詢 把一次查詢結果當成表

select ename from emp where sal = (selectmax(sal) from emp);

select ename, sal from emp

   join (select max(sal)max_sal, deptno from emp group) t

   on(t.max_sal = emp.sal and t.deptno = emp.deptno);

 

--自鏈接

select t1.ename, t2.ename from emp t1, empt2 where t1.mgr = t2.empno;

 

 

select ename, dname, grade from emp e, deptd, salgrade s where e.deptno = d.deptno and

 

e.sal between

s.losal and s.hisal and job <>'CLERK';

 

--SQL 1999 連接條件不寫在where中,where只負責過濾數據

select ename, dname from emp cross joindept;

select ename, dname from emp join dept on(emp.deptno = dept.deptno);

select ename, dname from emp join deptusing (deptno)

 

select ename, grade from emp e joinsalgrade s on (e.sal between s.losal and s.hisal);

select e1.ename, e2.ename from emp e1 joinemp e2 on (e1.mgr = e2.empno);

 

--左外鏈接

select e1.ename, e2.ename from emp e1 leftjoin emp e2 on (e1.mgr = e2.empno);

--右外鏈接

select ename, dname from emp e right joindept d on (e.deptno = d.deptno);

select ename, dname from emp e full outerjoin dept d on (e.deptno = d.deptno);

 

--求部門中那些人薪水最高

select ename, sal  from emp

join (select deptno, max(sal) max_sal fromemp group by deptno) t

on (emp.sal = t.max_sal and emp.deptno =t.deptno);

 

--求部門平均薪水的等級

select deptno, grade from salgrade s

join (select avg(sal) avg_sal, deptno fromemp group by deptno) t

on (avg_sal between losal and hisal);

 

--求平均薪水最高的部門的部門標號

select deptno, avg_sal from

(select avg(sal) avg_sal, deptno from empgroup by deptno)

where avg_sal =

(select max(avg(sal)) from emp group bydeptno);

 

--平均薪水的等級最低的部門的部門名稱

select dname, t1.deptno, grade, avg_salfrom

( select deptno, grade, avg_sal from

 (select deptno, avg(sal) avg_sal from emp group by deptno) t

 join salgrade s on (t.avg_sal between s.losal and s.hisal)

) t1

join dept on (t1.deptno = dept.deptno)

where t1.grade =

(

 select min(grade) from

 (  select deptno, grade, avg_salfrom

    (select deptno, avg(sal) avg_sal from empgroup by deptno) t

   join salgrade s on (t.avg_sal between s.losal and s.hisal)

  )

)

 

--創建視圖

create view v$_dept_avg_sal_info as

select deptno, grade, avg_sal from

 (select deptno, avg(sal) avg_sal from emp group by deptno) t

join salgrade s on (t.avg_sal betweens.losal and s.hisal);

 

--變簡單了

select dname, t1.deptno, grade, avg_salfrom

v$_dept_avg_sal_info t1

join dept on (t1.deptno = dept.deptno)

where t1.grade =

(

 select min(grade) from v$_dept_avg_sal_info

)

 

--求部門平均薪水的等級

select deptno, avg_sal, grade from

 (select avg(sal) avg_sal, deptno from emp group by deptno)

join salgrade s

on (avg_sal between s.losal and s.hisal);

 

--求部門平均的薪水等級

select avg(grade), deptno from

(

 select deptno, ename, grade from emp

 join salgrade s

  onemp.sal between s.losal and s.hisal

)

group by deptno

 

--僱員中有哪些人是經理人

select ename from emp where empno in

(select distinct mgr from emp);

 

--不使用組函數,求薪水的最高值

select distinct sal from emp where sal notin

(select distinct e1.sal from emp e1 joinemp e2 on (e1.sal < e2.sal));

 

--平均薪水最高的部門的部門名稱

select dname from dept where deptno =

(

 select deptno from

   (select avg(sal) avg_sal, deptno from emp group by deptno)

 where avg_sal =

 (select max(avg_sal) from

   (select avg(sal) avg_sal, deptno from emp group by deptno)

  )

)

 

--求比普通員工的最高薪水還要高的經理人名稱

select ename from emp

where empno in (select distinct mgr fromemp where mgr is not null) and sal >

(

 select max(sal) from emp where empno not in

 (select distinct mgr from emp where mgr is not null)

)

 

--rownum只能和小於等於號聯合使用

--使用rownum 要關聯表

select ename from

(select rownum r, ename from emp) where r> 10;

 

--薪水最高的5我的

select ename, sal from

(select ename, sal from emp order by saldesc)

where rownum <= 5;

 

--薪水最高的第六個到第十個僱員

select ename, sal from

  (

 select ename, sal, rownum r from

   (select ename, sal from emp order by sal desc)

  )

where r >= 6 and r <= 10

 

 

--http://penghao122.javaeye.com/blog/54810

--SQL面試題

--找出沒選過「黎明」老師的全部學生姓名。

select sname from s

join sc on (sc.sno = s.sno)

join c on (c.cno = s.cno)

where c.cteacher <> 'liming';

 

--列出2門以上(含2門)不及格學生姓名及平均成績。

select sname where sno in

  (

 select sno from sc where scgrade < 60

  groupby sno having count(*) >= 2

  )

 

--即學過1號課程有學過2號課全部學生的姓名

select sno from sc where cno = 1 and sno in

(

 select sno from sc where cno = 2

);

 

--一個事務開始於一條ddl語句,結束語rollbackcommit ddl數據定義語句 dcl數據控制語句語句

--正常斷開鏈接 提交 非正常斷開鏈接 回滾

 

 

 

 

送上mysql中的,oracle默認表(emp,dept, salgrade)的建表語句

 

Sql代碼

CREATE TABLE EMP  

      (EMPNO numeric(4) NOT NULL,  

       ENAME VARCHAR(10),  

       JOB VARCHAR(9),  

       MGR numeric(4),  

       HIREDATE DATE,  

       SAL numeric(7, 2),  

        COMM numeric(7, 2),  

       DEPTNO numeric(2));  

 

INSERT INTO EMP VALUES 

       (7369, 'SMITH',  'CLERK',     7902,  

       '1980-12-17',  800, NULL,20);  

INSERT INTO EMP VALUES 

       (7499, 'ALLEN',  'SALESMAN',  7698,  

       '1981-11-20', 1600,  300,30);  

INSERT INTO EMP VALUES 

       (7521, 'WARD',   'SALESMAN',  7698,  

       '1981-02-22', 1250,  500,30);  

INSERT INTO EMP VALUES 

       (7566, 'JONES',  'MANAGER',   7839,  

       '1981-04-02',  2975, NULL,20);  

INSERT INTO EMP VALUES 

       (7654, 'MARTIN', 'SALESMAN', 7698,  

       '1981-09-28', 1250, 1400, 30);  

INSERT INTO EMP VALUES 

       (7698, 'BLAKE',  'MANAGER',   7839,  

       '1981-05-01',  2850, NULL,30);  

INSERT INTO EMP VALUES 

       (7782, 'CLARK',  'MANAGER',   7839,  

       '1981-01-09',  2450, NULL,10);  

INSERT INTO EMP VALUES 

       (7788, 'SCOTT',  'ANALYST',   7566,  

       '1982-12-09', 3000, NULL, 20);  

INSERT INTO EMP VALUES 

       (7839, 'KING',   'PRESIDENT',NULL,  

       '1981-11-07', 5000, NULL, 10);  

INSERT INTO EMP VALUES 

       (7844, 'TURNER', 'SALESMAN', 7698,  

       '1981-09-08',  1500,    0, 30);  

INSERT INTO EMP VALUES 

       (7876, 'ADAMS',  'CLERK',     7788,  

       '1983-01-12', 1100, NULL, 20);  

INSERT INTO EMP VALUES 

       (7900, 'JAMES',  'CLERK',     7698,  

       '1981-11-03',   950, NULL,30);  

INSERT INTO EMP VALUES 

       (7902, 'FORD',   'ANALYST',   7566,  

       '1981-12-03',  3000, NULL,20);  

INSERT INTO EMP VALUES 

       (7934, 'MILLER', 'CLERK',    7782,  

       '1982-01-12', 1300, NULL, 10);  

 

 

CREATE TABLE DEPT  

      (DEPTNO numeric(2),  

       DNAME VARCHAR(14),  

       LOC VARCHAR(13) );  

 

INSERT INTO DEPT VALUES (10, 'ACCOUNTING','NEW YORK');  

INSERT INTO DEPT VALUES (20,'RESEARCH',   'DALLAS');  

INSERT INTO DEPT VALUES (30, 'SALES',      'CHICAGO');  

INSERT INTO DEPT VALUES (40, 'OPERATIONS','BOSTON');  

 

CREATE TABLE BONUS  

       (ENAME VARCHAR(10),  

        JOB   VARCHAR(9),  

        SAL   numeric,  

        COMM  numeric);  

 

CREATE TABLE SALGRADE  

       (GRADE numeric,  

        LOSAL numeric,  

        HISAL numeric);  

 

INSERT INTO SALGRADE VALUES (1,  700, 1200);  

INSERT INTO SALGRADE VALUES (2, 1201,1400);  

INSERT INTO SALGRADE VALUES (3, 1401,2000);  

INSERT INTO SALGRADE VALUES (4, 2001,3000);  

INSERT INTO SALGRADE VALUES (5, 3001,9999);  

 

CREATE TABLE DUMMY  

       (DUMMY numeric);  

 

INSERT INTO DUMMY VALUES (0); 

 

給個通俗的解釋吧.

例表a

aid adate

1 a1

2 a2

3 a3

b

bid bdate

1 b1

2 b2

4 b4

兩個表a,b相鏈接,要取出id相同的字段

select * from a ,b where a.aid = b.bid這是僅取出匹配的數據.

此時的取出的是:

1 a1 b1

2 a2 b2

那麼left join :

select * from a left join b on a.aid =b.bid

首先取出a表中全部數據,而後再加上與a,b匹配的的數據

此時的取出的是:

1 a1 b1

2 a2 b2

3 a3 空字符

一樣的也有right join

指的是首先取出b表中全部數據,而後再加上與a,b匹配的的數據

此時的取出的是:

1 a1 b1

2 a2 b2

4 空字符 b4

inner join是內聯查詢語法是selectT1.XX,T1.XX,T2.XX,T2.XX from T1 inner join T2 on T1.X=T2.X這是兩表內聯起來錶鏈接有四種鏈接法內聯:inner join 篩選兩表都存在的數據全聯:full join 在兩表中最多行數的那張表爲主表,篩選主表數據,從表沒有數據時以NULL代替左聯:left join 左表爲主表,FULL JOIN差很少右聯:right join 右表爲主表交叉聯連:cross join 不帶條件.1的每一條紀錄都與表2的每一條記錄鏈接產生新表若是表16條記錄,24條記錄,那麼不帶條件的錶鏈接裝產生6*4條記錄當我沒有說話,我說不清楚啦.

sql多表鏈接查詢inner join,left join , right join ,full join ,cross join2010-01-08 11:43inner join,fullouter join,left join,right jion

內部鏈接 inner join 兩表都知足的組合

full outer 全連 兩表相同的組合在一塊兒,A表有,B表沒有的數據(顯示爲null,一樣B表有

A表沒有的顯示爲(null)

A left join  B 左連,A表爲基礎,A表的所有數據,B表有的組合。沒有的爲null

A right join B 右連,B表爲基礎,B表的所有數據,A表的有的組合。沒有的爲null

 

 

查詢分析器中執行:

--建表table1,table2

create table table1(id int,namevarchar(10))

create table table2(id int,score int)

insert into table1 select 1,'lee'

insert into table1 select 2,'zhang'

insert into table1 select 4,'wang'

insert into table2 select 1,90

insert into table2 select 2,100

insert into table2 select 3,70

如表

-------------------------------------------------

table1|table2|

-------------------------------------------------

idname|idscore|

1lee|190|

2zhang|2100|

4wang|370|

-------------------------------------------------

 

如下均在查詢分析器中執行

 

1、外鏈接

1.概念:包括左向外聯接、右向外聯接或完整外部聯接

 

2.左鏈接:left join left outerjoin

(1)左向外聯接的結果集包括 LEFTOUTER 子句中指定的左表的全部行,而不只僅是聯接列所匹配的行。若是左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的全部選擇列表列均爲空值(null)

(2)sql語句

select * from table1 left join table2 ontable1.id=table2.id

-------------結果-------------

idnameidscore

------------------------------

1lee190

2zhang2100

4wangNULLNULL

------------------------------

註釋:包含table1的全部子句,根據指定條件返回table2相應的字段,不符合的以null顯示

 

3.右鏈接:right join right outerjoin

(1)右向外聯接是左向外聯接的反向聯接。將返回右表的全部行。若是右表的某行在左表中沒有匹配行,則將爲左表返回空值。

(2)sql語句

select * from table1 right join table2 ontable1.id=table2.id

-------------結果-------------

idnameidscore

------------------------------

1lee190

2zhang2100

NULLNULL370

------------------------------

註釋:包含table2的全部子句,根據指定條件返回table1相應的字段,不符合的以null顯示

 

4.完整外部聯接:full join full outerjoin

(1)完整外部聯接返回左表和右表中的全部行。當某行在另外一個表中沒有匹配行時,則另外一個表的選擇列表列包含空值。若是表之間有匹配行,則整個結果集行包含基表的數據值。

(2)sql語句

select * from table1 full join table2 ontable1.id=table2.id

相關文章
相關標籤/搜索