内连接与左外链接的区别
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