MySQL之資料查詢
阿新 • • 發佈:2022-02-21
外來鍵
外來鍵 ( foreign key ) 是用於建立和加強兩個表資料之間的連結的一列或多列。通過將儲存表中主鍵值的一列或多列新增到另一個表中,可建立兩個表之間的連結。這個列就成為第二個表的外來鍵。
建立外來鍵的方式
① 一對多形式(一個表的一個數據可以對應另一個表多個數據,另一張表的一個數據只能對應這張表的一個數據)
以員工部門表為例
# 先建立被關聯表(一) create table dep( id int primary key auto_increment, dep_name varchar(32), dep_desc varchar(254) ); # 在建立關聯表(多) create table emp( id int primary key auto_increment, name varchar(32), age int, dep_id int, foreign key(dep_id) references dep(id) );
② 多對多形式(一張表的一個數據資料可以對應另一個表多個數據,另一張表的一個數據也能對應這張表的多個數據)
以學生和課程為例
create table student( id int primary key auto_increment, stu_name varchar(32), price float(6,2) ); create table class( id int primary key auto_increment, cls_name varchar(32), ); create table stu2class( id int primary key auto_increment, stu_id int, class_id int, foreign key(author_id) references author(id) on update cascade # 級聯更新 on delete cascade, #級聯刪除 foreign key(book_id) references book(id) on update cascade # 級聯更新 on delete cascade # 級聯刪除 );
③ 一對一形式(一張表中一個數據只對應另一張表的一個數據,另一張表的資料也只對應該表的一個數據)
在一對一形式中,在哪個表中設定外來鍵都可以,一般情況下我們將外來鍵設定在常用的那個表中
create table author( id int primary key auto_increment, name varchar(32), age int, author_id int unique, foreign key(author_id) references author_detail(id) on update cascade # 級聯更新 on delete cascade # 級聯刪除 ); create table author_detail( id int primary key auto_increment, phone varchar(32), address varchar(32) );
外來鍵約束
- 在建立表時,必須先建立被關聯表(沒有外來鍵欄位的表)
- 在插入新資料時,被關聯表中必須有資料
- 在插入新資料時,只能插入被關聯表中已存在的詩句
- 在修改和刪除被關聯表中的資料時,無法直接操作
方式① :將想修改的被關聯資料關聯的資料刪除或者轉移。
方式② :給外來鍵增加約束條件
on update cascade # 級聯更新
on delete cascade # 級聯刪除
查詢關鍵字
select與from
# from控制的是查詢的是哪一張表 # select控制的是查詢哪個欄位 select * from t1 # 查詢t1表中的所有欄位
where與like
""" where 控制的是篩選條件 like :模糊查詢:沒有明確的篩選條件 關鍵符號: %:匹配任意個數任意字元 _:匹配單個個數任意字元 show variables like '%mode%se'; """
練習
# 資料準備 create table emp( id int primary key auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varchar(50), post_comment varchar(100), salary double(15,2), office int, #一個部門一個屋子 depart_id int ); #插入記錄 #三個部門:教學,銷售,運營 insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values ('jason','male',18,'20170301','張江第一帥形象代言',7300.33,401,1), #以下是教學部 ('tom','male',78,'20150302','teacher',1000000.31,401,1), ('kevin','male',81,'20130305','teacher',8300,401,1), ('tony','male',73,'20140701','teacher',3500,401,1), ('owen','male',28,'20121101','teacher',2100,401,1), ('jack','female',18,'20110211','teacher',9000,401,1), ('jenny','male',18,'19000301','teacher',30000,401,1), ('sank','male',48,'20101111','teacher',10000,401,1), ('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是銷售部門 ('呵呵','female',38,'20101101','sale',2000.35,402,2), ('西西','female',18,'20110312','sale',1000.37,402,2), ('樂樂','female',18,'20160513','sale',3000.29,402,2), ('拉拉','female',28,'20170127','sale',4000.33,402,2), ('僧龍','male',28,'20160311','operation',10000.13,403,3), #以下是運營部門 ('程咬金','male',18,'19970312','operation',20000,403,3), ('程咬銀','female',18,'20130311','operation',19000,403,3), ('程咬銅','male',18,'20150411','operation',18000,403,3), ('程咬鐵','female',18,'20140512','operation',17000,403,3);