zoukankan      html  css  js  c++  java
  • 内连接与左外链接的区别

    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
  • 相关阅读:
    php自定义函数call_user_func和call_user_func_array详解
    微信开发(一) 服务器配置
    6487. 【GDOI2020模拟02.29】列强争霸war
    关于循环顺序对时间影响的一点研究
    6486. 【GDOI2020模拟02.25】向日葵人生
    6485. 【GDOI2020模拟02.25】沙塔斯月光
    6478. 【GDOI2020模拟02.19】C(上下界费用流、费用流消负环)
    6461. 【GDOI2020模拟02.05】生成树(矩阵树及其扩展、二维拉格朗日插值)
    上下界网络流&费用流
    6467. 【GDOI2020模拟02.09】西行寺无余涅槃(FWT的性质)
  • 原文地址:https://www.cnblogs.com/stone94/p/10224415.html
Copyright © 2011-2022 走看看