分析步驟:#1、先站在左表的角度去找
是否左表的多條記錄可以對應右表的一條記錄,如果是,則證明左表的乙個欄位foreign key 右表乙個字段(通常是id)
#2、再站在右表的角度去找
是否右表的多條記錄可以對應左表的一條記錄,如果是,則證明右表的乙個欄位foreign key 左表乙個字段(通常是id)
#3、總結:
#多對一:
如果只有步驟1成立,則是左表多對一右表
如果只有步驟2成立,則是右表多對一左表
#多對多
如果步驟1和2同時成立,則證明這兩張表時乙個雙向的多對一,即多對多,需要定義乙個這兩張表的關係表來專門存放二者的關係
#一對一:
如果1和2都不成立,而是左表的一條記錄唯一對應右表的一條記錄,反之亦然。這種情況很簡單,就是在左表foreign key右表的基礎上,將左表的外來鍵字段設定成unique即可
建立表之間的關係
#一對多或稱為多對一
三張表:出版社,作者資訊,書
一對多(或多對一):乙個出版社可以出版多本書
關聯方式:foreign key
sql示例
********************=多對一********************=create table press(id int primary key auto_increment,
name varchar(20)
);create table book(
id int primary key auto_increment,
name varchar(20),
press_id int
notnull,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);insert into press(name) values('
北京工業地雷出版社'),
('人民**不好聽出版社'),
('智財權沒有用出版社')
;insert into book(name,press_id) values('
九陽神功
',1),('
九陰真經
',2),('
九陰白骨爪
',2),('
獨孤九劍
',3),('
降龍十巴掌
',2),('
葵花寶典
',3)
;sql示例
其他示例
班級和學生乙個班級可以對應多個學生,但乙個學生只能對應乙個班級
主機和機房
乙個機房可以有多台主機,但是乙個主機只能屬於乙個機房
#多對多三張表:出版社,作者資訊,書
多對多:乙個作者可以寫多本書,一本書也可以有多個作者,雙向的一對多,即多對多
關聯方式:foreign key+一張新的表
多對多sql示例
********************=多對多********************=create table author(id int primary key auto_increment,
name varchar(20));#
這張表就存放作者表與書表的關係,即查詢二者的關係查這錶就可以了
create table author2book(
id int
notnull unique auto_increment,
author_id int
notnull,
book_id int
notnull,
constraint fk_author foreign key(author_id) references author(id)
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id,book_id));#
插入四個作者,id依次排開
insert into author(name) values('
egon
'),('
alex
'),('
yuanhao
'),('
wpq');#
每個作者與自己的代表作如下
egon:
九陽神功
九陰真經
九陰白骨爪
獨孤九劍
降龍十巴掌
葵花寶典
alex:
九陽神功
葵花寶典
yuanhao:
獨孤九劍
降龍十巴掌
葵花寶典
wpq:
九陽神功
insert into author2book(author_id,book_id) values
(1,1),
(1,2),
(1,3),
(1,4),
(1,5),
(1,6),
(2,1),
(2,6),
(3,4),
(3,5),
(3,6),
(4,1)
;sql示例
服務和機器乙個服務可能被部署到多台機器上,一台機器上也可以部署多個服務
學生和課程
乙個學生可以選擇多門課程,一門課程也可以被多個學生選擇
#一對一兩張表:學生表和客戶表
一對一:乙個學生是乙個客戶
關聯方式:foreign key+unique
create table customer(->id int primary key auto_increment,
-> name varchar(20) not
null,
-> qq varchar(10) not
null,
-> phone char(16) not
null
->);
create table student(
->id int primary key auto_increment,
-> class_name varchar(20) not
null,
-> customer_id int unique, #
該欄位一定要是唯一的
-> foreign key(customer_id) references customer(id) #
外來鍵的字段一定要保證unique
->on delete cascade
->on update cascade
->);
#增加客戶
mysql>insert into customer(name,qq,phone) values
-> ('
韓蕾','
31811231
',13811341220),
-> ('
楊瀾','
123123123
',15213146809),
-> ('
翁惠天','
283818181
',1867141331),
-> ('
楊宗河','
283818181
',1851143312),
-> ('
袁承明','
888818181
',1861243314),
-> ('
袁清','
112312312
',18811431230)
mysql> #
增加學生
mysql>insert into student(class_name,customer_id) values
-> ('
脫產1班
',3),
-> ('
週末1期
',4),
-> ('
週末1期
',5)
->;
sql示例
例一:乙個使用者只有乙個部落格使用者表:
id name
1egon
2alex
3wupeiqi
部落格表
fk+unique
id url name_id
1 ***x 1
2 yyyy 3
3 zzz 2例二:乙個管理員唯一對應乙個使用者
使用者表:
id user password
1egon ***x
2alex yyyy
管理員表:
fk+unique
id user_id password
1 1***xx
2 2yyyyy
其他示例
oracle資料庫之多表查詢
select s.stuid,s.stuname,s.stuage,s.gender,cl.classesname from student s,classes cl where s.classesid cl.classesid select s.stuid,s.stuname,s.stuage,s...
資料庫之多表查詢(連線查詢)
一 非等值和等值的多表查詢 select c.catname 圖書類別 b.bookname 書名 b.price from cats c,book b select c.catname 圖書類別 b.bookname 書名 b.price from cats c,book b where c.id...
資料庫Oracle強化練習之多表查詢
1.列出所有雇員的姓名及其直接上級的姓名 select a.ename,a.mgr,b.ename,b.empno from emp a,emp b where a.mgr b.empno 2.列出部門名稱和這些部門的雇員,同時列出那些沒有雇員的部門 select dept.deptno,dname...