二、SQL
Structur query language
結(jié)構(gòu)化查詢(xún)語(yǔ)言,是操作關(guān)系型數(shù)據(jù)庫(kù)中的對(duì)象。
DDL(Data definition language 數(shù)據(jù)定義語(yǔ)言),用于建表或刪表操作,以及對(duì)表約束進(jìn)行修改
create table , alter table , drop table 對(duì)表結(jié)構(gòu)的增刪操作。
DML(Data manipulation language 數(shù)據(jù)操作語(yǔ)言),向表中插入紀(jì)錄,修改紀(jì)錄
insert , update , delete , merge
transaction ,事務(wù)控制語(yǔ)言,由DML語(yǔ)句組成的,commit; ,rollback;
select 查詢(xún)語(yǔ)句
dcl 授權(quán)語(yǔ)句 grant
三、Oracle
DBMS 數(shù)據(jù)庫(kù)管理系統(tǒng)
有Oracle提供,還提供AS,應(yīng)用服務(wù)器
DBA 數(shù)據(jù)庫(kù)管理員
四、相關(guān)操作
1、sqlplus 訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)命令(本地訪(fǎng)問(wèn)/遠(yuǎn)程訪(fǎng)問(wèn)),和數(shù)據(jù)庫(kù)建立連接的命令,是數(shù)據(jù)庫(kù)操作的環(huán)境
sqlplus 用戶(hù)名/密碼
2、show user 顯示當(dāng)前用戶(hù)的用戶(hù)名
改變身份可以直接connect 用戶(hù)名/密碼 --- 這個(gè)是sqlplus命令
在sqlplus中可以使用 ! 可以在shell和sqlplus間切換,!shell命令 可以在sqlplus中使用shell命令。
實(shí)際上是sqlplus開(kāi)了子進(jìn)程來(lái)執(zhí)行shell命令。
3、Oracle數(shù)據(jù)庫(kù)中的表分兩類(lèi):用戶(hù)表(用戶(hù)使用操作的表),系統(tǒng)表(數(shù)據(jù)庫(kù)系統(tǒng)維護(hù)的表,也叫數(shù)據(jù)字典)
對(duì)用戶(hù)表的DDL操作出發(fā)了對(duì)系統(tǒng)表的DML操作!
五、基本語(yǔ)法
1、select查詢(xún)語(yǔ)句
select table_name from user_tables;(查詢(xún)系統(tǒng)表)
以上的查詢(xún)語(yǔ)句就是查詢(xún)本用戶(hù)下所擁有的所有表的表名。
投影操作,只查看選擇的字段的信息。
選擇操作,查看字段中的特定某些信息。
聯(lián)接操作,多表查詢(xún),通過(guò)表間連接,查尋出多表中的信息
(1)select table_name from user_tables;(查詢(xún)系統(tǒng)表)
以上的查詢(xún)語(yǔ)句就是查詢(xún)本用戶(hù)下所擁有的所有表的表名。
(2)sqlplus的buffer中會(huì)緩存最后一條sql語(yǔ)句,可以使用"/"來(lái)執(zhí)行這最后一條sql語(yǔ)句,也可以使用
edit命令來(lái)編輯最后一條sql語(yǔ)句。
l命令(list)(sqlplus命令)可以顯示buffer中最后一條命令。
sqlplus命令可以縮寫(xiě)
(3)desc [表名]
這是一條sqlplus命令,注意他不是sql語(yǔ)句,這條命令用于查看表的結(jié)構(gòu)。descript的縮寫(xiě)
[字段名] [字段的類(lèi)型],這是使用完desc命令后顯示的表結(jié)構(gòu)。
(4)select [表的字段名1],[表的字段名2], ... from 表名;
select * from 表名; 查尋表中所有字段的信息
(5)關(guān)鍵字不等拆分,sql語(yǔ)句,以及表名,字段名是大小寫(xiě)不敏感的。
sql語(yǔ)句要以";"結(jié)尾,來(lái)表示sql語(yǔ)句結(jié)束,如果不加";"系統(tǒng)不會(huì)執(zhí)行此條sql語(yǔ)句,并提示。
在Oracle中字符顯示是左對(duì)齊,數(shù)值右對(duì)齊。
(6)在select 語(yǔ)句中可以使用數(shù)學(xué)表達(dá)式。
select [表達(dá)式(必須包含本表字段名)],[...],.... from 表名;
運(yùn)算的優(yōu)先級(jí)的先乘除后加減,同級(jí)自左向右運(yùn)算,括號(hào)改變優(yōu)先級(jí)。
(7)別名
select [字段名或表達(dá)式] ["別名"],[...] ["..."],.... from 表名;
可以通過(guò)在字段名或表達(dá)式后加空格"別名",可以給列,或者表達(dá)式結(jié)果其別名。
表達(dá)別名必須加雙引號(hào)。
(8)字符串拼接使用||符號(hào)
select 目標(biāo)字段名||" "||目標(biāo)字段名 from 表名;
注意:在Oracle中的字符串要用'..'包含
別名中需要使用空格,或是大小寫(xiě)敏感時(shí)需要用".."包含。
練習(xí):
自己寫(xiě)一條SQL語(yǔ)句,執(zhí)行的結(jié)果是select * from ...;
其中...是每張系統(tǒng)表的表名
即在每張系統(tǒng)表的表名前加“select * from” ,后加“;”
select 'select * from '||table_name||';' from user_tables;
2、處理錯(cuò)誤
(1)!oerr ora [錯(cuò)誤號(hào)] ,系統(tǒng)可以顯示錯(cuò)誤的原因和如何修改。如果命令錯(cuò)誤輸入可以使用edit或ed來(lái)修改輸入錯(cuò)誤。
實(shí)際上是在編輯緩存文件中的最后一條sql語(yǔ)句。
也可以使用 (change) c /錯(cuò)誤字段/正確字段,來(lái)進(jìn)行替換操作進(jìn)行修改。
只有在Linux平臺(tái)使用
! 相當(dāng)于 host ,沒(méi)有斷連接,只是切換了一下,執(zhí)行shell命令
(2)edit命令來(lái)編輯最后一條sql語(yǔ)句。
3、sqlplus設(shè)置
set pause on 回車(chē)響應(yīng),分屏顯示,只在本會(huì)話(huà)中有效
set pause off 關(guān)閉分屏顯示。
set pause "..." 設(shè)置分屏顯示的提示信息。
set pause on 先輸出提示信息,回車(chē)響應(yīng),分屏顯示
set head off 提頭輸出關(guān)閉
set feed off 結(jié)尾輸出關(guān)閉
set echo off 回寫(xiě)關(guān)閉
spool 文件名.sql 寫(xiě)入指定文件
spool off 關(guān)閉寫(xiě)入。
4、sql腳本
也就是在文件中寫(xiě)有sql語(yǔ)句的文件,可以在sqlplus中運(yùn)行。
引入sql腳本
sqlplus 用戶(hù)名/密碼 @sql腳本 (注意:在用戶(hù)名密碼輸入結(jié)束后一定要加空格然后再寫(xiě)@sql腳本)
在腳本中最后一行寫(xiě)上“exit”,則運(yùn)行完腳本以后,回到shell上
5、
Oracle中的空值 空值會(huì)當(dāng)無(wú)窮大處理,其實(shí)空值根本就不會(huì)存儲(chǔ),只是看作是無(wú)窮大。
Oracle中控制處理函數(shù) NVL(字段名,值),這個(gè)字段中的空值替換為指定值,如果不為空,則會(huì)返回其原值。
例:select (salary*12)*(NVL(commission_pct,0)/100+1) salary,first_name from s_emp;
distinct關(guān)鍵字,去掉重復(fù)行(這個(gè)關(guān)鍵字會(huì)觸發(fā)排序操作)
例: select distinct dept_id,title from s_emp;
dept_id與title的聯(lián)合不唯一
注意:distinct,關(guān)鍵字之后會(huì)對(duì)from之前的字段進(jìn)行排重操作。
6、column命令 --- sqlplus命令
column命令 列格式的定義
column 目標(biāo)列名 查看這個(gè)類(lèi)是否定義了格式
column 目標(biāo)列名 format a.. 設(shè)置列寬。
column last_name heading 'Employee|Name' FORMAT A15
設(shè)置題頭
這其中的'|'是換行符
column salary justify left format $99,990.00
定義數(shù)字顯示格式
注意:如果不滿(mǎn)足顯示的格式,就會(huì)把數(shù)據(jù)顯示為"#"
column salary justify left format $00,000.00
會(huì)出現(xiàn)$00,928.00 ,用0補(bǔ)齊
column 列名 clear (清除列格式定義)
注意:只有sqlplus命令才有簡(jiǎn)寫(xiě),并且在使用sqlplus命令時(shí)結(jié)尾也不能加分號(hào)。
六、選擇操作
1、order by
排序子句 ASC(默認(rèn),升序) DESC(降序)
order by 目標(biāo)列名(別名) 排序順序(不寫(xiě)排序順序,會(huì)默認(rèn)為升序排序)
例:select first_name from s_emp order by first_name;
select first_name from s_emp order by first_name desc;
注意:升序空值在結(jié)果的末尾,降序空值在結(jié)果的最前面。
2、where子句
where子句使用在 select ... from ... 后面,用來(lái)選擇所需(符合條件的)的記錄
where后面跟的是表達(dá)式 也就是 XXX=XXX, XXX between X and X ,XXX in(X,X,X)
like '...' 通配查詢(xún)
between ... and ... ,表示結(jié)果在這之間,between and是一個(gè)閉區(qū)間,
也就相當(dāng)于... <= ... and ... >= ... 。
!=,<>,^=,這三個(gè)都標(biāo)識(shí)不等于,<=,>=,=,這些運(yùn)算符都可以使用。
... in (va1,val2,...) 判斷結(jié)果是否在這個(gè)枚舉中存在
like '...' 字符串通配查詢(xún),'%'表示多個(gè)字符,'_',表示一個(gè)字符。
注意:轉(zhuǎn)義的用法:like ‘S\_%’ escape ‘\’
... and ... 表示只有兩個(gè)條件同時(shí)滿(mǎn)足
... or ... 表示條件只要滿(mǎn)足其中只一就可以
all ... 是要求都滿(mǎn)足條件。
not .....,則是可以與以上的條件產(chǎn)生反效果。
空值會(huì)對(duì)not in造成影響,也就是不等于任何值,但是空值例外。
... is null 使用來(lái)判斷值是否為空。
注意:Oracle中的字符串是嚴(yán)格區(qū)分大小寫(xiě)的。
(1)注意數(shù)據(jù)類(lèi)型,數(shù)字類(lèi)型直接寫(xiě),字符用'......' ,缺省格式的Date可以用'......',只有別名
才用" "包含。
(2)選擇合適的運(yùn)算符
七、單行函數(shù)
1.字符函數(shù)
字符是大小寫(xiě)敏感的
轉(zhuǎn)小寫(xiě) lower(字段名) --- 其中的參數(shù)可以是一個(gè)字符串常量或是一個(gè)字段名
轉(zhuǎn)大寫(xiě) upper(字段名)
首字母大寫(xiě) initcap(字段名)
字符串拼接 concat(字段1, 字段2)
截取子串 substr(字段名, 起始位置,取字符個(gè)數(shù))
dual表,是專(zhuān)門(mén)用于函數(shù)測(cè)試和運(yùn)算的,他只有一條記錄
字符串拼接 concat(...,....)
求指定子串 substr(...,起始位置,取字符個(gè)數(shù))
可以使用"-"表示從右向左取,取的時(shí)候可以從左往友取。
例:select substr(first_name,-2,2) sub from s_emp;(第二位開(kāi)始取取兩個(gè))
select substr(first_name,2,2) sub from s_emp;(倒數(shù)第二位開(kāi)始取取兩個(gè))
select substr(ename,2,2),substr(ename,-3,2),ename from scott.emp
select concat(initcap(ename),deptno) from scott.emp;
2,數(shù)值函數(shù)
四舍五入 round(數(shù)據(jù),保留小數(shù)點(diǎn)后幾位)
可以用負(fù)數(shù)表示小數(shù)點(diǎn)前,0,表示小數(shù)點(diǎn)后第一位,也就是保留個(gè)位,-1表示個(gè)位(保留到十 位)。
例:select round(15.36,1) from dual;---15.4
select round(15.36,0) from dual;---15
select round(15.36,-1) from dual;---20
截取數(shù)字函數(shù) trunc(數(shù)據(jù),保留的位數(shù)(小數(shù)點(diǎn)后位數(shù))) 截取個(gè)位之后補(bǔ)0
例:select trunc(123.456,1) from dual; ---123.4
3,日期函數(shù)
日期格式,
全日期格式 世紀(jì)信息,年月日,時(shí)分秒。
缺省日期格式,日-月-年 dd-mon-rr
修改當(dāng)前會(huì)話(huà)的日期格式,會(huì)按照指定的格式輸出日期
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
返回當(dāng)前日期 sysdate
例:select sysdate from dual;
select sysdate+1 from dual; 獲得明天的日期,加1,單位是天
日期是格式敏感的
求兩個(gè)日期間相隔了多少個(gè)月 months_between(date1,date2)
select months_between(sysdate,sysdate+61) from dual;
加減指定數(shù)量的月份 add_months(date,月數(shù)),月數(shù)可以為負(fù),負(fù)值就是減去相應(yīng)的月數(shù)。
從date日期開(kāi)始的第一個(gè)星期五 next_day(date,FriDay)
返回月末的日期 last_day(date)
截取日期 trunc(date,'年或月或日或時(shí)分秒')
例:select next_day(sysdate,1) from dual;---1 星期日 2 星期一。。。。。。7 星期六
例:select trunc(add_months(sysdate,1),'month') from dual;
ROUND('25-MAY-95','MONTH') 01-JUN-95
ROUND('25-MAY-95 ','YEAR') 01-JAN-95
TRUNC('25-MAY-95 ','MONTH') 01-MAY-95
TRUNC('25-MAY-95 ','YEAR') 01-JAN-95
select trunc(sysdate,'day') from dual
select TRUNC('25-MAY-95','YEAR') from dual
練習(xí):
返回下個(gè)月的第一天的日期
select round(last_day(sysdate),'MONTH') from dual;
select add_months(trunc(sysdate,'MONTH'),1) from dual;
4,不同數(shù)據(jù)類(lèi)型間轉(zhuǎn)換函數(shù)
將日期轉(zhuǎn)成字符 tochar(date,'日期格式')
日期格式要用有效格式,格式大小寫(xiě)敏感 'yyyy mm dd hh24:mi:ss',
'year'(全拼的年),'mm'(數(shù)字表示的月) 'month'(全拼的月),'day'(星期的全拼),'ddspth' (日期的全拼) 'yy mm dd'
例:select to_char(sysdate,'ddspth') from dual;
將字符轉(zhuǎn)換成數(shù)字 to_number('...')
將數(shù)字轉(zhuǎn)字符to_char(number,'fmt') fmt是數(shù)字格式
將字符串轉(zhuǎn)成日期 to_date('...','日期格式')
例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual;
1、等值連接
select [表別名1.字段名1],[表別名2.字段名2],...
from 表1 表別名1 ,表2 表別名2
where 表別名1.字段名3=表別名2.字段名4;
表連接時(shí),當(dāng)表與表之間有同名字段時(shí),可以加上表名或表的別名,加以區(qū)分,使用時(shí)要用
表名.字段名或表別名.字段名(列名)。當(dāng)表的字段名是唯一時(shí),可以不用加上表名或表的別名。
注意:當(dāng)為表起了別名,就不能再使用表名.字段名。
例:select a.first_name,a.last_name,b.name
from s_emp a,s_dept b
where a.dept_id=b.id;
2、非等值連接
select [表別名1.字段名1],[表別名2.字段名2],...
from 表1 表別名1 ,表2 表別名2
where 表別名1.字段名3 ..... 表別名2.字段名4
....可以使比較運(yùn)算符,也可以使其他的除了'='的運(yùn)算符
例:select e.ename, d.grade,e.sal
from emp e,salgrade d
where e.sal between d.losal and d.hisal;
3、自連接
用別名把一張表中的數(shù)據(jù)分成兩部分,然后在使用條件過(guò)濾。
select [表別名1.字段名1],[表別名2.字段名2],...
from 表1 表別名1 ,表1 表別名2
where 表別名1.字段名3=表別名2.字段名4;
例:select a.first_name ename,b.first_name cname
from s_emp a,s_emp b
where a.manager_id=b.id;
以上所提到的表連接,都叫做內(nèi)連接,嚴(yán)格匹配兩表的記錄。
4、外連接
會(huì)使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會(huì)匹配,這個(gè)表中的所有記錄都會(huì)顯示,數(shù)據(jù)庫(kù)會(huì)模擬出記錄去和那些不匹配的記錄匹配。
例:select a.first_name enamei,a.id,b.first_name cname,b.id
from s_emp a,s_emp b
where a.manager_id=b.id(+);
即用a表中的數(shù)據(jù)去匹配b表的,若b表中有null,系統(tǒng)模擬紀(jì)錄與其匹配
注意:要把那一方的記錄全部都顯示出來(lái),還有注意條件(+)跟在要全部選出的對(duì)端。
外連接的應(yīng)用:
列出哪個(gè)部門(mén)沒(méi)有員工
select e.deptno,d.deptno
from emp e,dept d
where e.deptno(+)=d.deptno
and e.deptno is null;
三、組函數(shù)
group 組
group by 分組子句,按指定的分組規(guī)則分組 ,這個(gè)group by 子句可以跟在 select 語(yǔ)句后或是 having后面。
group by子句也會(huì)出發(fā)排序操作,會(huì)按分組字段排序。
select [組函數(shù)或分組的字段名] ,... from 表名 group by [字段名1],[字段名2],.....;
例:select avg(salary) from s_emp group by dept_id;
注意:組函數(shù)可以處理一組數(shù)據(jù),返回一個(gè)值。
組函數(shù)會(huì)忽略空值。
avg(..),求平均值,sum(..),求和 這兩個(gè)函數(shù)的參數(shù)只能是number型的。
以下所提到的函數(shù)可以使用任意類(lèi)型做參數(shù)。
count(..),用來(lái)統(tǒng)計(jì)記錄數(shù),可以使用排重命令。count(...)默認(rèn)使用的是all。
max(..),min(..)求最大值和最小值,
count(*),統(tǒng)計(jì)表中記錄數(shù)。
例:select max(b.name),avg(a.salary), max(c.name)
from s_emp a,s_dept b,s_region c
where a.dept_id=b.id and b.region_id=c.id
group by b.dept_id;
注意:只要寫(xiě)了group by子句,
*** select后就只能用group by后的字段或者是組函數(shù)。 ***
where子句只能夠過(guò)濾記錄,放單行函數(shù)。
having子句可以過(guò)濾組函數(shù)結(jié)果或是分組的信息,且寫(xiě)在group by子句后。
例:
select max(b.name),avg(a.salary), max(c.name)
from s_emp a,s_dept b,s_region c
where a.dept_id=b.id and b.region_id=c.id
group by b.id
having sum(a.salary)>4000;
column 也可以定義有別名的列的格式。
column "別名" 格式定義
注意:要先過(guò)濾掉不需要的記錄,然后再進(jìn)行分組操作,提高效率。
四、子查詢(xún)
子查詢(xún),就是可以嵌在任何的sql語(yǔ)句中的select語(yǔ)句。
在select語(yǔ)句中嵌套子查詢(xún)時(shí),會(huì)先執(zhí)行子查詢(xún)。一般的會(huì)將子查詢(xún)放在運(yùn)算符的右邊。
注意:在使用子查詢(xún)時(shí),要注意這個(gè)運(yùn)算符是單行的(也就是只能是單值),還是多行運(yùn)算符(范圍,多值,in)。
配合使用子查詢(xún)返回的結(jié)果必須符合運(yùn)算符的用法。
例:
select first_name,title
from s_emp
where title=any(select title from s_emp
where last_name='Smith')
and upper(last_name)!='SMITH';
select first_name,title
from s_emp
where title in (select title from s_emp
where last_name='Smith')
and upper(last_name)!='SMITH';
五、將業(yè)務(wù)需求轉(zhuǎn)換成可操作的表
一: 需求分析
二: 畫(huà)E-R圖
三: 轉(zhuǎn)換成表關(guān)系
四: 割接(新老系統(tǒng)交接)
五:
E-R圖屬性:
* 為強(qiáng)制且非空屬性
o 可選屬性(可以有值也可以沒(méi)有)
#* 表示此屬性唯一且非空
實(shí)體關(guān)系:
mastbean maybean
數(shù)量關(guān)系: 多對(duì)一關(guān)系
一對(duì)多關(guān)系
一對(duì)一關(guān)系
多對(duì)多關(guān)系
第一范式,所有的屬性都必須是單值,也就是屬性只表示單一的意義。(記錄可以重復(fù),沒(méi)有任何限制)
第二范式,屬性要求唯一且非空,(記錄不可重復(fù),但是數(shù)據(jù)可能會(huì)出現(xiàn)冗余)。
第三范式,非主屬性只能依賴(lài)于主屬性,不能依賴(lài)于其他非主屬性。(解決數(shù)據(jù)冗余問(wèn)題)
六、約束
約束是針對(duì)表中的字段進(jìn)行定義的。
primary key (主鍵約束 PK)保證實(shí)體的完整性,保證記錄的唯一
主鍵約束,唯一且非空,并且每一個(gè)表中只能有一個(gè)主鍵,有兩個(gè)字段聯(lián)合作為主鍵,只有兩個(gè)字段放在一起唯一標(biāo)識(shí)記錄,叫做聯(lián)合主鍵。
foreign key (外建約束 FK)保證引用的完整性,
外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值得約束,不能夠取其他值,只能夠引用主鍵會(huì)唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表),要想創(chuàng)建子表,就要先創(chuàng)建父表,后創(chuàng)建子表,記錄的插入也是如此,先父表后子表,刪除記錄,要先刪除子表記錄,后刪除父表記錄,要修改記錄,如果要修改父表的記錄要保證沒(méi)有被子表引用。要?jiǎng)h表時(shí),要先刪子表,后刪除父表。
unuque key(唯一鍵),值為唯一
index(索引)是數(shù)據(jù)庫(kù)特有的一類(lèi)對(duì)象,view(示圖)
典型的一對(duì)多 class 對(duì)應(yīng)多個(gè)學(xué)生。
student table class table
______________________________ _________________________
| id | name | address| class_id| | id |class_desc|class_num|
|(PK)|______|________|___(FK)__| |(pk)|__________|_________|
| | | | | | | | |
一對(duì)一
student tabel shenfenzheng table
____________________ _________________________________
| id | name | address| | s_id |shenfen_desc|shenfen_num|
|(PK)|______|________| |(PK,F(xiàn)K)|____________|___________|
| | | | | | | |
多對(duì)多
student tabel zhongjian table kecheng table
____________________ _________________________________ __________________
| id | name | address| | s_id |shenfen_desc|shenfen_num| | kid | kechengname|
|(PK)|______|________| |(FK,F(xiàn)K)|____________|___________| | (PK)|____________|
| | | | |聯(lián)合主鍵| | | | | |
引用對(duì)方表的主鍵,當(dāng)作本身的主鍵,所以這個(gè)表的主鍵,既是主鍵又是外建
建表和其他相關(guān)操作
DDL語(yǔ)句
創(chuàng)建表:
create table 表名 ( 字段名1 類(lèi)型(數(shù)據(jù)長(zhǎng)度)(default ...) 約束條件, 字段名2 類(lèi)型(數(shù)據(jù)長(zhǎng)度) 約束條件 );
Oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù)類(lèi)型
varchar(長(zhǎng)度),可變長(zhǎng)字符串,char(長(zhǎng)度) 定長(zhǎng)
number(..,..),number 表示浮點(diǎn)數(shù),或者是整數(shù)
long 大對(duì)象,clog 字符的大對(duì)象,相當(dāng)于文本文件在表中只存放一個(gè)相當(dāng)于只針對(duì)值
blog 二進(jìn)制的大對(duì)象,也是以相當(dāng)于指針的形式存放的。
primary key約束:
主鍵約束的定義:
第一種定義形式:
create table test(c number primary key ); 列級(jí)約束
select * from test
第二種定義形式:
create table test(c number , primary key(c) ) ; 表級(jí)約束
create table test( c1 number constraints pkc1 primary key ); 此約束有名字: pkc1
create table test(c number , c2 number , primary key (c ,c1) ) ; 用表級(jí)約束可以實(shí)現(xiàn)聯(lián)合主鍵
foregin key (fk) 外鍵約束:
(先定義父表,再定義子表)
create table parent(c1 number primary key );
create table child (c number primary key , c2 number references parent(c1));
或表級(jí)約束定義:
create table child( c number primary key , c2 number , foreign key(c2) references parent(c1));
如果兩個(gè)字段都為唯一且非空,這時(shí)可以定義成UK+NOT NULL
(PK或UK)一對(duì)多(FK)
(PK+UK)一對(duì)一(FK) 或 (PK)一對(duì)一(PK)
多對(duì)對(duì)多關(guān)系,一般都通過(guò)一張中間表來(lái)分解成兩個(gè)一對(duì)多的表
建立表
create table[schema]table
schema: 一個(gè)用戶(hù)對(duì)應(yīng)一個(gè)schema 不同用戶(hù)下的表不能互相查看
select count(*) from s_dept; <===> select count(*) from sd0611.s_dept;
一個(gè)表中只能存儲(chǔ)一個(gè)LONG類(lèi)型
CLOB 存儲(chǔ)大的文本對(duì)象
BLOB 存儲(chǔ)大的二進(jìn)制對(duì)象
create table test(c1 number primary key); 設(shè)置主鍵
create table test(c1 number constraints test_c1 primary key); 定義約束名,默認(rèn)約束名為SYS_ 在列后面定義約束稱(chēng)為列級(jí)約束
create table test(c1 number primary key(c1)); 所有列定義完后再定義約束稱(chēng)為表級(jí)約束(能定義聯(lián)合主鍵)
cretae table test(c1 number,c2 number,priary key(c1,c2)); 定義聯(lián)合主鍵
create table child(c1 number primary key); 先要定義父表
create table child(c1 number primary key, c2 number references parent(c1)); 然后定義子表 references parent定義外鍵
create table child(c1 number primary key, c2 number references parent(c1) on delete cascate); on delete cascate為級(jí)聯(lián)刪除
create table child(c1 number primary key, c2 number references parent(c1) on delete set null); on delete set null刪除后將外鍵置空
create table child (c1 number primary key, c2 number,foreignkey(c2) references parent(c1));
二、約束
1、非空約束(not null)
這是一個(gè)列級(jí)約束
在建表時(shí),在數(shù)據(jù)類(lèi)型的后面加上 not null ,也就是在插入時(shí)不允許插入空值。
例:create table student(id number primary key,name varchar2(32) not null,address varchar2(32));
2、unique 唯一約束
唯一約束,是會(huì)忽略空值的,唯一約束,要求插入的記錄中的值是為一的。
例:create table student(id number,name varchar2(32),address varchar2(32),primary key (id),unique (address));
如果創(chuàng)建一個(gè)uk,系統(tǒng)自動(dòng)建一個(gè)唯一索引
3、pk、uk
Oralce支持級(jí)聯(lián)刪除,不支持級(jí)聯(lián)更新
4、check約束
檢查約束,可以按照指定條件,檢查記錄的插入。check中不能使用尾列,不能使用函數(shù),不能引用其他字段。
例:create table sal (a1 number , check(a1>1000));