內連接與左外鏈接的區別
阿新 • • 發佈:2019-01-05
sql -c sele practice creat col ice 函數 div
需求
發工資的日子到了,根據工資表和獎金表,統計所有員工的應發薪水
如果使用內連接,sql 語句如下:
於是,小李感覺很委屈,因為他的工資沒到賬
左外連接:,sql 語句如下:
小李也正常收到了工資
註:
當一個不為 null 的數值與一個為 null 的數值相加時,得到的結果為 null。
故用 IFNULL 函數,當參與計算的數值為 null 時,用數字 0 代替其參與計算。
如果不用,那麽左外連接的結果就是小李對應的應發薪水為 null
輔助理解
內連接時,連接後的結果集為:
運行以下 sql,得到內連接的結果集
運行以下 sql,得到左外連接的結果集
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 |
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 |
a.name | a.salary | b.name | b.bonus |
張大胖 | 10000 | 張大胖 | 2000 |
王師傅 | 20000 | 王師傅 | 3000 |
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 |
select * from salary_info a left join bonus_info b on a.name=b.name
內連接與左外鏈接的區別