• 【MySQL】表的内连和外连


    一. 内连接

    利用where子句对两种表形成的笛卡尔积进行筛选,其实就是内连接的一种方式
    另一种方式是inner join

    select 字段 from1 inner join2 on 连接条件 and 其他条件
    
    • 1

    现在有如下表

    mysql> desc emp;
    +----------+--------------------------+------+-----+---------+-------+
    | Field    | Type                     | Null | Key | Default | Extra |
    +----------+--------------------------+------+-----+---------+-------+
    | empno    | int(6) unsigned zerofill | NO   |     | NULL    |       |
    | ename    | varchar(10)              | YES  |     | NULL    |       |
    | job      | varchar(9)               | YES  |     | NULL    |       |
    | mgr      | int(4) unsigned zerofill | YES  |     | NULL    |       |
    | hiredate | datetime                 | YES  |     | NULL    |       |
    | sal      | decimal(7,2)             | YES  |     | NULL    |       |
    | comm     | decimal(7,2)             | YES  |     | NULL    |       |
    | deptno   | int(2) unsigned zerofill | YES  |     | NULL    |       |
    +----------+--------------------------+------+-----+---------+-------+
    
    mysql> desc dept;
    +--------+--------------------------+------+-----+---------+-------+
    | Field  | Type                     | Null | Key | Default | Extra |
    +--------+--------------------------+------+-----+---------+-------+
    | deptno | int(2) unsigned zerofill | NO   |     | NULL    |       |
    | dname  | varchar(14)              | YES  |     | NULL    |       |
    | loc    | varchar(13)              | YES  |     | NULL    |       |
    +--------+--------------------------+------+-----+---------+-------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 使用内连接查询方式,显示员工名为SMITH的名字和部门名称

    因为员工名在emp表中,但部门名称在dept表中,所以需要对两个表进行笛卡尔积,也就是内连接

    mysql->select ename,dname from emp,dept where emp.deptno=dept.deptno and ename='SMITH'
    
    mysql->select ename,dname from emp inner join dept on emp.deptno=dept.deptno and ename='SMITH'
    
    • 1
    • 2
    • 3

    二. 外连接

    外连接分为左外连接和右外连接

    1. 左外连接

    如果联合查询,左侧的表完全显示,就是左外连接

    select 字段 from1 left join2 on 连接条件
    
    • 1

    现在有两张表

    mysql> select * from su; //学生表
    +------+------+
    | id   | name |
    +------+------+
    |    1 | jack |
    |    2 | tom  |
    |    3 | kity |
    |    4 | nono |
    +------+------+
    
    mysql> select * from exam; //成绩表
    +------+-------+
    | id   | grade |
    +------+-------+
    |    1 |    56 |
    |    2 |    76 |
    |   11 |     8 |
    +------+-------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    可以看到,不是所有学生都有成绩,也不是所有成绩都有对应的学生

    • 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
    mysql> select * from su left join exam on su.id=exam.id;
    +------+------+------+-------+
    | id   | name | id   | grade |
    +------+------+------+-------+
    |    1 | jack |    1 |    56 |
    |    2 | tom  |    2 |    76 |
    |    3 | kity | NULL |  NULL |
    |    4 | nono | NULL |  NULL |
    +------+------+------+-------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    su是左表,其信息会被完整显示出来,此时如果右表没有数据,则会使用默认值

    2. 右外连接

    如果联合查询,右侧的表完全显示我们就说是右外连接

    select 字段 from1 right join2 on 连接条件
    
    • 1

    还是上述表

    • 对su表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
    mysql> select * from su right join exam on su.id=exam.id;
    +------+------+------+-------+
    | id   | name | id   | grade |
    +------+------+------+-------+
    |    1 | jack |    1 |    56 |
    |    2 | tom  |    2 |    76 |
    | NULL | NULL |   11 |     8 |
    +------+------+------+-------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    和左外连接大抵相同

  • 相关阅读:
    Canal 安装与入门
    第一个Spring程序
    tRNA甲基化偶联3-甲基胞嘧啶(m3C)|tRNA-m3C (3-methylcy- tidine)
    Windows-Delphi 窗口置顶
    9-FreeRTOS之静态内存分配与动态内存分配
    Idea Module “xx“ must not contain source root “xxx“ 的解决
    Python脚本打包
    vscode前端常用插件
    山区自建房BCD浪涌保护器接线方案(自建房用电防雷)
    网站部署SSL证书是否会影响网站流量?
  • 原文地址:https://blog.csdn.net/m0_72563041/article/details/133818866