Mysql進階(內、外、自然連接)

mysql進階篇

本人也是很久之前學習了mysql,今天打算複習一下隨手寫一篇筆記整理一下

1.連接(連結)查詢

按照我們設計表的一個規範,一個實體應該在一張表裏面完成
如果一個業務要使用多個實體的數據呢?那是不是應該有多張表一起使用,將多個表的記錄連結起來,這就是連接的目的

在這裏插入圖片描述
上圖這張表描述了哪一個老師在什麼時期之內教了哪個班級
我們現在用一個表來存儲它是可以做到的,但是按照數據庫的設計規範的話,它是不符合第三範式的,他有傳遞依賴
所以我們要將這個表拆爲三部分,從而做一些查詢
在這裏插入圖片描述

create table join_teacher(
id int primary key auto_increment,
t_name varchar(20),
gender enum('male','famale')
) engine innoDB character set utf8;

insert into join_teacher values
(1,'馮老師','male'),
(2,'魏老師','famale'),
(3,'秦老師','male'),
(4,'陳老師','male');

create table join_class(
id int primary key auto_increment,
c_name char(10),
room char(5)
) engine innoDB character set utf8;

insert into join_class values
(1,'python1','33201'),
(2,'python2','33202'),
(3,'python3','33203'),
(4,'python4','33204');

create table join_teacher_class(
id int primary key auto_increment,
t_id int,
c_id int,
days int,
start_date date,
end_date date
) engine innoDB character set utf8;

insert into join_teacher_class values
(1,1,1,15,"2019-03-05","2019-03-20"),
(2,1,1,5,"2019-03-05","2019-03-10"),
(3,2,2,20,"2019-03-05","2019-03-25"),
(4,2,2,1,"2019-03-05","2019-03-06"),
(5,3,3,7,"2019-03-05","2019-03-12"),
(6,1,1,8,"2019-03-05","2019-03-13"),
(7,3,3,4,"2019-03-05","2019-03-09");

連接總體思路:將數據按照某種條件連接起來在做查詢,因爲連接的條件不同,連接又分爲:內連接,外連接,自然連接,連接是指根據表規定的結構來進行數據的連接,首先講解什麼是內連接

內連接

數據內部的連接,要求連接的多個數據必須真實存在才能進行連接
先來段語法,一看便知一二
table_left inner join table_right on(連接條件) ps:在join左邊則是左表,右邊則爲右表
來個例子:
我們查詢一下每個老師帶了多少天課
在這裏插入圖片描述

select join_teacher.t_name,join_teacher_class.days from join_teacher inner join join_teacher_class on join_teacher.id=join_teacher_class.t_id;

先不要看這個語法,先看一下這個結果有沒有展示陳老師的代課信息
在這裏插入圖片描述
因爲當前沒有記錄可以和陳老師進行連接,內連接不存在連接不上的數據
在這裏插入圖片描述
我們先分析一下這個連接過程:
首先將所有的數據連接起來(圖中第一步)
在這裏插入圖片描述
PS:不滿足條件結果不保留

內連接在連接時是可以省略條件的,一旦省略條件mysql這判斷所有連接全爲真,意味着所有左表數據都要與右表的記錄做一次連接,共有 m*n個連接
這種沒有條件的內連接叫做交叉連接或笛卡爾積,笛卡爾積是獲得最高記錄數的一種,當然處理起來也是非常緩慢的,除非是將所有可能性展示出來,否則不做這種笛卡爾積連接的
Mysql中 inner join是默認的連接方式 所以inner是可以省略的

外連接

如果負責連接的多個數據不真實存在,稱之爲外連接
外連接分類:左外連接、右外連接、全外連接 但是mysql沒有全外連接
左外連接:在連接時如果出現左邊表數據連接不到右邊表的情況.則左邊表的數據在最終結果裏保留,如果右表數據連接不到左表,則右表數據被丟棄(靈魂畫師別介意
右外連接反之
在這裏插入圖片描述

跟內連接的例子一樣 : 我們查詢一下每個老師帶了多少天課

在這裏插入圖片描述

select join_teacher.t_name,join_teacher_class.days from join_teacher left outer join join_teacher_class on join_teacher.id=join_teacher_class.t_id;

left outer join (outer是可以省略的)
而這裏出現了陳老師的信息
在這裏插入圖片描述
當數據連接不上時 保留左表 右邊用虛擬數據代替
左連接是開發過程中用到最多的一種連接方式
注意:外連接不能使用where

自然連接

natural join 通過mysql自己的判斷完成連接
自然連接暫不介紹,有時間我會補上

注意

取別名:
select join_teacher.t_name,join_teacher_class.days from join_teacher left outer join join_teacher_class on join_teacher.id=join_teacher_class.t_id;
將表名稱取別名後:
select t.t_name,tc.days from join_teacher as t left outer join join_teacher_class as tc on t.id=tc.t_id;
跟上面語句一樣 變得更簡潔更清晰

無論是連接條件還是連接查詢多字段列表,沒有必要一定要寫 表名.字段的寫法,是否寫,取決於是否發生了衝突,衝突需要些,不衝突無所謂,建議寫上,提高代碼的可讀性

以上就是本章的全部內容了,因爲時間關係寫的有些匆忙,後期會做一些修改,光看是學不會的,重要的是練習,最後感謝大家的閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章