1. 程式人生 > >內連接與左外鏈接的區別

內連接與左外鏈接的區別

sql -c sele practice creat col ice 函數 div

mysql 版本:5.5.13

理論部分 連接概述: 根據連接條件(on 子句),將兩張表的相關內容組織成一個結果集 內連接與左外鏈接的區別描述: 使用內連接時,不符合連接條件的數據,(不管是左表中的還是右表中的)都不會被組織到結果集中 使用左外連接時,對於不符合連接條件的數據,左表中的內容依然會被組織到結果集中,結果集中該條數據對應的右表部分為 null 實例

工資表(salary_info)

create table salary_info(

name varchar(80) comment 員工姓名,

salary decimal(16,2) comment 
工資 )

內容

INSERT INTO `examination_questions_practice`.`salary_info` (`name`, `salary`) VALUES (張大胖, 10000);
INSERT INTO `examination_questions_practice`.`salary_info` (`name`, `salary`) VALUES (小李, 5000);
INSERT INTO `examination_questions_practice`.`salary_info` (`name`, `salary`) VALUES (王師傅
, 20000);
name salary
張大胖 10000
小李 5000
王師傅 20000

獎金表(bonus_info)

create table bonus_info(

name varchar(80)  comment 員工姓名,

bonus decimal(16,2) commetn 獎金

)

內容

INSERT INTO `bonus_info` (`name`, `bonus`) VALUES (張大胖, 2000);
INSERT INTO `bonus_info` (`name`, `bonus`) VALUES (王師傅, 
3000);
name bonus
張大胖 2000
王師傅 3000
需求 發工資的日子到了,根據工資表和獎金表,統計所有員工的應發薪水 如果使用內連接,sql 語句如下:
select a.name as 員工姓名, (IFNULL(a.salary,0) + IFNULL(b.bonus,0)) as 應發薪水
from salary_info a 
inner join bonus_info b 
on a.name=b.name

運行結果:

員工姓名 應發薪水
張大胖 12000
王師傅 23000
於是,小李感覺很委屈,因為他的工資沒到賬
左外連接:,sql 語句如下:
select a.name as 員工姓名, (IFNULL(a.salary,0) + IFNULL(b.bonus,0)) as 應發薪水
from salary_info a 
left join bonus_info b 
on a.name=b.name

運行結果

員工姓名 應發薪水
張大胖 12000
小李 5000
王師傅 23000
小李也正常收到了工資 註: 當一個不為 null 的數值與一個為 null 的數值相加時,得到的結果為 null。 故用 IFNULL 函數,當參與計算的數值為 null 時,用數字 0 代替其參與計算。 如果不用,那麽左外連接的結果就是小李對應的應發薪水為 null 輔助理解 內連接時,連接後的結果集為:
a.name a.salary b.name b.bonus
張大胖 10000 張大胖 2000
王師傅 20000 王師傅 3000
運行以下 sql,得到內連接的結果集
select *  
from salary_info a 
inner join bonus_info b 
on a.name=b.name

左外連接時,連接後的結果集為:
a.name a.salary b.name b.bonus
張大胖 10000 張大胖 2000
小李 5000 null null
王師傅 20000 王師傅 3000
運行以下 sql,得到左外連接的結果集
select *  
from salary_info a 
left join bonus_info b 
on a.name=b.name

內連接與左外鏈接的區別