外鍵和內外左右連接的基礎知識

外鍵和內外左右連接的基礎知識

 

由於現有公司一直不用mysql的外鍵(影響庫的性能,采用代碼邏輯控制),所以我對外鍵也不是很瞭解,今天特意在網上看瞭些有關外鍵的資料,順便搜到瞭些內外連接的知識,一起整理起來。

 

1mysql的外鍵相關知識

mysql的外鍵有三種,如果表A的主關鍵字是表B中的字段,則該字段稱為表B的外鍵,表A稱為主表,表B稱為從表。外鍵是用來實現參照完整性的,不同的外鍵約束方式將可以使兩張表緊密的結合起來,特別是修改或者刪除的級聯操作將使得日常的維護工作更加輕松。常見的外鍵 有級聯(cascade)方式,置空(set null)方式及禁止(no action / restrict)方式

 

a測試級聯方式:

 

01
create table test111 (
02
    id int not null,
03
    name varchar(30),
04
    primary key (id)
05
);
06
create table test222 (
07
    id int not null,
08
    name varchar(30),
09
    groupid int,
10
    primary key (id),
11
    foreign key (groupid) references test111(id) on delete cascade on update cascade
12
);
13

14
insert into test111 values (1, 'Group1');
15
insert into test111 values (2, 'Group2');
16

17
insert into test222 values (1, 'qianxin', 1);
18
insert into test222 values (2, 'yiyu', 2);
19
insert into test222 values (3, 'dai', 2);
20
delete from test111 where id=2;             
21
update test111 set id=2 where id=1;

 

這種情況下無法插入,用戶組3不存在,與參照完整性約束不符

 

刪除時test222r中的2、3記錄級聯刪除

 

更新時test222的1記錄的groupid級聯修改為2

 

b測試置空(set null)方式

 

01
create table test111 (
02
    id int not null,
03
    name varchar(30),
04
    primary key (id)
05
);
06
create table test333 (
07
    id int not null,
08
    name varchar(30),
09
    groupid int,
10
    primary key (id),
11
    foreign key (groupid) references test111(id) on delete set null on update set null
12
);
13

14
insert into test111 values (1, 'Group1');
15
insert into test111 values (2, 'Group2');
16

17
insert into test333 values (1, 'qianxin', 1);
18
insert into test333 values (2, 'yiyu', 2);
19
insert into test333 values (3, 'dai', 3);
20
delete from test111 where id=2;             
21
update test111 set id=2 where id=1;

 

無法插入,用戶組3不存在,與參照完整性約束不符 

刪除是導致test333中的2、3記錄的groupid被設置為NULL、

 

更新時導致t_user中的1記錄的groupid被設置為NULL

 

c測試禁止(no action / restrict)方式

 

01
create table test111 (
02
    id int not null,
03
    name varchar(30),
04
    primary key (id)
05
);
06
create table test444 (
07
    id int not null,
08
    name varchar(30),
09
    groupid int,
10
    primary key (id),
11
    foreign key (groupid) references test111(id) on delete no action on update no action
12
);
13

14
insert into test111 values (1, 'Group1');
15
insert into test111 values (2, 'Group2');
16

17
insert into test444 values (1, 'qianxin', 1);
18
insert into test444 values (2, 'yiyu', 2);
19
insert into test444 values (3, 'dai', 3);
20
delete from test111 where id=2;             
21
update test111 set id=2 where id=1;

 

插入時無法插入,用戶組3不存在,與參照完整性約束不符

刪除時從表中有相關引用,因此主表中無法刪除

 

更新時從表中有相關引用,因此主表中無法修改

 

在MySQL中,restrict方式與no action方式作用相同。

 

2 oracle的外鍵

外鍵是該表是另一個表之間聯接的字段 ,必須為另一個表中的主鍵 用途是確保數據的完整性。它通常包括以下幾種: 

 

A實體完整性,確保每個實體是唯一的(通過主鍵來實施) 

B域完整性,確保屬性值隻從一套特定可選的集合裡選擇 

C關聯完整性,確保每個外鍵或是NULL(如果允許的話)或含有與相關主鍵值相配的值 

 

下面是一個測試例子,如何建立兩個表的外鍵

01
CREATE TABLE ZZ_STUDENT (
02
    ID CHAR (10),
03
    NAME VARCHAR (8),
04
    SEX CHAR (1)
05
);
06

07
ALTER TABLE ZZ_STUDENT ADD CONSTRAINT PK_STUDENT PRIMARY KEY (ID);
08

09
CREATE TABLE ZZ_SCORE (ID CHAR(10), MATH NUMBER(5, 2));
10

11
ALTER TABLE ZZ_SCORE ADD CONSTRAINT FK_SCROE FOREIGN KEY (ID) REFERENCES ZZ_STUDENT (ID);

 

 

3資料庫內連接外連接左連接右連接

 

內連接:把兩個表中數據對應的數據查出來  

外連接:以某個表為基礎把對應數據查出來

全連接是以多個表為基礎 

 

首先插入如下測試數據:

 

1
insert into student(sno,sname) values('2005001','小施');
2
insert into student(sno,sname) values('2005002','小王');
3
insert into student(sno,sname) values('2005003','小張');
4
insert into student(sno,sname) values('2005004','小賈');
5
insert into stu_score(sno,scrore) values('2005001',90.00);
6
insert into stu_score(sno,scrore) values('2005002',95.00);
7
insert into stu_score(sno,scrore) values('2005008',80.50);
8
insert into stu_score(sno,scrore) values('2005009',88.50);

 

(一) 內連接

 

  內連接,inner join,join 查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的 

      列值。

 

----假設a表有M條記錄,b表有N條記錄,a和b表sno相同的記錄有K條
----內連接(數據量=K)

1
select a.*,b.* from student a join stu_score b on a.sno=b.sno;
2
select a.*,b.* from student a inner join stu_score b on a.sno=b.sno;
查詢結果如下:

2005001 小施 2005001 90
2005002 小王 2005002 95

 

 

 

(二) 外連接 (左連接、右連接) 

 

左連接或left join,left outer join 返回包括左表中的所有記錄和右表中聯接字段相等的記錄

右連接或right join ,right outer join 返回包括右表中的所有記錄和由表中聯接字段相等的記錄

----左連接/左外連接(數據量=M) 
select a.*,b.* from student a left join stu_score b on a.sno=b.sno; 
select a.*,b.* from student a left outer join stu_score b on a.sno=b.sno;

查詢結果如下:

2005001 小施 2005001 90
2005002 小王 2005002 95
2005003 小張 
2005004 小賈

----右連接/右外連接(數據量=N)
select a.*,b.* from student a right join stu_score b on a.sno=b.sno;
select a.*,b.* from student a right outer join stu_score b on a.sno=b.sno;

查詢結果如下:

2005001 小施 2005001 90
2005002 小王 2005002 95
2005008 80.5
2005009 88.5

 

 

(三) 完全連接()

設定:在內連接的基礎上,還包含兩個表中所有不符合條件的數據行,並在其中的左表、和右表列填寫NULL 

關鍵字:FULL JOIN

 

----完全連接(數據量=M+N-K)
select a.*,b.* from student a full join stu_score b on a.sno=b.sno;

 

 

查詢的時候mysql是不支持的

 

 

(四) 交叉連接

設定:將兩個表的所有行進行組合,連接後的行數為兩個表的乘積數。(笛卡爾積) 

關鍵詞:CROSS JOIN 

格式:FROM 表名1 CROSS JOIN 表名2 

 

—-交叉連接(數據量=M*N)

select a.*,b.* from student a cross join stu_score b ;

 

 

查詢結果如下:

 

2005001 小施 2005001 90
2005002 小王 2005001 90
2005003 小張 2005001 90
2005004 小賈 2005001 90
2005001 小施 2005002 95
2005002 小王 2005002 95
2005003 小張 2005002 95
2005004 小賈 2005002 95
2005001 小施 2005008 80.5
2005002 小王 2005008 80.5
2005003 小張 2005008 80.5
2005004 小賈 2005008 80.5
2005001 小施 2005009 88.5
2005002 小王 2005009 88.5
2005003 小張 2005009 88.5
2005004 小賈 2005009 88.5

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。