一,啓動java
1.#su - oracle 切換到oracle用戶且切換到它的環境mysql
2.$lsnrctl status 查看監聽及數據庫狀態面試
3.$lsnrctl start 啓動監聽sql
4.$sqlplus / as sysdba 以DBA身份進入sqlplus數據庫
5.SQL>startup 啓動dbwindows
二,中止緩存
1.#su - oracle 切換到oracle用戶且切換到它的環境服務器
2.$lsnrctl stop 中止監聽網絡
3.$sqlplus / as sysdba 以DBA身份進入sqlplussession
4.SQL>SHUTDOWN IMMEDIATE 關閉db
其中startup和shutdowm還有其餘一些可選參數,有興趣能夠另行查閱
三,查看初始化參數及修改
1.#su - oracle 切換到oracle用戶且切換到它的環境
2.$sqlplus / as sysdba 以DBA身份進入sqlplus
3.SQL>show parameter session; 查看所接受的session數量
######################################################
Oracle process與session2008年12月29日 星期一 15:47
Connected to Oracle Database 10g Release 10.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=600 scope=both;
SQL>
SQL> alter system set processes=600 scope=both;
alter system set processes=600 scope=both
ORA-02095: specified initialization parameter cannot be modified
SQL> alter system set sessions=600 scope=both;
alter system set sessions=600 scope=both
ORA-02095: specified initialization parameter cannot be modified
SQL>
SQL> alter system set processes=600 scope=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=600 scope=memory;
alter system set processes=600 scope=memory
ORA-02095: specified initialization parameter 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修改
Oracle的sessions和processes的關係是
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=400 scope = 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 Enterprise Manager Console在圖形化管理器中修改
a.以系統管理員的身份登入
b.進入數據庫的例程-配置-通常信息-全部初始化參數
c.修改processes的值
d.Sessions的值由公式sessions=1.1*process + 5派生獲得
一個process能夠有0個,1個或多個session
=============================================
Oracle中系統process與session的關係
在實際的應用中,Shared Server中的Process與Oracle數據庫中的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中只要指定processes,sessions就會自動計算出,因此不須要指定sessions也可,除非對sessions有特殊要求,要求其比oracle自動計算出的sessions要大,那麼就須要手動指定sessions了
#########################################################
4.SQL>alter system set shared_servers=10; 將shared_servers的數量設置爲10
四.數據庫鏈接數目
其中一個數據庫鏈接須要一個session,它的值由processes決定,session與processes一般有如下關係:
session = 1.1 * processes + 5
不過這也不是絕對的,還要受到CPU和內存等硬件條件的限制。另外processes和session不能夠經過alter system語句直接修改,只能夠修改服務器參數文件來更改(Server Parameter File)。若是存在一個server parameter file,經過alter system語句所做的更改將會被持久化到文件中。
首先以Oracle用戶登陸
一、 $/oracle/oracle/app/product/101/bin/dbstart:啓動數據庫。
二、 $/oracle/oracle/app/product/101/bin/dbshut:關閉數據庫。
三、 $/oracle/oracle/app/product/101/bin/dbca:數據庫配置助理,進行數據庫安裝、刪除和修改。
四、 $/oracle/oracle/app/product/101/bin/netca:數據庫網絡服務配置管理。
五、 $/oracle/oracle/app/product/101/bin/netmgr:數據庫網絡服務和監聽配置助理。
六、 $/oracle/oracle/app/product/101/bin/sqlplus:可運行SQL,進行數據庫操做,並可起停數據庫。運行sqlplus命令,輸入sys用戶和口令登錄之後,運行以下命名:
〉shutdown immediate 當即關閉數據庫
〉startup 啓動數據庫
七、 $/oracle/oracle/app/product/101/bin/lsnrctl start:啓動數據庫監聽
$/oracle/oracle/app/product/101/bin/lsnrctl stop:關閉數據庫監聽
$/oracle/oracle/app/product/101/bin/lsnrctl status:察看數據庫監聽運行狀態
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 [group 4]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 group 3;
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> execute dbms_logmnr_d.build('oradb.ora','c:\oracle\oradb\log');
c. sql> execute dbms_logmnr_add_logfile('c:\oracle\oradata\oradb\redo01.log',
sql> dbms_logmnr.new);
d. sql> execute dbms_logmnr.add_logfile('c:\oracle\oradata\oradb\redo02.log',
sql> dbms_logmnr.addfile);
e. sql> execute dbms_logmnr.start_logmnr(dictfilename=>'c:\oracle\oradb\log\oradb.ora');
f. sql> select * from v$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' size 100m minimum extent 550k [logging/nologging]sql> default storage (initial 500k next 500k maxextents 500 pctinccease 0)
sql> [online/offline] [permanent/temporary] [extent_management_clause]
2.2. 建立本地管理的表空間(locally managed tablespace)
sql> create tablespace user_data datafile 'c:\oracle\oradata\user_data01.dbf'
sql> size 500m extent management local uniform size 10m;
2.3. 建立臨時表空間(temporary tablespace)
sql> create temporary tablespace temp tempfile 'c:\oracle\oradata\temp01.dbf'
sql> size 500m extent management local uniform size 10m;
2.4. 改變表空間的存儲參數(change the storage setting)
sql> alter tablespace app_data minimum extent 2m;
sql> alter tablespace app_data default storage(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 read only|write;
2.7. 刪除表空間(droping tablespace)
sql> drop tablespace app_data including contents;
2.8. 容許數據文件自動擴展(enableing automatic extension of data files)
sql> alter tablespace app_data add datafile 'c:\oracle\oradata\app_data01.dbf' size 200m
sql> autoextend on next 10m maxsize 500m;
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 rename datafile '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 (column datatype,column datatype]....)
sql> tablespace tablespace_name [pctfree integer] [pctused integer]
sql> [initrans integer] [maxtrans integer]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 table xay_temp as select * from xay;
on commit preserve rows/on commit delete rows
3.4. pctfree和pctused參數計算公式
pctfree = (average row size - initial row size) *100 /average row size
pctused = 100-pctfree- (average row size*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 「自動段空間管理」 功能可替代 PCTUSED、FREELISTS 和 FREELIST GROUPS。
3.5. 改變存儲和塊利用率參數(change storage and block utilization parameter)
sql> alter table table_name pctfree=30 pctused=50 storage(next 500k minextents 2 maxextents 100);
3.6. 手工分配區間(extents)(manually allocating extents)
sql> alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf');
3.7. 改變表的所屬表空間(move tablespace)
sql> alter table employee move tablespace users;
3.8. 釋放表中未用空間(deallocate of unused space)
sql> alter table table_name deallocate unused [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 [cascade constraints];
3.11. 刪除列(drop a column)
sql> alter table table_name drop column comments cascade constraints checkpoint 1000;
alter table table_name drop columns continue;
3.12. 標識某一列爲未使用(unused)(mark a column as unused)
sql> alter table table_name set unused column comments cascade constraints;
alter table table_name drop unused columns checkpoint 1000;
alter table orders drop columns continue checkpoint 1000
data_dictionary : dba_unused_col_tabs
除將列從表中刪除之外,還能夠先將列標記爲 「未使用」,之後再刪除。由於沒有刪除數據,因此此操做不回收磁盤空間,於是具備速度比較快的優勢。被標爲 「未使用」 的列可在之後系統活動較少時從表中刪除。
未使用的列就像不屬於表同樣。查詢時看不到未使用列中的數據。此外,在執行 DESCRIBE 命令時,也不會顯示這些列的名稱和數據類型。用戶能夠添加與未使用的列同名的新列。
若是想刪除同一表中的兩列,則可先將列設置爲 「未使用」 而後再刪除。在刪除兩列時,表中的全部行都會更新兩次;但若是將這些列設置爲 「未使用」 而後再刪除,則全部的行僅更新一次。
4. 索引
4.1. 建立一個基於函數的索引(creating function-based indexes)
sql> create index summit.item_quantity on summit.item(quantity-quantity_shipped);
基於函數的索引(Function-based indexes):
若是在表中要創建索引的一列或多列上使用了函數或表達式,則建立的是基於函數的索引。基於函數的索引預先計算函數或表達式的值,並將結果存儲在索引中。能夠將基於函數的索引建立爲 B 樹或位圖索引。
4.2. 建立一個B樹索引(create a B-tree index)
sql> create [unique] index index_name on table_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 of rows-initial number of rows)*100/maximum number of rows
4.4. 建立一個反向鍵索引(creating reverse key indexes)
sql> create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k next 200k pctincrease 0 maxextents 50) tablespace indx;
4.5. 建立位圖索引(create bitmap index)
sql> create bitmap index xay_id on xay(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 (next 400k maxextents 100);
4.7. 爲索引分配空間(allocating index space)
sql> alter index xay_id allocate extent(size 200k datafile 'c:/oracle/index.dbf');8.alter index xay_id deallocate 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/all immediate/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 cascade constraints
sql> drop tablespace tablespace_name including 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 100k next 100k) tablespace indx);
primary key/unique/references table(column)/check
5.4. 啓用當前禁用的約束(enable constraints)
sql> alter table xay enable novalidate constraint xay_id;
啓用 NOVALIDATE:
對於當前已有索引的 PRIMARY KEY 和 UNIQUE 約束,啓用 NOVALIDATE 約束比啓用 VALIDATE 約束要快得多,這是由於,若是約束是可延遲的,則不檢查現有數據是否違反約束。若是使用該選項啓用約束,則不要求鎖定表。這種方法適合表上有許多 DML 活動的狀況,如在 OLTP 環境中。
可是,若是須要建立索引,使用這種啓用約束的方法並不能比 ENABLE VALIDATE 帶來更多的好處,由於 Oracle 服務器在創建索引時鎖定表。
5.5. 啓用約束(enable constraints)
sql> alter table xay enable validate constraint xay_id;
6. 加載(load)數據
6.1. 使用insert語句從另外一張表中「直接加載」數據到新表(loading data using direct_load insert)
sql> insert /*+append */ into emp nologging
sql> select * from emp_old;
6.2. 使用insert方式的「並行直接加載」數據(parallel direct-load insert)
sql> alter session enable parallel dml;
sql> insert /*+parallel(emp,2) */ into emp 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.dmp transport_tablespace=y tablespace=sales_ts
triggers=n constraints=n
$copy datafile
$imp sys/.. file=xay.dmp transport_tablespace=y datafiles=(/disk1/sles01.dbf,/disk2
/sles02.dbf)
sql> alter tablespace sales_ts read write;
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 by oracle account unlock;
8.2. user_provided password function
sql> function_name(userid in varchar2(30),password in varchar2(30),
old_password in varchar2(30)) return boolean
8.3. 建立概要文件:設置口令參數(create a profile : password setting)
sql> create profile grace_5 limit failed_login_attempts 3
sql> password_lock_time unlimited password_life_time 30
sql>password_reuse_time 30 password_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 limit sessions_per_user 2
sql> cpu_per_session 10000 idle_time 60 connect_time 480;
8.7. view => resource_cost : alter resource cost
dba_Users,dba_profiles
8.8. 容許資源限額(enable resource limits)
sql> alter system set resource_limit=true;
9. 管理用戶(Managing users)
9.1. 建立用戶(數據庫認證方式)(create a user: database authentication)
sql> create user juncky identified by oracle default tablespace users temporary tablespace temp quota 10m/unlimited on 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 table to managers;
sql> grant create session to scott with admin option;
with admin option can grant or revoke privilege from any user or role;
10.3. sysdba和sysoper的權限(sysdba and sysoper privileges:)
sysoper: startup,shutdown,alter database open|mount,alter database backup controlfile,alter tablespace begin/end backup,recover database,alter database archivelog,restricted session
sysdba:sysoper privileges with admin option,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 to public;
sql> grant update(first_name,salary) on employee 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 from scott [cascade constraints];
10.10. 審計記錄視圖(audit record view) :
=> sys. aud$
10.11. 保護審計線索(protecting the audit trail)
sql> audit delete on sys.aud$ by access;
保護審計線索:
應保護審計線索,以防添加、修改或刪除審計信息。發出如下命令:
SQL> AUDIT delete ON sys.aud$ BY ACCESS;
可防止審計線索未經受權即被刪除;只有 DBA 才擁有 DELETE_CATALOG_ROLE 角色。
10.12. 語句審計(statement auditing)
sql> audit user;
語句審計:該種審計對 SQL 語句進行選擇性審計,而並不審計語句針對的特定方案對象。例如,AUDIT TABLE 跟蹤多個 DDL 語句,而與這些語句針對的表無關。能夠設置語句審計,以便對數據庫中的所選用戶或每一個用戶進行審計。
10.13. 權限審計(privilege auditing)
sql> audit select any table by summit by access;
權限審計:
該種審計對執行操做應具備的相應系統權限進行選擇性審計,如 AUDIT CREATE ANY TRIGGER。能夠設置權限審計對數據庫中的所選用戶或每一個用戶進行審計。
10.14. 方案對象審計(schema object auditing)
sql> audit lock on summit.employee by access 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 by bonus;
sql> create role hr_manager identified externally;
13.2. 修改角色(modify role)
sql> alter role sales_clerk identified by commission;
sql> alter role hr_clerk identified externally;
sql>alter role hr_manager not identified;
13.3. 分配角色給用戶(assigning roles)
sql> grant sales_clerk to scott;
sql> grant hr_clerk to hr_manager;
sql> grant hr_manager to scott with admin option;
13.4. 創建缺省角色(establish default role)
sql> alter user scott default role hr_clerk,sales_clerk;
sql> alter user scott default role all;
sql> alter user scott default role all except 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 by commission;
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 or backup_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. 徹底恢復(complete recovery:)
--method 1(mounted databae)
>copy c:\backup\user.dbf c:\oradata\user.dbf
>startup mount
>recover datafile 'c:\oradata\user.dbf;
>alter database open;
--method 2(opened database,initially opened,not system or rollback datafile)
>copy c:\backup\user.dbf c:\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 closed not system or rollback datafile)
>startup mount
>alter database datafile 'c:\oradata\user.dbf' offline;
>alter database open
>copy c:\backup\user.dbf d:\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 backup and have all archive log)
>alter tablespace user_data offline immediate;
>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 begin backup;
> copy files /backup/
> alter database datafile '/c:/../data.dbf' end backup;
> alter system switch logfile;
14.10. 備份一個控制文件(backup a control file)
> alter database backup controlfile to 'control1.bkp';
> alter database backup controlfile to trace;
14.11. 非歸檔模式下的恢復(recovery (noarchivelog mode))
> shutdown abort
> cp files
> startup
14.12. 備份模式下的文件恢復(recovery of file in backup mode)
>alter database datafile 2 end backup;
14.13. 清空重作日誌文件(clearing redo log file)
>alter database clear unarchived logfile group 1;
>alter database clear unarchived logfile group 1 unrecoverable datafile;
14.14. 重作日誌的恢復(刪除與重建)(redo log 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數據庫手邊命令
一、獲得數據庫名和建立日期
SELECT name, created, log_mode, open_mode FROM v$database;
二、ORACLE數據庫的計算機的主機名,ORACLE數據庫的實例名及ORACLE數據庫管理系統的版本信息
SELECT host_name, instance_name, version FROMv$instance;
三、爲了知道oracle數據庫版本的一些特殊信息
select * from v$version;
四、獲取控制文件名字
select * from v$controlfile;
五、獲得Oracle數據庫的重作日誌配置信息
SELECT group#, members, bytes, status, archived FROM v$log;
select GROUP#,MEMBER from v$logfile;
六、獲取oracle的每一個重作日誌(成員)文件所存放的具體位置
select * from v$logfile;
七、知道ORACLE數據庫的備份和恢復策略和歸檔文件的具體位置
archive log list
八、知道ORACLE數據庫中到底有多少表空間以及每一個表空間的狀態
select tablespace_name, block_size, status, contents, logging from dba_tablespaces;
select tablespace_name, status from dba_tablespaces;
九、知道每一個表空間存在哪一個磁盤上以及文件的名字等信息
SELECT file_id, file_name, tablespace_name, status, bytes from dba_data_files;
select file_name, tablespace_name from dba_data_files;
十、知道Oracle數據庫系統上到底有多少用戶和都是何時建立的
select username,created from dba_users;
select username, DEFAULT_TABLESPACE from dba_users;
十一、從控制文件中取出信息涉及到如下一些相關的命令
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
十二、控制文件由兩大部份組成:可重用的部份和不可重用的部分。可重用的部分的大小可用CONTROL_FILE_RECORD_KEEP_TIME參數來控制,該參數的默認值爲7天,便可重用的部份的內容保留7天,一週以後這部份的內容可能被覆蓋。可重用的部份是供恢復管理器來使用的,這部份的內容能夠自動擴展。Oracle數據庫管理員可使用CREAT DATABASE或CREAT CONTROLFILE語句中的下列關鍵字(參數)來間接影響不可重用的部份的大小:
MAXDATAFILES
MAXINSTANCES
MAXLOGFILES
MAXLOGHISTORY
MAXLOGMEMBERS
1三、查看控制文件的配置
SELECT type, record_size, records_total, records_used FROM v$controlfile_record_section;
1四、若是您的顯示被分紅了兩部分,您須要使用相似於set pagesize 100的SQL*Plus命令先格式化輸出。有關的格式化輸出命令有如下這些:
record_size: 爲每一個記錄的字節數。
records_total:爲該段所分配的記錄個數。
records_used:爲該段所使用的記錄個數。
1五、知道控制文件中的全部數據文件(DATAFILE),表空間(TABLESPACE),和重作日誌(REDO LOG)所使用的記錄狀況
SELECT type, record_size, records_total, records_used
FROM v$controlfile_record_section
WHERE type IN ( 'DATAFILE', 'TABLESPACE', 'REDO LOG');
1六、獲取控制文件名字
select value from v$parameter where name ='control_files';
或者:select * from v$controlfile
1七、如何在一個已經安裝的Oracle數據庫中添加或移動控制文件呢?
如下是在一個已經安裝的Oracle數據庫中添加或移動控制文件的具體步驟:
a、利用數據字典v$controlfile來獲取現有控制文件名字。
b、正常關閉Oracle數據庫。
c、將新的控制文件名添加到參數文件的CONTROL_FILES參數中。
d、使用操做系統的複製命令將現有控制文件複製到指定位置。
e、從新啓動Oracle數據庫。
f、利用數據字典v$controlfile來驗證新的控制文件名字是否正確。
g、若是有誤重作上述操做,若是無誤刪除無用的舊控制文件。
注:若是您使用了服務器初始化參數文件(SPFILE),您不能關閉Oracle數據庫並且應該在第3步使用alter system set control_files的Oracle命令來改變控制文件的位置。
SQL> alter system set control_files =
'D:\Disk3\CONTROL01.CTL',
'D:\Disk6\CONTROL02.CTL',
'D:\Disk9\CONTROL03.CTL' SCOPE=SPFILE;
1八、因爲控制文件是一個極其種要的文件,除了以上所說的將控制文件的多個副本存在不一樣的硬盤上的保護措施外,在數據庫的結構變化以後,您應當即對控制文件進行備份。能夠用Oracle命令來對控制文件進行備份:
alter database backup controlfile to 'D:\backup\control.bak';
1九、您也可將備份到一個追蹤文件中。該追蹤文件包含有重建控制文件所需的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數據庫命令集
一、sqlplus啓動方式:
Dos下運行sqlplus 用戶名/密碼 as sysdba
例如:c:>sqlplus sys/password AS sydba(系統賬戶)
或者:c:>sqlplus scott/password
二、用戶鏈接(切換)操做:
sql>conn Scott/password(默認爲tiger)
注:conn與connect使用方法同樣
三、手動解鎖:
sql>ALTER USER scott Account Unlock;(將scott賬戶解鎖)
四、查看用戶(兩種方式):
sql>select user form dual;
sql>show user;
五、sql幫助:
sql>help index;
六、數據庫卸載和加載
sql>shutdown [NORMAL][IMMEDLATE][ABORT][TRANSACTIONAL];
sql>startup;
七、查詢select操做:
sql>select *from dept;
sql>select dname,loc from dept;
sql>select *from emp where deptno=20;
注:在sql中,字符串使用單引號。
八、字段別名的定義:
sql>select hiredate AS 僱用日期 from emp
AS能夠省略,可是推薦使用。
九、字符串鏈接
sql>selcet dname||loc from dept;
十、提取表中的前N個記錄:
sql>select *from emp where rownum<=N;
十一、null的使用:
sql>select ename,job from emp where comm is[not] null;
注:null參與數學表達式計算時,結果必定爲null。
十二、like關鍵字(字符串匹配):
sql>select dname from dept where dname like '_S%';
注:_表明單個字符,%表明多個字符。
1三、in關鍵字:
sql>select dname,dpart,log from dept where deptno in(10,20);
注:只選擇輸出deptno值爲10或20的記錄。
相似於:where deptno=10 or deptno=20;
1四、between and關鍵字:
sql>select * from dept where deptno between 10 and 30;
包括10和30.
1五、set關鍵字:
sql>set pagesize 10;
sql>set linesize 100;
1六、鏈接查詢:
求解sal大於平均值的記錄
sql>select * from emp
where sal>(select avg(sal) from emp);
1七、聯合查詢:
字段個數和類型必須保持一致,合併爲一個查詢結果。
sql>select empno,ename from emp
union[ALL]
select deptno,dname from dept;
ALL:表明能夠有重複記錄。
1八、內鏈接查詢:
內鏈接查詢分爲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;
1九、自鏈接查詢:將一個表起不一樣的別名,使其在邏輯上成爲兩張表。
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。
2一、集合函數(數學表達式):
sql>select AVG(sal) from emp;
sql>select Count([distinct]sal) from emp;
distinct表示不計算重複數據。
2二、插入記錄:
sql>Insert Into tablename (字段列表) values(屬性類表);
sql>Insert Into emp(eno,ename,dept) values(1,'java',20);
2三、修改(更新)記錄:
sql>UpDate emp set deptno=80
where deptno=81;
2四、刪除記錄:
sql>Delete from tablename where 條件
sql>Delete from emp where deptno=80;
2五、建立視圖:注意權限,本操做是在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;
2六、同義詞
create synonym 同義詞名稱 for 原對象
sql>create synonym empbak for scott.emp;
sql>select * from empbak;
2七、修改對象(表、視圖等)結構ALTER:
sql>alter table 表名 add("book_id"VARCHAR2(10));//添加字段,注意雙引號
sql>alter table 表名 modify("book_id",not null);
2八、修改表的操做
sql>rename 原表名 to 新表名//修改表名
sql>select * from tab;//查找當前用戶表信息
sql>desc 表名//查看錶結構
sql>drop table 表名//刪除表
sql>truncate table 表名//刪除表中數據,保留表結構
2九、事務處理
sql>commit 成功提交事務
sql>rollback 返回到事務未開始的狀態
sql>savepoint A 建立事務的保存點
sql>rollback to [savepoint] A 返回保存點
30、EXISTS關鍵字
sql>select * from dept where EXISTS (select deptno from emp);
3一、從另一個表中拷貝記錄
sql>Insert Into emp(empno,job)
select dname from dept where deptno=50;
sql>insert into (select deptno,dname from dept)
values (50,'Java');
3二、更新(2個表操做)表記錄:
sql>update emp set ename=(select dname from dept where deptno=50 ),
job=(select loc from dept where deptno=50 )
where ename like 'S%'
3三、刪除(2個表操做)操做:
sql>delete from emp where empno=
(select deptno from dept where deptno=50)
3四、合併操做MERGE INTO:
sql>MERGE INTO 表名
Using 表名
ON(條件)
when Matched then (匹配)
update set ....
when not Matched then
insert into....
3四、any/some操做,表明知足any後面的任何一個條件便可:
sql>select * from emp
where sal<=any(2500,6000,10000);
3五、all操做,表明知足all後面的全部條件:
sql>select * from emp
where sal<=all(2500,6000,10000);
3七、list操做:列出緩衝區的內容,可簡寫l,後接整型數字或爲空
sql>list(n)
3八、/操做:執行緩衝區sql命令或PL/SQL塊
3九、change操做:修改緩衝區裏的信息,可簡寫c
sql>c/fron/from
將fron改寫爲from
40、del操做:刪除指定行緩衝區命令
sql>del 2 3 刪除第2行、第3行的信息。
4一、在緩衝區中追加信息(追加到末尾)
sql>append where select;
4二、save命令,保存緩衝區內容到指定的文件中:
sql>save c:\select.sql;
4三、get命名(與save對應)
sql>get c:\select.sql;
4四、@命令(與get類似,get是加載語句,而後執行,而@是加載和執行同時進行)
sql>@ c:\select.sql;
4五、edit命令,載入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
謂詞in和not in
有哪些職員和分析員
select ename,job
from emp
where job in ('clerk','analyst');
select ename,job
from emp
where job not in ('clerk','analyst');
謂詞between和not between
哪些僱員的工資在2000和3000之間
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
沒有獎金的僱員(即commision爲null)
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 15 secs
列名的別名
select ename employee from emp
where deptno=10;
(別名:employee)
select ename,sal,comm,comm/sal "C/S RATIO" 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),loc char(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,系統將自動地在每頁的頂部顯示日期和頁號。
TTITLET和BTITLE命令有效,直至從新設置表頭或表尾,或退出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,則一直有效,直到
關閉COMPUTE(clear 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 null是SQL*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 Mon dd,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;
(基表salgrade:grade 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
建立同義詞
爲用戶allen的EMP基表建立同義詞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,comm commision
from emp
where sal>comm
order by sal desc,ename;
列出有關僱員姓名、獎金佔收百分比的信息。
要求顯示時列名意義明確,按僱員姓名排序,不包括獎金未知的僱員。
select ename employee,(comm/(comm+sal))100 incentive
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("employee name",
"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,ename employee,(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') "hire date"
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,false或null,不存貯在數據庫中)
日期型
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 SQL和PL/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命令以後的全部對數據庫的修改
關鍵字WORK和SAVEPOINT爲可選項,對命令執行無任何影響
函數
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';
if num_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;
end if;
end if;
commit;
end;
------
5 循環
語法
loop
......
end loop;
exit;(退出循環)
exit [when];(退出循環,當知足WHEN時)
例1
declare
ctr number(3):=0;
begin
loop
insert into table1 values('tastes great');
insert into table2 values('less filling');
ctr:=ctr+1;
exit when ctr=100;
end loop;
end;
(注:若是ctr取爲NULL,循環沒法結束)
例2
FOR語法
for 變量<範圍> loop
......
end loop;
declare
my_index char(20):='fettucini alfredo';
bowl char(20);
begin
for my_index in reverse 21..30 loop
insert into temp(coll) values(my_index);
/*循環次數從30到21*/
end loop;
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 where batting_avg<100;
if sql%rowcount>5 thn
insert into temp
values('your team needs help');
end if;
SQL%ISOPEN:取值總爲FALSE。SQL命令執行完畢,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_no和item_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_description inventory.product_description%type;
i_product_status inventory.product_status%type;
i_std_shipping_qty inventory.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);
if i_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;
end if;
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;
end loop;
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:管理, PlSql Developer:
第二課:更改用戶
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-20 12: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 where sal>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 ename group by deptno) 查詢會多值.
應該以下:
select max(sal),deptno from emp group 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.losal and 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 between s.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 ON C.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_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)
上面結果又可當成一張表。
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_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 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)
)
)
結果以下:
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*12 year_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 sal between 800 and 1500;
select ename, sal from emp where sal >= 800 and sal <= 1500;
select ename, sal from emp where comm is null;
--一個事務開始於一條ddl語句,結束語rollback commit 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 deptno asc, 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') from emp;
select to_char(sal, 'L000,000.000') from emp;
select to_char(hiredate, 'yyyy-mm-dd hh: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-DD HH24:MI:SS');
select sal from emp where sal > to_number('$1,250.000', '$9,999.000');
select ename,sal*12 + nvl(comm, 0) from emp;
--組函數 多行輸入,只有一行輸出 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 by deptno;
select deptno, job, max(sal) from emp group by deptno, job;
--出如今select後,不是組函數的,必須出如今group by裏
--where語句對單挑記錄進行過濾,分組後過濾用having
--子查詢 把一次查詢結果當成表
select ename from emp where sal = (select max(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, emp t2 where t1.mgr = t2.empno;
select ename, dname, grade from emp e, dept d, 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 join dept;
select ename, dname from emp join dept on (emp.deptno = dept.deptno);
select ename, dname from emp join dept using (deptno);
select ename, grade from emp e join salgrade s on (e.sal between s.losal and s.hisal);
select e1.ename, e2.ename from emp e1 join emp e2 on (e1.mgr = e2.empno);
--左外鏈接
select e1.ename, e2.ename from emp e1 left join emp e2 on (e1.mgr = e2.empno);
--右外鏈接
select ename, dname from emp e right join dept d on (e.deptno = d.deptno);
select ename, dname from emp e full outer join dept d on (e.deptno = d.deptno);
--求部門中那些人薪水最高
select ename, sal from emp
join (select deptno, max(sal) max_sal from emp 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 from emp group by deptno) t
on (avg_sal between losal and hisal);
--求平均薪水最高的部門的部門標號
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);
--平均薪水的等級最低的部門的部門名稱
select dname, t1.deptno, grade, avg_sal 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.hisal)
) t1
join dept on (t1.deptno = dept.deptno)
where t1.grade =
(
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.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 between s.losal and s.hisal);
--變簡單了
select dname, t1.deptno, grade, avg_sal from
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
on emp.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 not in
(select distinct e1.sal from emp e1 join emp 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 from emp 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 sal desc)
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 sno in
(
select sno from sc where cno = 2
);
--一個事務開始於一條ddl語句,結束語rollback commit ddl數據定義語句 dcl數據控制語句語句
--正常斷開鏈接 提交 非正常斷開鏈接 回滾
--desc 表名 描述表的內容
desc emp;
--加上數學表達式和列名 ""保持格式
select ename "name space", sal*12 year_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 sal between 800 and 1500;
select ename, sal from emp where sal >= 800 and sal <= 1500;
select ename, sal from emp where comm is null;
--一個事務開始於一條ddl語句,結束語rollback commit 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 deptno asc, 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') from emp;
select to_char(sal, 'L000,000.000') from emp;
select to_char(hiredate, 'yyyy-mm-dd hh: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-DD HH24:MI:SS');
select sal from emp where sal > to_number('$1,250.000', '$9,999.000');
select ename,sal*12 + nvl(comm, 0) from emp;
--組函數 多行輸入,只有一行輸出 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 by deptno;
select deptno, job, max(sal) from emp group by deptno, job;
--出如今select後,不是組函數的,必須出如今group by裏
--where語句對單挑記錄進行過濾,分組後過濾用having
--子查詢 把一次查詢結果當成表
select ename from emp where sal = (select max(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, emp t2 where t1.mgr = t2.empno;
select ename, dname, grade from emp e, dept d, 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 join dept;
select ename, dname from emp join dept on (emp.deptno = dept.deptno);
select ename, dname from emp join dept using (deptno);
select ename, grade from emp e join salgrade s on (e.sal between s.losal and s.hisal);
select e1.ename, e2.ename from emp e1 join emp e2 on (e1.mgr = e2.empno);
--左外鏈接
select e1.ename, e2.ename from emp e1 left join emp e2 on (e1.mgr = e2.empno);
--右外鏈接
select ename, dname from emp e right join dept d on (e.deptno = d.deptno);
select ename, dname from emp e full outer join dept d on (e.deptno = d.deptno);
--求部門中那些人薪水最高
select ename, sal from emp
join (select deptno, max(sal) max_sal from emp 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 from emp group by deptno) t
on (avg_sal between losal and hisal);
--求平均薪水最高的部門的部門標號
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);
--平均薪水的等級最低的部門的部門名稱
select dname, t1.deptno, grade, avg_sal 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.hisal)
) t1
join dept on (t1.deptno = dept.deptno)
where t1.grade =
(
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.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 between s.losal and s.hisal);
--變簡單了
select dname, t1.deptno, grade, avg_sal from
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
on emp.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 not in
(select distinct e1.sal from emp e1 join emp 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 from emp 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 sal desc)
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 sno in
(
select sno from sc where cno = 2
);
--一個事務開始於一條ddl語句,結束語rollback commit 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是內聯查詢語法是select T1.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的每一條記錄鏈接產生新表若是表1有6條記錄,表2有4條記錄,那麼不帶條件的錶鏈接裝產生6*4條記錄當我沒有說話,我說不清楚啦.
sql多表鏈接查詢inner join, left join , right join ,full join ,cross join2010-01-08 11:43inner join,full outer 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,name varchar(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 outer join
(1)左向外聯接的結果集包括 LEFT OUTER 子句中指定的左表的全部行,而不只僅是聯接列所匹配的行。若是左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的全部選擇列表列均爲空值(null)。
(2)sql語句
select * from table1 left join table2 on table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
------------------------------
註釋:包含table1的全部子句,根據指定條件返回table2相應的字段,不符合的以null顯示
3.右鏈接:right join 或 right outer join
(1)右向外聯接是左向外聯接的反向聯接。將返回右表的全部行。若是右表的某行在左表中沒有匹配行,則將爲左表返回空值。
(2)sql語句
select * from table1 right join table2 on table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
NULLNULL370
------------------------------
註釋:包含table2的全部子句,根據指定條件返回table1相應的字段,不符合的以null顯示
4.完整外部聯接:full join 或 full outer join
(1)完整外部聯接返回左表和右表中的全部行。當某行在另外一個表中沒有匹配行時,則另外一個表的選擇列表列包含空值。若是表之間有匹配行,則整個結果集行包含基表的數據值。
(2)sql語句
select * from table1 full join table2 on table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
NULLNULL370
------------------------------
註釋:返回左右鏈接的和(見上左、右鏈接)
2、內鏈接
1.概念:內聯接是用比較運算符比較要聯接列的值的聯接
2.內鏈接:join 或 inner join
3.sql語句
select * from table1 join table2 on table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
------------------------------
註釋:只返回符合條件的table1和table2的列
4.等價(與下列執行效果相同)
A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join後加條件只能用where,不能用on)
3、交叉鏈接(徹底)
1.概念:沒有 WHERE 子句的交叉聯接將產生聯接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等於笛卡爾積結果集的大小。(table1和table2交叉鏈接產生3*3=9條記錄)
2.交叉鏈接:cross join (不帶條件where...)
3.sql語句
select * from table1 cross join table2
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370
------------------------------
註釋:返回3*3=9條記錄,即笛卡爾積
4.等價(與下列執行效果相同)A:select * from table1,table2