Oracle 10g SQL 基礎培訓

本文章通過oracle 10g 11g自帶的HR用戶下的7張表,來學習SQL基礎知識。
在 安裝數據庫時,勾選相應的選項,就會安裝HR用戶下練習使用的7張表。
如果你的oracle數據庫沒有HR用戶,可以下載本文附件中的工具包來 安裝。

 

官方聯機文檔下載地址,400多M吧。
http://www.oracle.com/technology/documentation/index.html

-------------------------------------- 基本準備-------------------------------------------------------
使 用sqlplus連接數據庫:
1 本地主機連接遠端的oracle數據庫,本地主機要安裝oracle客戶端,輸入如下命令
sqlplus 用戶名/密碼@網絡服務名

網 絡服務名是什麼?其實就是本地主機安裝oracle客戶端時配置遠端數據庫的別名,在Oracle Net Manager中叫“網絡服務名”, 在sqlplusw中叫“主機字符串”。

 

2 本地主機連接遠端的oracle數據庫成功後,切換到其實用戶
SQL> conn scott/tigger@網絡服務名

SQL>  conn  sys/sys的密碼@網絡服務名 as sysdba

3 連接本機的oracle數據庫,輸入如下命令
sqlplus /nolog  
conn / as sysdba

4 連接本機的oracle數據庫成功後,切換到其實用戶
SQL> conn scott/tigger;


常用SQL/PLUS命令
查看一行顯示字符數:SQL> show linesize;   (簡寫:show lines)
設置顯示寬度爲200字符:SQL> set linesize 200; (簡寫:set lines 200)
查看目前的pagesize,默認是14:show pagesize;
將pagesize設 置好100:set pagesize 100; 

 

常用PL/SQL命令

查看錶的結構(詳細): select dbms_metadata.get_ddl('TABLE','大寫表名') FROM dual;
查 看錶的結構(簡單): desc 表名
查看當前數據庫登錄操作的用戶 :show user 

 

常 用字典、包
查看數據庫有哪些用戶從“用戶字典”(注意權限):select username,account_status from dba_users;
查看當前用戶有哪些表:select table_name from user_tables;

查看當前用戶的對象:select object_name,object_type from user_objects;


解鎖scott帳戶

alter user scott account unlock; //解鎖帳戶
grant connect,resource,unlimited tablespace to scott; //分配權限
alter user scott identified by tiger ; //設置密碼

Oracle sqlplus的清屏

如果是通過本身的sqlplus那麼方法有:
同時按SHIFT和DELETE鍵然後點OK、clear screen ;或 clea scre;實現

如果是通過cmd模式進入的話:
可以通過host cls命令來實現清屏

----------------------------------------------------Schema-------------------------------------------------
HR用戶下的7張表 Schema

表的說明:

employees 員工表

departments 部門表(員工所在的部門)

locations  地址表(部門在哪個地址)

countries 國家表(地址在哪個國家)

regions   大區表(亞太區,北美區)  (國家在哪個大區)

job         工作崗位表 (員工的工作崗位)

jbo_history  工作變動歷史表

 

----------------------------運算符部分------------------------------

=,>,<,>=,<=,<>,

between ...  and ...  (兩端包含)

in() , not in()

like '%磊_'  , %配置多個字符   , _ 配置一個字符。  like '%磊/_' escape '/'   ,說明/是轉義字符,可以查詢結果中包含_。 

is null

邏輯運算符:and , or , not

 

----------------------------子句部分------------------------------

select子句

from子句

where子句

order by 子句, 結果有null值時,升序時null放在結果的最後面,降序null值放在結果的最前面。可以修改:order by id desc nulls last/first;

group by 子句

having 子句

for update子句

 

---------------------------函數部分-------------------------------

字符函數:

UPPER('String') 轉換成大寫字母

LOWER('String') 轉換成小寫字母

INITCAP('String')轉換爲首字母大寫,其它小字

SUBSTR('HelloWorld',1,5)  結果是:Hello。參數說明:('HelloWorld',1,5)意思是截取'HelloWorld'串從第1個開始,取5個。SQL中“第一”是從 1開始的。

INSTR('HelloWorld','W')     結果是:6 

replace('JACK and JUE','J','BL') 替換,把'J' 替換成'BL'。

trim() 去空格

 

數學函數:

ROUND(45.926,2)   結果:45.93  保留兩位小數,四捨五入。

ROUND(45.926,-1)  結果:50

TRUNC(45.926,2)    結果:45.92  保留兩位小數,多餘部分直接截去,無四捨五入。

TRUNC(45.926,-1)   結果:40

MOD(1600,300)      結果:100     取餘數

 

日期函數:

SQL> select sysdate from dual;    結果是:23-7月 -10       sysdate是一個無參數的函數。

 

轉換函數:   (隱式轉換,顯示轉換)

---- 日期轉字符

SQL> select to_char (sysdate,'YYYY-MM-DD') as date_ from dual;   結果:2010-07-23

SQL> select to_char (sysdate,'fm YYYY-MM-DD') as date_ from dual;    結果:2010-7-23  fm 作用:去掉前導0,07月顯示爲7月。

SQL> select to_char (sysdate,'YYYY-MM-DD HH24:MI:SS') as date_ from dual;  結果:2010-07-23 12:06:19

 

---- 數字轉字符

SQL>   select to_char(100,'L99,999.00') from dual;  結果:¥100.00   以本地貨幣格式化成字符串。

 

---- 字符轉成數值

TO_NUMBER('100')

 

---- 字符轉成日期

TO_DATE('2009-11-01','YYYY-MM-DD')

 

null相關函數:  相當於if else

NVL(name,0)    如果name值是null,就返回0,否則返回name。

NVL2( name,1 ,0 )  如果name值是null,就返回0,否則返回1。

NULLIF(1,1)  如果兩個參數相等,就返回null,否則返回第一個參數。 

COALESCE(name,age,pwd) 可跟多個參數,參數中從前向後,返回第一個不爲null的參數。

 

聚合(組)函數:

MAX()

MIN()

AVG()

COUNT()

SUM()

STDDEV() 

VARIANCE()

 

 

 

 


----------------------------select部分 ------------------------------

去除重複的值, 例select distinct department_id,job_id from employees;   distinct 關鍵字後跟多個列時,列的組合總體要維一。

查看錶的結構,   DESCRIBE ,他是sql plus的命令,可以簡寫爲DESC,後面可以不寫分號。 例DESC employees

 

子查詢:

子查詢可以出現在where,having,from 子句中。子查詢中的語句要使用() 括起來。

 

當子查詢返回結果爲null時,整個SQL使用了非 "is null"運算符時,查詢結果就是0條記錄。

注意  ****  not in ( 集合[111,222,null])時,整個SQL查詢結果就是0條記錄。

 

 

子查詢 -- 在where子句中:

= , < , > , <>是單行運算符,使用單行運算時,子查詢只能返回一條結果(一行一列)。

in ,not in ,any,all ,聚合函數,    是多行運算符,使用多行運算符時,子查詢可以返回多條結果(多行一列)。

 

Sql代碼
  1. 子查詢 只返一條結果,並使用了單行運算符,SQL語句可以正常執行  
  2. elect last_name ,salary from  employees  where  salary > ( select  salary  from  employees  where  last_name = 'Abel' );  
 子查詢只返一條結果,並使用了單行運算符,SQL語句可以正常執行
select last_name ,salary from employees where salary > (select salary from employees where last_name ='Abel');

 

Sql代碼
  1. 子查詢 只返多條結果,並使用了單行運算符,SQL語句不可以正常執行  
  2. select  last_name ,salary  from  employees  where  salary > ( select  salary  from  employees  where  last_name  like   'K%' );  
  3.   
  4. 第 1 行 出現錯誤:  
  5. ORA-01427: 單行子查詢返回多個行  
子查詢只返多條結果,並使用了單行運算符,SQL語句不可以正常執行
select last_name ,salary from employees where salary > (select salary from employees where last_name like 'K%');

第 1 行出現錯誤:
ORA-01427: 單行子查詢返回多個行

 

 

子查詢 -- 在having子句中:

Sql代碼
  1. SELECT  department_id , MIN (salary)  
  2. FROM  employees  
  3. GROUP   BY  department_id  
  4. HAVING   MIN (salary)   >  
  5. (SELECT   MIN (salary)  
  6. FROM  employees  
  7. WHERE  department_id=50);  
 SELECT department_id ,MIN(salary)
 FROM employees
 GROUP BY department_id
 HAVING MIN(salary)   >
 (SELECT MIN(salary)
 FROM employees
 WHERE department_id=50);

 

 

子查詢 -- 在from子句中:

略。。。

 

 

 

--------------------select多張表  join部分-------------------------

 

 

內外連接說明表

 

內連接

 

 

外連接

 

 

連接字段爲null值或不能實現“拉手”連接的行,

不會出現在連接結果集合中

 

 

連接字段爲null值或不能實現“拉手”連接的行,

會現在連接結果集合中

 

Inner Joins 內連接

Self join 自己連接自己

Nonequijoins 不等連接

left outer join 左外連接

right outer join 右外連接

full outer join 全連接

 

 

 

Inner Joins 內連接   (是內連接,連接字段爲null值或不能實現“拉手”連接的行,不會出現 在連接結果集合中)

--使用join on 方式(SQL標準),實現表的內連接:(經常用)

兩張表中可連接的字段名稱不相同

Sql代碼
  1. select  employee_id,last_name,location_id,e.department_id  
  2. from  employees e <strong> join </strong> departments d <strong> on </strong> e.department_id=d.department_id;  
select employee_id,last_name,location_id,e.department_id
from employees e join
 departments d on
 e.department_id=d.department_id;

e.department_id     字段兩個表都有,要加前綴或表別名。

三張表以上時使用: t1 join t2  on t1.n=t2.n join t3 on t3.n=t2.n

 

 

--Natural join 自然連接(SQL標準),實現表的內連接: (很少用)

兩張表中可連接的字段名稱相同,類型相同 就可以使用這種簡寫的連接方法,

在departments表與locations表中都有location_id字段且類型相同。

如果兩張表中各有兩個字段符合上述要求,就用這兩個字段一起做join。

 

Sql代碼
  1. SELECT  department_id,department_name,location_id,city  
  2. FROM  departments  
  3. <strong>NATURAL JOIN </strong> locations;  
SELECT department_id,department_name,location_id,city
FROM departments
NATURAL JOIN
 locations;

 

 

 

--USING   自然連接(SQL標準),實現表的內連接:(很少用)

兩張表中可連接的字段名稱相同,就可以進行連接,類型不相同oracle可以自動轉換

如果兩張表中各有兩個字段符合上述要求,但使用的是哪一個字段來連接呢,

我們可以通過using來指定,using與natural join 不可同時出現。

Java代碼
  1. select employee_id,last_name,location_id,department_id  
  2. from employees <strong>join</strong> departments  
  3. <strong>using</strong>(department_id);  
select employee_id,last_name,location_id,department_id
from employees join
 departments
using
(department_id);

department_id  字段兩個表都有,但不要加前綴或表別名

 

 

--使用Oracle專有的語法,實現表的內連 接:(經常用)

Sql代碼
  1. SELECT  table1. column ,table2. column    
  2. FROM  table1,table2  
  3. <strong>WHERE  table1. column =table2. column </strong> ;  
SELECT table1.column,table2.column 
FROM table1,table2
WHERE table1.column=table2.column
 ;

 可以按多個字段來連接表

Sql代碼
  1. SELECT  employee_id,last_name,department_name  
  2. FROM  employees e,departments d  
  3. <strong>WHERE  e.department_id=d.department_id  AND  e.manager_id=d.manager_id</strong>;  
SELECT employee_id,last_name,department_name
FROM employees e,departments d
WHERE e.department_id=d.department_id AND e.manager_id=d.manager_id
;

三張表連接

Sql代碼
  1. SELECT  employee_id,city,department_name  
  2. FROM  employees e,departments d,locations l  
  3. <strong>WHERE  e.department_id=d.department_id  AND  d.location_id = l.location_id</strong>;  
SELECT employee_id,city,department_name
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id AND d.location_id = l.location_id
;

 

 

Self join 自己連接自己   (是內連接,連接字段爲null值或不能實現“拉手”連接的行,不會出 現在連接結果集合中)

同一張表起兩個不同的別名,實現連接自己

 

下面是SQL標準的語法:

 

Sql代碼
  1. SELECT  w.last_name emp,m.last_name mgr  
  2. FROM  <strong>employees w</strong>  JOIN  <strong>employees m</strong>  
  3. ON  w.manager_id=m.employee_id;  
SELECT w.last_name emp,m.last_name mgr
FROM employees w
 JOIN employees m

ON w.manager_id=m.employee_id;

下面是Oracle的語法:

 

Sql代碼
  1. SELECT  w.last_name emp,m.last_name mgr  
  2. FROM  employees w,employees m  
  3. WHERE  w.manager_id = m.employee_id;  
 SELECT w.last_name emp,m.last_name mgr
 FROM employees w,employees m
 WHERE w.manager_id = m.employee_id;

 

 

Nonequijoins 不等連接   (是內連接,連接字段爲null值或不能實現“拉手”連接的行,不會 出現在連接結果集合中)

連接的條件不是“等於”,是在一個範圍內。

t1員工表, t2是工資檔次表 , 求員工的工資在哪個檔次之間。

t1 join t2 on  t1.工資 between t2.本檔最低工資  and   t2.本檔最高工資

 

 

Outer jion 外連接   (是外連接,連接字段爲null值或不能實現“拉手”連接的行,會現在連接 結果集合中)

--left outer join 左外連接

SQL標準語法:

Sql代碼
  1. SELECT  e.last_name,d.department_name  
  2. FROM  employees e <strong> LEFT   OUTER   JOIN </strong> departments d  
  3. ON  e.department_id = d.department_id;  
SELECT e.last_name,d.department_name
FROM employees e LEFT OUTER JOIN
 departments d
ON e.department_id = d.department_id;

Oracle語法: 在右邊表加一個(+)

Sql代碼
  1. SELECT  e.last_name,d.department_name  
  2. FROM  employees e ,departments d  
  3. WHERE  e.department_id = d.department_id(+);  
SELECT e.last_name,d.department_name
FROM employees e ,departments d
WHERE e.department_id = d.department_id(+);

 

--right outer join 右外連接

SQL標準語法:

Sql代碼
  1. SELECT  e.last_name,d.department_name  
  2. FROM  employees e <strong> RIGHT   OUTER   JOIN </strong> departments d  
  3. ON  e.department_id = d.department_id;  
SELECT e.last_name,d.department_name
FROM employees e RIGHT OUTER JOIN
 departments d
ON e.department_id = d.department_id;

Oracle語法:在左邊表加一個(+)

Sql代碼
  1. SELECT  e.last_name,d.department_name  
  2. FROM  employees e ,departments d  
  3. WHERE  e.department_id(+) = d.department_id;  
SELECT e.last_name,d.department_name
FROM employees e ,departments d
WHERE e.department_id(+) = d.department_id;

 

--full outer join 全連接

SQL標準語法:

Sql代碼
  1. SELECT  e.last_name,d.department_name  
  2. FROM  employees e <strong> FULL   OUTER   JOIN </strong> departments d  
  3. ON  e.department_id = d.department_id;  
SELECT e.last_name,d.department_name
FROM employees e FULL OUTER JOIN
 departments d
ON e.department_id = d.department_id;

Oracle語法:

Sql代碼
  1. 不 知  
不知

 

 

Cartesian product   笛卡兒積

--Corss join

第一張表有n條記錄,第二張表有m條記錄, 連接後會生成 n*m條記錄的表。

當連接表時, 條件失效,會把所有的可能連接都連接一次,就會形成n*m條記錄的新表。

我們應避免笛卡兒積,只有想生成大量測試數據來填充表進才使用

SQL標準語法:

Sql代碼
  1. SELECT  last_name,department_name  
  2. FROM  employees  
  3. CROSS   JOIN  departments;  
SELECT last_name,department_name
FROM employees
CROSS JOIN departments;

Oracle語法:

   就是不要where條件。

 

 

 

---------------------------insert部分-------------------------------

插入一條:

Sql代碼
  1. INSERT   INTO  departments (department_id,department_name,manager_id,location_id)  
  2. VALUES  ( 71, 'Public Relaations' ,100,1700);  
INSERT INTO departments (department_id,department_name,manager_id,location_id)
VALUES ( 71,'Public Relaations',100,1700);

 
批量插入:

INSERT INTO 表名 字段(一致)   SELECT     字段(一致)  FROM  表名

Sql代碼
  1. INSERT   INTO  copy_departments  
  2. SELECT  *  FROM  departments;  
  3.   
  4. 由 於兩個表的 字段的數據類型,字段的順序都一樣,所以省略了字段名。  
INSERT INTO copy_departments
SELECT * FROM departments;

由於兩個表的 字段的數據類型,字段的順序都一樣,所以省略了字段名。

 
---------------------------update部分 -------------------------------

UPDATE 表名 SET  列=值,列=值  WHERE  條件

UPDATE 表名 SET  列=(子查詢),列=(子查詢)  WHERE  條件=(子查詢)



---------------------------detete部分 -------------------------------

DELETE [FROM] 表名 WHERE 條件

DELETE [FROM] 表名 WHERE 條件=(子查詢)


---------------------------- 管理表-----------------------------------

複製表:

CREATE TABLE copy_departments AS SELECT * FROM departments;

 

 清空表:

 TRUNCATE TABLE copy_departments;

 與delete的不同是,TRUNCATE 不可以容易的回滾。

 

創建表:

CREATE TABLE [schema.]表名 ( column 數據類型 [default expr ]);

 

    創建:

Sql代碼
  1.   CREATE   TABLE  t3  
  2.  (id int ,  
  3.  dname varchar2(14),  
  4.  age number(5),  
  5.  hire_date DATE   DEFAULT  SYSDATE);  
 CREATE TABLE t3
 (id int,
 dname varchar2(14),
 age number(5),
 hire_date DATE DEFAULT SYSDATE);

    查看錶結構:

Sql代碼
  1. SQL>  DESC   t3  
  2.  名 稱                                      是否爲空? 類型  
  3.  ----------------------------------------- -------- ----------------------------   
  4.  ID                                                 NUMBER(38)  
  5.  DNAME                                              VARCHAR2(14)  
  6.  AGE                                                NUMBER(5)  
  7.  HIRE_DATE                                          DATE   
SQL> DESC  t3
 名稱                                      是否爲空? 類型
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(38)
 DNAME                                              VARCHAR2(14)
 AGE                                                NUMBER(5)
 HIRE_DATE                                          DATE

 

用子查詢創建表:

語法:CREATE TABLE tablename [(新列名,新列名...)]  AS 子查詢

新列名可以省略,新列名的數量要與 子查詢的列數量一列。

如果子查詢某列是表達式無列名,要起別名。

原表的約束,只有not null約束會傳遞給新表,其它約束丟失不傳遞。

 

Sql代碼
  1. CREATE   TABLE  t8  as   select  *   from   employees;  
  2. 建 了一個t8表,與employees一樣, employees原有的約束只有not   null 約束會傳遞給t8表,其實約束丟失不傳遞。  
 CREATE TABLE t8 as select *  from  employees;
創建了一個t8表,與employees一樣, employees原有的約束只有not null約束會傳遞給t8表,其實約束丟失不傳遞。

 

Sql代碼
  1. CREATE   TABLE  t7 (new_id,new_name)  as   select  employee_id,last_name  from   employees;  
  2.   
  3. 建 了t7表,有new_id,new_name兩個字段,數據來源於employees的employee_id,last_name 兩個字段  
 CREATE TABLE t7 (new_id,new_name) as select employee_id,last_name from  employees;

創建了t7表,有new_id,new_name兩個字段,數據來源於employees的employee_id,last_name 兩個字段

 

Sql代碼
  1. CREATE   TABLE  t9  AS   
  2. SELECT  employee_id,last_name,  
  3. salary*12 ANNSAL,  // 表達式無列名,同時又沒有指定新列名,這時要起別名。  或者在AS 前指定新列 名。  
  4. HIRE_DATE  
  5. FROM  employees  
  6. WHERE   department_id=80;  
 CREATE TABLE t9 AS
 SELECT employee_id,last_name,
 salary*12 ANNSAL,  //表達式無列名,同時又沒有指定新列名,這時要起別名。  或者在AS前指定新列名。
 HIRE_DATE
 FROM employees
 WHERE  department_id=80;

 

刪除表:

DROP TABLE table_name;

DROP TABLE table_name PURGE; 被刪除表不進回收站,直接刪除。(10G新加的功能)

 

修改表:

ALTER TABLE  ....  略。。。
---------------------------- 事務-----------------------------------------------

事務什麼時候會開始與結束--事務的邊界:

1 開始執行一條DML語句時,比如insert,會自動開啓一個新事務。

2 當COMMIT 或 ROLLBACK 時,事務會結束。

3 當開始一個DDL 或 DCL 語句時,前面的事務會提交,因爲DDL ,DCL語句要在一個單獨的事務中執行。

4 用戶正常退出SQLplus時會提交事務。

5 當ORACLE系統死掉掛掉,再重新啓動後,會回滾之前沒有提交的事務。

 

COMMIT               提交事務

ROLLBACK            回滾事務

SAVEPOINT a       定義保存點a

ROLLBACK TO  a  回滾到保存點a

 

---------------------------- 常用的數據庫對象---------------------------------

table           表

view           視圖

sequence   序列

index          索引

synonym    同義詞

存儲過程

觸發器

 

    查看用戶對象

Sql代碼
  1. SELECT  object_name,object_type  FROM  user_objects;  
 SELECT object_name,object_type FROM user_objects;

 

-------------------------------命名規則 ----------------------------------------

1 必須以字母開頭

2 最大長度爲30

3 A-Z,a-z,0-9,_,$,#   範圍內

4 不能包含Oracle保留關鍵字

-------------------------------數據類型 ----------------------------------------

VARCHAR2(size)

VARCHAR2(200 CHAR)

CHAR(size)

NUMBER(p,s)

DATE

CLOB

BLOB

BFILE一個大文件保存在操作系統上,Oracle保存一個指針

FOWID每個表都有一列叫rowid

TIMESTAMP

---------------------------------常用的約束 -----------------------------------

NOT NULL   非空

UNIQUE      唯一

PRIMARY KEY   主鍵

FOREIGN KEY  外鍵

CHECK            自定義

 

 

創建表時在字段後添加主鍵約束:  

Sql代碼
  1. CREATE   TABLE  t5 ( emp_id number(4)  PRIMARY   KEY  , dname varchar2(14)  NOT   NULL , age number(5)   NOT   NULL , hire_date  DATE   DEFAULT  SYSDATE);  
 CREATE TABLE t5 ( emp_id number(4) PRIMARY KEY , dname varchar2(14) NOT NULL, age number(5)  NOT NULL, hire_date DATE DEFAULT SYSDATE);

 

員工表 (EMPLOYEES)的建表語句:

Sql代碼
  1. CREATE   TABLE   "HR" . "EMPLOYEES"    
  2.    (    "EMPLOYEE_ID"  NUMBER(6,0),   
  3.     "FIRST_NAME"  VARCHAR2(20),   
  4.     "LAST_NAME"  VARCHAR2(25)  CONSTRAINT   "EMP_LAST_NAME_NN"   NOT   NULL  ENABLE,   
  5.     "EMAIL"  VARCHAR2(25)  CONSTRAINT   "EMP_EMAIL_NN"   NOT   NULL  ENABLE,   
  6.     "PHONE_NUMBER"  VARCHAR2(20),   
  7.     "HIRE_DATE"   DATE   CONSTRAINT   "EMP_HIRE_DATE_NN"   NOT   NULL  ENABLE,   
  8.     "JOB_ID"  VARCHAR2(10)  CONSTRAINT   "EMP_JOB_NN"   NOT   NULL  ENABLE,   
  9.     "SALARY"  NUMBER(8,2),   
  10.     "COMMISSION_PCT"  NUMBER(2,2),   
  11.     "MANAGER_ID"  NUMBER(6,0),   
  12.     "DEPARTMENT_ID"  NUMBER(4,0),   
  13.      CONSTRAINT   "EMP_SALARY_MIN"   CHECK  (salary > 0) ENABLE,   
  14.      CONSTRAINT   "EMP_EMAIL_UK"   UNIQUE  ( "EMAIL" )  
  15.   USING INDEX  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE  STATISTICS    
  16.   STORAGE(INITIAL 65536 NEXT  1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  
  17.   PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT )  
  18.   TABLESPACE "USERS"   ENABLE,   
  19.      CONSTRAINT   "EMP_EMP_ID_PK"   PRIMARY   KEY  ( "EMPLOYEE_ID" )  
  20.   USING INDEX  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE  STATISTICS    
  21.   STORAGE(INITIAL 65536 NEXT  1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  
  22.   PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT )  
  23.   TABLESPACE "USERS"   ENABLE,   
  24.      CONSTRAINT   "EMP_DEPT_FK"   FOREIGN   KEY  ( "DEPARTMENT_ID" )  
  25.       REFERENCES   "HR" . "DEPARTMENTS"  ( "DEPARTMENT_ID" ) ENABLE,   
  26.      CONSTRAINT   "EMP_JOB_FK"   FOREIGN   KEY  ( "JOB_ID" )  
  27.       REFERENCES   "HR" . "JOBS"  ( "JOB_ID" ) ENABLE,   
  28.      CONSTRAINT   "EMP_MANAGER_FK"   FOREIGN   KEY  ( "MANAGER_ID" )  
  29.       REFERENCES   "HR" . "EMPLOYEES"  ( "EMPLOYEE_ID" ) ENABLE  
  30.    ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING  
  31.   STORAGE(INITIAL 65536 NEXT  1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  
  32.   PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT )  
  33.   TABLESPACE "USERS"    
CREATE TABLE "HR"."EMPLOYEES" 
   (	"EMPLOYEE_ID" NUMBER(6,0), 
	"FIRST_NAME" VARCHAR2(20), 
	"LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE, 
	"EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE, 
	"PHONE_NUMBER" VARCHAR2(20), 
	"HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE, 
	"JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE, 
	"SALARY" NUMBER(8,2), 
	"COMMISSION_PCT" NUMBER(2,2), 
	"MANAGER_ID" NUMBER(6,0), 
	"DEPARTMENT_ID" NUMBER(4,0), 
	 CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE, 
	 CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
	 CONSTRAINT "EMP_EMP_ID_PK" PRIMARY KEY ("EMPLOYEE_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
	 CONSTRAINT "EMP_DEPT_FK" FOREIGN KEY ("DEPARTMENT_ID")
	  REFERENCES "HR"."DEPARTMENTS" ("DEPARTMENT_ID") ENABLE, 
	 CONSTRAINT "EMP_JOB_FK" FOREIGN KEY ("JOB_ID")
	  REFERENCES "HR"."JOBS" ("JOB_ID") ENABLE, 
	 CONSTRAINT "EMP_MANAGER_FK" FOREIGN KEY ("MANAGER_ID")
	  REFERENCES "HR"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" 

 

 

修改約束:

primary key的語法:

alert table table_name add constraint key_name primary key(columns);

 

unique key的語法:

alert table table_name add contraint key_name unique(columns);

 

刪 除約束:

ALTER TABLE table_name DROP PRIMARY KEY

 

--------------------------------------------------視圖 View------------------------------------------------------------

 

創建視圖的語法:

 

UPDATE視圖:

視圖通常是用來讀的,不過也可以有條件的UPDATE視圖中的記錄,

比如經過avg()一類的聚合函數計算出來的平均值就不能修改,

group by 分組出來的數據就不能修改,DISTINCT過濾後的數據,ROWNUM列做爲視圖中的一列時,表達式計算出來的結果,都不能修改

而與基表一一對應的項目就可以修改。

修改時使用UPDATE語句,與修改一般表一樣的。

 

ALTER VIEW :

略,請查詢聯機文檔

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_4004.htm#SQLRF01104

 

刪除視圖:

DROP VIEW view_name;

--------------------------------------------------序列  Sequence-----------------------------------------------------

創建序列:

CREATE SEQUENCE squence_name;

 

刪除序列:

DROP SEQUENCE squence_name;

 

查出序列值 - 下一個值 ,取出後,原值加1:

SELECT squence_name.NEXTVAL FROM dual;

 

查出序列值 - 當前值,取出後,原值不變:

SELECT squence_name.CURRVAL FROM dual;

 

使用序列:

INSERT INTO 表 (主鍵字段,其它字段... ) VALUES (squence_name.NEXTVAL , 其它值...);

 

 

--------------------------------------------------索引  Index----------------------------------------------------------

語法:

Sql代碼
  1. CREATE  [ UNIQUE ] [BITMAP]  INDEX  index_name  
  2. N 表 名(列名 [,列名]... );  
 CREATE [UNIQUE] [BITMAP] INDEX index_name
ON 表名(列名 [,列名]... );

 

 

創建索引:

Sql代碼
  1. CREATE   INDEX  emp_last_name_idx  ON  employees(last_name);  
 CREATE INDEX emp_last_name_idx ON employees(last_name);

 

刪除索引:

Sql代碼
  1. DROP   INDEX  index_name;  
DROP INDEX index_name;

 

--------------------------------------------------同義詞 Synonym----------------------------------------------------

 同義詞就是爲一個對象起一個別名。

 

語法:

Sql代碼
  1. CREATE  [ PUBLIC ] SYNONYM synonym_name  FOR  object;  
  2.   
  3. 不 加PUBLIC ,這個同義詞就保存在當前用戶的對象,加了 PUBLIC ,這個同義詞就不只是當前用戶的,其它用戶也可以使用。  
CREATE [PUBLIC] SYNONYM synonym_name FOR object;

不加PUBLIC,這個同義詞就保存在當前用戶的對象,加了PUBLIC,這個同義詞就不只是當前用戶的,其它用戶也可以使用。

 

 

創建同義詞:

Sql代碼
  1. CREATE  SYNONYM d_sum  
  2. FOR   數據庫對象;  
CREATE SYNONYM d_sum
FOR  數據庫對象;

 

 

刪除同義詞:

Sql代碼
  1. DROP  SYNONYM  d_sum(同義詞的名稱)  
DROP SYNONYM  d_sum(同義詞的名稱)

 

 

 說明:如果需要 HR用戶下所需的表,請留言我 我會提供給大家 謝謝!

 

發佈了47 篇原創文章 · 獲贊 23 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章