alter table foods add constraint fk_Foods_Category foreign key(CategoryId) references Category(id);
####-----增加外鍵的方法------#####
#######alter table 需加外鍵的表 add constraint 外鍵名 foreign key(需加外鍵表的字段名) referencnes 關聯表名(關聯字段名);#####
alter table news add constraint fk_News_Users foreign key(UserId) references user(id);
刪除外鍵的代碼
//先刪除外鍵約束
alter table foods drop foreign key fk_Foods_Category;
alter table news drop foreign key fk_News_Users;
//刪除主鍵的方法:
alter table 表名 drop primary key; --刪除主鍵
alter table 表名 add primary key(字段名,...); --增加主鍵
//利用primary key(Sno,Cno)創建符合聯合主鍵
create table test
(
name varchar(19),
id number,
value varchar(10),
primary key (name , id)
)
數據庫中的笛卡兒積、左外連接、內鏈接、右外連接、全連接的概念以及具體實現在數據庫中的實現過程:
笛卡兒積:
簡單意思是兩個集合的相乘,例如
集合A={a,b } 集合B= { 0 , 1 , 2}
則集合A x B就是A與B的笛卡爾積,其結果為:
{(a,0),(a,1),(a,2),(b,0),(b,1),(吧,2)}
例如關系R
A1 |
A2 |
A3 |
a |
b |
c |
b |
a |
c |
c |
a |
c |
關系S
B1 |
B2 |
B3 |
b |
a |
c |
a |
b |
c |
c |
a |
b |
則R x S 的笛卡爾積如下:
A1 |
A2 |
A3 |
B1 |
B2 |
B3 |
a |
b |
c |
b |
a |
c |
a |
b |
C |
a |
b |
c |
a |
b |
c |
c |
a |
b |
b |
a |
C |
b |
a |
c |
b |
a |
C |
a |
b |
c |
b |
a |
C |
c |
a |
b |
c |
a |
b |
b |
a |
c |
c |
a |
b |
a |
b |
c |
c |
a |
b |
c |
a |
b |
用SQL語句執行笛卡兒積的操作:(用交叉連接實現)
select * from R cross join S
內連接運算:按我的理解就是兩個表的內部操作,以兩張表為主觀方向去理解,通俗地說就是兩方都存在的數據,不以單方向為主出現另外一張表為空的狀態。所以查詢后的結果也驗證了這一點:
關系R和關系S內鏈接操作:
例如關系R
A1 |
A2 |
A3 |
a |
b |
c |
b |
a |
c |
c |
a |
c |
關系S
B1 |
B2 |
B3 |
e |
r |
c |
a |
b |
c |
c |
a |
b |
關系R和S內連接結果如下:
A1 |
A2 |
A3 |
B1 |
B2 |
B3 |
a |
b |
c |
a |
b |
c |
c |
a |
b |
c |
a |
b |
內連接:(以表主鍵進行連接)
在每個表中找出符合條件的共有記錄。[x inner join y on...]
第一種寫法:用where
select t.teacher_name, s.student_name from teacher t,student s where t.id = s.teacher_id;
第二種寫法:(join .. on.. )
select t.teacher_name, s.student_name from teacher t join student s on t.id = s.teacher_id;
第三種寫法:(inner join .. on.. )
select t.teacher_name, s.student_name from teacher t inner join student s on t.id = s.teacher_id;
外連接:分為左外連接、右外連接、全連接三種
左外連接(簡稱為左連接):
左連接可以通俗的理解為,以左邊這張表為主導,左邊數據不變,按查詢條件顯示右邊部分滿足的數據
A1 |
A2 |
A3 |
a |
b |
c |
b |
a |
c |
c |
a |
c |
關系S
B1 |
B2 |
B3 |
b |
a |
c |
q |
b |
r |
c |
a |
b |
左外連接的結果如下:
A1 |
A2 |
A3 |
B1 |
B2 |
B3 |
a |
b |
c |
null |
null |
null |
b |
a |
c |
b |
a |
C |
c |
a |
c |
c |
a |
b |
SQL操作結果顯示:(以表主鍵進行連接)
具體舉例
數據中的連接join分為內連接、自然連接、外連接,外連接又分為左外連接、右外連接、全外連接。
當然,這些分類都是在連接的基礎上,是從兩個表中記錄的笛卡爾積中選取滿足連接的記錄。笛卡爾積簡單的說就是一個表里的記錄要分別和另外一個表的記錄匹配為一條記錄,即如果表A有3條記錄,表B也有三條記錄,經過笛卡爾運算之后就應該有3*3即9條記錄。如下表:
自然連接(natural join)
自然連接是一種特殊的等值連接,他要求兩個關系表中進行比較的必須是相同的屬性列,無須添加連接條件,並且在結果中消除重復的屬性列。
sql語句:Select …… from 表1 natural join 表2
結果:
內連接(inner join)
內連接基本與自然連接相同,不同之處在於自然連接奧球是同名屬性列的比較,而內連接則不要求兩屬性列同名,可以用using或on來指定某兩列字段相同的連接條件。
sql語句:Select …… from 表1 inner join 表 2 on 表1.A=表2.E
結果:
A |
B |
C |
C |
D |
E |
1 |
2 |
3 |
3 |
4 |
5 |
當內鏈接不帶on查詢條件時查詢結果為笛卡爾積
自然連接時某些屬性值不同則會導致這些元組會被舍棄,那如何保存這些會被丟失的信息呢,外連接就解決了相應的問題。外連接分為左外連接、右外連接、全外連接。外連接必須用using或on指定連接條件。
左外連接(left outer join)
左外連接是在兩表進行自然連接,只把左表要舍棄的保留在結果集中,右表對應的列上填null。
sql語句:Select …… from 表1 left outer join 表2 on 表1.C=表2.C
結果:
右外連接(rignt outer join)
右外連接是在兩表進行自然連接,只把右表要舍棄的保留在結果集中,左表對應的列上填null。
Select …… from 表1 rignt outer join 表2 on 表1.C=表2.C
結果:
全外連接(full join)
全外連接是在兩表進行自然連接,只把左表和右表要舍棄的都保留在結果集中,相對應的列上填null。
Select …… from 表1 full join 表2 on 表1.C=表2.C
結果: