ORACLE SQL and SQL*PLUS (strong recommend)

jshecn發表於2008-06-25

ORACLE SQL and SQL*PLUS 語句介紹

[@more@]

前言: 關聯式資料庫的簡單介紹
1970.Dr.E.F.codded 建立了關聯式資料庫的模型(類似現在常用的二維表格)
關聯式資料庫由許多資料物件組成, 被關係操作SQL命令管理著, 資料之間有完整性的約束條件.
RDBMS ( relational database management system )
ORDBMS ( object relational database management system )
ORACLE RDBMS常稱為ORACLE SERVER
它的核心是用C語言寫的.

ORACLE的簡單介紹
ORACLE公司是一家提供綜合技術產品、方案、服務的資料庫公司
ORACLE資料庫設計成可大量儲存資料,快速查詢資料,保證資料的安全和一致性,
跨網路的分散式管理及客戶-伺服器的配置等。
ORACLE SQL語法符合ANSI 1986標準
SQL 和資料庫交流的命令式語言
SQL*PLUS ORACLE的一種工具, 用來執行SQL和PL/SQL語句
PL/SQL ORACLE的過程化程式語言

一、選擇行
1. 簡單的SELECT 語句
SELECT [DISTINCT] {*,COLUMN [ALIAS], ……} FROM table_name;
欄位的非唯一的結果集
DISTINCT 欄位名1 [ ,欄位名2]
數字型別欄位名之間可以進行算術運算
+ - * / 等
例如: (欄位名1*欄位名2)/3
合併欄位內容的連線字元 ||
欄位名1 || 欄位名2
欄位可以有別名
SELECT 欄位名1 [AS] '欄位名1 解釋' FROM table;

2. 處理NULL
NULL 未定義,不可操作,什麼都不是
NULL != 0 NULL!='空格'
和NULL的任何運算都返回NULL
ORACLE裡未定義的變數值都為NULL
NVL函式可把NULL轉換成其它型別的符號
NVL(EXPR1, EXPR2)函式
解釋: IF EXPR1=NULL RETURN EXPR2
ELSE RETURN EXPR1
程式設計技巧: NVL函式在多條件模糊查詢的時候比較有用
nvl('+input_value+','0')='0' or filed_name like '%+input_value+%'
NVL函式可返回多種資料型別:
返回日期 NVL(start_date,'2002-02-01')
返回字串 NVL(title,'no title')
返回數字 NVL(salary,1000)

3. 使用SQL*PLUS(1)
登入SQL*PLUS的方法
使用者名稱,密碼,資料庫連線字串
資料庫連線字串可以用net8 easy configuration建立本地網路服務名配置,
也可以手工編輯$ORACLE_HOME/network/admin/tnsnames.ora檔案。
在UNIX系統下不要用
$sqlplus username/password@dbname
這樣別的使用者用$ps命令能看出使用者的密碼
SQL> desc table; 顯示錶結構
SQL> select * from tab; 檢視使用者下所有的表
SQL> set pause on; 可以使大量結果集在使用者按“Enter”(回車)後翻頁
SQL> set pagesize 100; 設定SQL語句返回結果集一頁的行數100, 預設值是14
SQL> set linesize 100; 設定SQL語句返回結果集一行的寬度100, 預設值是80

3. 使用SQL*PLUS(2)SQL*PLUS裡的編輯命令
最近一條SQL命令語句存在ORACLE記憶體(sql buffer)裡,但SQL*PLUS命令卻不會存進去。
SQL*PLUS裡的編輯命令:
A[PPEND] text 把text增加到當前行後面
C[HANGE] /old/new/ 把當前行old符號替換成new符號,new為空,刪除old符號
CL[EAR] BUFF[ER] 從sql buffer裡刪除所有的行
DEL n 刪除sql buffer裡第n行
I[NPUT] text 在sql buffer後面插入text
L[IST] n 顯示sql buffer裡第n行
n 使第n行為當前行
n text 第n行替換成text
0 text 在第一行前面插入一行

3. 使用SQL*PLUS(3) SQL*PLUS裡的檔案命令:
SAV[E] filename [REP[LACE] | APP[END] ]
把sql buffer裡的SQL命令存到OS下一個檔案filename,預設的檔名字尾為.sql.
REP[LACE]替換filename裡的SQL命令
APP[END] 把sql buffer裡的SQL命令新增到filename後
GET filename 從filename裡把SQL命令讀到sql buffer
STA[RT] filename 執行上次儲存到檔案filename裡的SQL命令
@filename 執行上次儲存到檔案filename裡的SQL命令
EDIT 開啟編輯視窗,編輯sql buffer裡的SQL命令
EDIT filename 開啟編輯視窗,編輯檔案filename裡的SQL命令
SPO[OL] filename [OFF | OUT] 把SQL命令結果輸出到OS下一個檔案filename OFF結束輸出到檔案, OUT結束輸出到檔案並列印檔案

4. SQL*PLUS裡規定欄位的顯示格式
規定數字的顯示格式
SQL>column 欄位名 format 99999999999;
SQL>column 欄位名 format 999,999,999,999;
規定字串的顯示寬度
SQL>column 欄位名 format a數字 [word_wrapped];
說明: 一行只顯示數字位的長度, 超過長度折行,加word_wrapped後, 單詞不會折行
規定long字元的顯示寬度
SQL>set long 200;
規定欄位名的顯示內容
SQL> column 欄位名 heading '欄位名顯示內容';
SQL> set heading off; 查詢時不顯示欄位名稱
規定欄位的對齊方向
SQL> column 欄位名 justify [left | right | center];
清除欄位的格式
SQL> column 欄位名 clear;

5. SQL*PLUS裡規定欄位的顯示格式例子
SQL> column last_name heading 'Employee|Name' format a15;
SQL> column salary justify right format $99,999.99;
SQL> column start_date format a10 null 'Not Hired';
說明:如果start_date為null, 顯示字串'Not Hired'

6. 判斷題(T/F)
(1). SQL command are always held in sql buffer. [T]
(2). SQL*PLUS command assit with query data. [T]
SQL*PLUS命令只控制SELECT結果集的顯示格式及控制檔案.只有SQL命令能訪問資料庫.

二、限制選擇行
1. 按指定的規則排序
SELECT expr FROM table [ORDER BY {column, expr} [ASC | DESC] ];
預設的排序是ASC升序(由小到大)
還可以ORDER BY 欄位名的位置[1]| [2] ASC| DESC;
當欄位名很複雜或者是算術表示式時用欄位名顯示的位置排序很方便.

2. 用WHERE限制選擇行(1)
比較運算子 = > < >= <= != <> ^= 與NULL比較不能用上面的比較運算子 ANY SOME ALL
SQL運算子 BETWEEN … AND… IN LIKE IS NULL
NOT BETWEEN … AND… NOT IN NOT LIKE IS NOT NULL
邏輯運算子 AND OR NOT

3. 用WHERE限制選擇行(2)
比較順序(可以用括號改變它們的順序)
(1). = < > >= <= in like is null between
(2). and
(3). Or
注意: char和varchar2的比較規則有不同:
char比較時會忽略字串後面的空格. varchar2會計算字串後面的空格

4. LIKE操作
% 零到任意多個字元 _ 一個字元
例如: 欄位名 like 'M%' 欄位名 like '%m%' 欄位名 like 'job_'
如果要找含下劃線的字元, 要加反斜線 例如:欄位名 like '%X/_Y%' escape '/'

5. 日期欄位的比較
舉例:
日期欄位 between to_date('2001-12-12','YYYY-MM-DD') and to_date('2002-02-01','YYYY-MM-DD')
日期欄位> to_date('2001-12-12','YYYY-MM-DD') and日期欄位<= to_date('2002-02-01','YYYY-MM-DD');

6. 不能用到索引的比較運算子
IS NULL
IS NOT NULL
LIKE '%m%'

三、單行函式
1. 數字函式
ABS 取絕對值 POWER 乘方 LN 10為底數取冪
SQRT 平方根 EXP e的n次乘方 LOG(m,n) m為底數n取冪
數學運算函式:ACOS ATAN ATAN2 COS COSH SIGN SIN SINH TAN TANH
CEIL 大於或等於取整數
FLOOR 小於或等於取整數
MOD 取餘數
ROUND(n,m) 按m的位數取四捨五入值如果round(日期): 中午12以後將是明天的日期. round(sysdate,'Y')是年的第一天
TRUNC(n,m) 按m的位數取前面的數值如果trunc(日期), 確省的是去掉時間

2. 字元函式
CHR 按資料庫的字符集由數字返回字元
CONCAT(c1,c2) 把兩個字元c1,c2組合成一個字元, 和 || 相同
REPLACE(c,s,r) 把字元c裡出現s的字元替換成r, 返回新字元
SUBSTR(c,m,n) m大於0,字元c從前面m處開始取n位字元,m等於0和1一樣,
m小與0,字元c從後面m處開始取n位字元
TRANSLATE(c,f1,t1) 字元c按f1到t1的規則轉換成新的字串
INITCAP 字元首字母大寫,其它字元小寫
LOWER 字元全部小寫
UPPER 字元全部大寫
LTRIM(c1,c2) 去掉字元c1左邊出現的字元c2
RTRIM(c1,c2)
TRIM(c1,c2) 去掉字元c1左右兩邊的字元c2
LPAD(c1,n,c2) 字元c1按制定的位數n顯示不足的位數用c2字串替換左邊的空位
RPAD(c1,n,c2)

3. 日期函式
ADD_MONTHS(d,n) 日期值加n月
LAST_DAY(d) 返回當月的最後一天的日期
MONTHS_BETWEEN(d1,d2) 兩個日期值間的月份,d1NEXT_DAY(d) 返回日期值下一天的日期
SYSDATE 當前的系統時間
DUAL是SYS使用者下一個空表,它只有一個欄位dummy
4. 轉換函式(1)
TO_CHAR(date,'日期顯示格式')
TO_CHAR(number) 用於顯示或報表的格式對齊
TO_DATE(char,'日期顯示格式')
TO_LOB 把long欄位轉換成lob欄位
TO_NUMBER(char) 用於計算或者比較大小

4. 轉換函式(2)
to_date裡日期顯示格式
YYYY 年 YEAR YYY YY Y
Q 季度
MM 月 MONTH MON
W 星期 (week of month) WW, IW (week of year)
(說明:周計是按ISO標準,從1月1日的星期數到後面七天為一週,不一定是從週一到週日)
DD 日 DAY DY
HH24 小時 HH12 HH
MI 分鐘
SS 秒
如果想固定日期的顯示格式可以在資料庫的引數檔案initorasid.ora裡新寫一行引數 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX環境變數或者NT的登錄檔裡的設定 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss

4. 轉換函式(3)
如果想固定日期的顯示格式可以用alter session命令改變
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
它的作用順序如下:
initialization parameter
Environment variable
ALTER SESSION command

4. 轉換函式 (4)
to_char(number)裡數字顯示格式
9 數字位
0 數字前面補0 to_char(-1200,'00000.00')
. 小數點的位置
, 標記位置的逗號 用在數字顯示格式的左邊
L 根據資料庫字符集加貨幣符號 to_char(-1200,'L9999.99')
B 把數字0顯示為空格,用在數字顯示格式的右邊

MI 右邊的負數標記 to_char(-1200,'9999.99MI')
PR 括起來的負數 to_char(-1200,'9999.99PR')
EEEE 用指數方式表示 to_char(-1200,'9999.99EEEE')

5. 輸入字元,返回數字的函式
instr(c1,c2) 字元c2出現在c1的位置, 不出現, 返回0, 常用於模糊查詢
length© 按資料庫的字符集,算出字元c的長度,跟資料庫的字符集有關, 一個漢字長度為1

6. 有邏輯比較的函式NVL(EXPR1, EXPR2)函式
解釋: IF EXPR1=NULL RETURN EXPR2
ELSE RETURN EXPR1
DECODE(AA,V1,R1,V2,R2....)函式
解釋: IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..…
ELSE
RETURN NULL

四、從多個表裡選取資料記錄
1. 資料表間的連線
簡單的連線語法:
SELECT 欄位名1, 欄位名2, …… FROM 表名1, [表名2, ……]
WHERE 表名1.欄位名 = 表名2. 欄位名 [ AND ……] ;
SELECT 欄位名1, 欄位名2, …… FROM 表名1, [表名2, ……]
WHERE 表名1.欄位名 = 表名2. 欄位名(+) [ AND ……] ;
有(+)號的欄位位置自動補空值

連線的分類:
等於的連線 =
不等於的連線 != BETWEEN … AND … IN 注意IN和OR不能一起用
外連線 有一個欄位名(+) , 沒有滿足的條件補空值
自連線 同一個表自己跟自己連線 例如找重複記錄

2. 資料表間的連線例子
刪除table_name表裡欄位名email重複的記錄:
SQL>delete from table_name t1
where t1.rowid >
(select min(rowid) from table_name t2
where t1.email = t2.email
group by email
having count(email) > 1);

找到手機使用者的服務區域:
SQL> select a.handphoneno,nvl(c.name,'null'),a.totalscore
from topscore a,chargeoperator cc,chargeoperatorinfo c
where substr(a.handphoneno,1,7)=cc.hpnohead(+)
and cc.chargetype=c.chargetype(+)
order by a.totalscore desc;

3. 資料表間的連線技巧
連線N個表, 需要N-1個連線操作
被連線的表最好建一個單字元的別名, 欄位名前加上這個單字元的別名
BETWEEN .. AND.. 比用 >= AND <= 要好
連線操作的欄位名上最好要有索引
連線操作的欄位最好用整數數字型別
有外連線時, 不能用OR或IN的比較操作

4. 如何分析和執行SQL語句
寫多表連線SQL語句時要知道它的分析執行計劃的情況.
Sys使用者下執行@/ORACLE_HOME/sqlplus/admin/plustrce.sql
產生plustrace角色
Sys使用者下把此角色賦予一般使用者 SQL> grant plustrace to &username;
一般使用者下執行@/ORACLE_HOME/rdbms/admin/utlxplan.sql
產生plan_table
SQL> set time on; 說明:開啟時間顯示
SQL> set autotrace on; 說明:開啟自動分析統計,並顯示SQL語句的執行結果
SQL> set autotrace traceonly; 說明:開啟自動分析統計,不顯示SQL語句的執行結果
接下來你就執行測試SQL語句,看到其分析統計結果了。
一般來講,我們的SQL語句應該避免大表的全表掃描。
SQL> set autotrace off; 說明:關閉自動分析統計

五、集合函式 經常和group by一起使用
1. 集合函式列表
AVG (DISTINCT | ALL | N) 取平均值
COUNT (DISTINCT | ALL | N | expr | * ) 統計數量
MAX (DISTINCT | ALL | N) 取最大值
MIN (DISTINCT | ALL | N) 取最小值
SUM (DISTINCT | ALL | N) 取合計值
STDDEV (DISTINCT | ALL | N) 取偏差值,如果組裡選擇的內容都相同,結果為0
VARIANCE (DISTINCT | ALL | N) 取平方偏差值

2. 使用集合函式的語法
SELECT column, group_function FROM table
WHERE condition GROUP BY group_by_expression
HAVING group_condition ORDER BY column;

3. 使用count時的注意事項
SELECT COUNT(*) FROM table;
SELECT COUNT(常量) FROM table;

都是統計表中記錄數量,如果沒有PK後者要好一些
SELECT COUNT(all 欄位名) FROM table;
SELECT COUNT(欄位名) FROM table;

不會統計為NULL的欄位的數量
SUM,AVG時都會忽略為NULL的欄位

4. 用group by時的限制條件
SELECT欄位名不能隨意, 要包含在GROUP BY的欄位裡
GROUP BY後ORDER BY時不能用位置符號和別名
限制GROUP BY的顯示結果, 用HAVING條件

5. 例子
SQL> select title,sum(salary) payroll from s_emp
where title like 'VP%' group by title
having sum(salary)>5000 order by sum(salary) desc;

找出某表裡欄位重複的記錄數, 並顯示
SQL> select (duplicate field names) from table_name
group by (list out fields) having count(*)>1;

6. 判斷題(T/F)
(1) Group functions include nulls in calculations [F]
(2) Using the having clause to exclude rows from a group calculation [F]
解釋:
Group function 都是忽略NULL值的 如果您要計算NULL值, 用NVL函式
Where語句在Group By前把結果集排除在外Having語句在Group By後把結果集排除在外

7. 在SQL*PLUS裡可使用的其它命令:

Ctrl^C 終止正在執行的SQL語句
remark /*...*/ -- 註釋符號
HOST 可執行的作業系統下的命令 有些unix可以用 !

BREAK ON column_name SKIP n [ ON column_name SKIP n ]
按欄位的名稱column_name分隔顯示,更清晰,SKIP n 是在分隔處空行的數量n
BREAK ON ROW SKIP n 每一行間隔都放n個空行

COMPUTE 集合運算子 OF 欄位1 ON 欄位2 按欄位2對欄位1進行集合運算
COMPUTE後面可以跟的集合運算子:
SUM MINIMUM MAXIMUM AVG STD VARIANCE COUNT NUMBER

8.在SQL*PLUS裡可使用的其它命令舉例:(scott使用者)

BREAK ON REPORT
COMPUTE SUM LABEL TOTAL OF SAL ON REPORT 在全部結果集後面算合計
select ename,sal from emp where job='SALESMAN';

COMPUTE AVG LABEL avg OF SAL ON REPORT 在全部結果集後面算平均值
/ 再次執行上次的sql語句

break on DEPTNO skip 2 on JOB skip 1 在BREAK欄位結果集後面算合計
COMPUTE SUM OF SAL ON DEPTNO
SELECT DEPTNO,JOB,ENAME,SAL FROM EMP ORDER BY DEPTNO,JOB;

SQL> CLEAR BREAKS; 清除設定的BREAK條件
SQL> CLEAR COMPUTES; 清除設定的COMPUTE條件

六、子查詢
1. 查詢語句可以巢狀
例如: SELECT …… FROM (SELECT …… FROM表名1, [表名2, ……] WHERE 條件) WHERE 條件2;

2. 何處可用子查詢?
當查詢條件是不確定的條件時
DML(insert, update,delete)語句裡也可用子查詢
HAVING裡也可用子查詢

3. 兩個查詢語句的結果可以做集合操作
例如:
並集UNION(去掉重複記錄)
並集UNION ALL(不去掉重複記錄)
差集MINUS,
交集INTERSECT

4. 子查詢的注意事項
先執行括號裡面的SQL語句,一層層到外面
內部查詢只執行一次
如果裡層的結果集返回多個,不能用= > < >= <=等比較符要用IN.

5. 子查詢的例子(1)
SQL> select title,avg(salary) from s_emp
group by title Having avg(salary) =
(select min(avg(salary)) from s_emp
group by title);
找到最低平均工資的職位名稱和工資

5. 子查詢的例子(2)
子查詢可以用父查詢裡的表名
這條SQL語句是對的:
SQL>select cty_name from city where st_code in
(select st_code from state where st_name='TENNESSEE' and
city.cnt_code=state.cnt_code);
說明:父查詢呼叫子查詢只執行一次.

6.取出結果集的80 到100的SQL語句
ORACLE處理每個結果集只有一個ROWNUM欄位標明它的邏輯位置,
並且只能 用ROWNUM<100, 不能用ROWNUM>80。
以下是經過分析後較好的兩種ORACLE取得結果集80到100間的SQL語句( ID是唯一關鍵字的欄位名 ):
語句寫法:
SQL>select * from (
( select rownum as numrow, c.* from (
select [field_name,...] from table_name where 條件1 order by 條件2) c)
where numrow > 80 and numrow <= 100 )
order by 條件3;

七、在執行SQL語句時繫結變數
1. 接收和定義變數的SQL*PLUS命令
ACCEPT
DEFINE UNDEFINE
&

2. 繫結變數SQL語句的例子(1)
SQL> select id, last_name, salary from s_emp where dept_id = &department_number;
Enter value for department_number: 10
old 1: select id, last_name, salary from s_emp where dept_id=&department_number;
new 1: select id, last_name, salary from s_emp where dept_id= 10
SQL> SET VERIFY OFF | ON;可以關閉和開啟提示確認資訊old 1和new 1的顯示.

3. 繫結變數SQL語句的例子(2)
SQL> select id, last_name, salary
from s_emp
where title = '&job_title';
Enter value for job_title: Stock Clerk

SQL> select id, last_name, salary
from s_emp
where hiredate >to_date( '&start_hire_date','YYYY-MM-DD');
Enter value for start_hire_date : 2001-01-01

把繫結字串和日期型別變數時,變數外面要加單引號
也可繫結變數來查詢不同的欄位名
輸入變數值的時候不要加;等其它符號

4. ACCEPT的語法和例子
SQL> ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE]
說明: variable 指變數名 datatype 指變數型別,如number,char等 format 指變數顯示格式 prompt text 可自定義彈出提示符的內容text hide 隱藏使用者的輸入符號
使用ACCEPT的例子:
ACCEPT p_dname PROMPT 'Provide the department name: '
ACCEPT p_salary NUMBER PROMPT 'Salary amount: '
ACCEPT pswd CHAR PROMPT 'Password: ' HIDE
ACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):”

4. DEFINE的語法和例子
SQL> DEFINE variable = value
說明: variable 指變數名 value 指變數值
定義好了變良值後, 執行繫結變數的SQL語句時不再提示輸入變數
使用DEFINE的例子:
SQL> DEFINE dname = sales
SQL> DEFINE dname
DEFINE dname = “sales” (CHAR)
SQL> select name from dept where lower(name)='&dname';
NAME
-------------------------
sales
sales
SQL> UNDEFINE dname
SQL> DEFINE dname
Symbol dname is UNDEFINED

5. SQL*PLUS裡傳遞引數到儲存好的*.sql檔案裡
SQL> @ /路徑名/檔名 引數名1[,引數名2, ….]
SQL> start /路徑名/檔名 引數名1[,引數名2, ….]

注意事項:
一次最多隻能獲取9個&變數, 變數名稱只能是從&1,&2到&9
變數名後不要加特殊的結束符號
如果在SQL*PLUS裡要把&符號儲存在ORACLE資料庫裡,要修改sql*plus環境變數define
SQL> set define off;

八、概述資料模型和資料庫設計
1. 系統開發的階段:
Strategy and Analysis
Design
Build and Document
Transition
Production

2. 資料模型
Model of system in client's mind
Entity model of client's model
Table model of entity model
Tables on disk

3. 實體關係模型 (ERM)概念
ERM ( entity relationship modeling)
實體 存有特定資訊的目標和事件 例如: 客戶,訂單等
屬性 描述實體的屬性 例如: 姓名,電話號碼等
關係 兩個實體間的關係 例如:訂單和產品等
實體關係模型圖表裡的約定
Dashed line (虛線) 可選引數 “may be”
Solid line (實線) 必選引數 “must be”
Crow's foot (多線) 程度引數 “one or more”
Single line (單線) 程度引數 “one and only one”


4. 實體關係模型例子
每個訂單都必須有一個或幾個客戶
每個客戶可能是一個或幾個訂單的申請者

5. 實體關係的型別
1:1 一對一 例如: 計程車和司機
M:1 多對一 例如: 乘客和飛機
1:M 一對多 例如: 員工和技能

6. 校正實體關係的原則
屬性是單一值的, 不會有重複
屬性必須依存於實體, 要有唯一標記
沒有非唯一屬性依賴於另一個非唯一的屬性
7. 定義結構時的注意事項
減少資料冗餘
減少完整性約束產生的問題
確認省略的實體,關係和屬性

8. 完整性約束的要求
Primary key 主關鍵字 唯一非NULL
Foreign key 外來鍵 依賴於另一個Primary key,可能為NULL
Column 欄位名 符合定義的型別和長度
Constraint 約束條件 使用者自定義的約束條件,要符合工作流要求
例如: 一個銷售人員的提成不能超過它的基本工資
Candidate key 候選主關鍵字 多個欄位名可組成候選主關鍵字, 其組合是唯一和非NULL的

9. 把實體關係圖對映到關聯式資料庫物件的方法
把簡單實體對映到資料庫裡的表
把屬性對映到資料庫裡的表的欄位, 標明型別和註釋
把唯一標記對映到資料庫裡的唯一關鍵字
把實體間的關係對映到資料庫裡的外來鍵

其它的考慮:
設計索引,使查詢更快
建立檢視,使資訊有不同的呈現面, 減少複雜的SQL語句
計劃儲存空間的分配
重新定義完整性約束條件

10. 實體關係圖裡符號的含義
PK 唯一關鍵字的欄位
FK 外來鍵的欄位
FK1,FK2 同一個表的兩個不同的外來鍵
FK1,FK1 兩個欄位共同組成一個外來鍵
NN 非null欄位
U 唯一欄位
U1,U1 兩個欄位共同組成一個唯一欄位

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/64991/viewspace-1006127/,如需轉載,請註明出處,否則將追究法律責任。

相關文章