【MySQL】第十二弹---表连接详解:从内连接到外连接

【MySQL】第十二弹---表连接详解:从内连接到外连接

✨个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】【MySQL】

目录

1.表的内连和外连

1.1 内连接

1.2 外连接

1.2.1 左外连接

1.2.1 右外连接

1.3 实战OJ


1.表的内连和外连

表的连接分为内连和外连。

1.1 内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。

语法:

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

备注:前面学习的都是内连接。

案例:

  • 显示SMITH的名字和部门名称

使用笛卡尔积

mysql> select ename,dname from emp,dept where emp.deptno = dept.deptno and ename = 'SMITH'; +-------+----------+ | ename | dname | +-------+----------+ | SMITH | RESEARCH | +-------+----------+ 1 row in set (0.00 sec) 

使用内连接

# 方式一:使用and连接条件 mysql> select ename,dname from emp inner join dept on emp.deptno = dept.deptno and ename = 'SMITH'; +-------+----------+ | ename | dname | +-------+----------+ | SMITH | RESEARCH | +-------+----------+ 1 row in set (0.01 sec) # 方式二:使用where条件(更好理解,先新建表再条件查询) mysql> select ename,dname from emp inner join dept on emp.deptno = dept.deptno where ename = 'SMITH'; +-------+----------+ | ename | dname | +-------+----------+ | SMITH | RESEARCH | +-------+----------+ 1 row in set (0.00 sec) 

1.2 外连接

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

1.2.1 左外连接

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

语法: 

select 字段名  from 表名1 left join 表名2 on 连接条件

案例:

新建两张表

学生表

# 创建学生表 mysql> create table stu (id int, name varchar(30)); Query OK, 0 rows affected (0.06 sec) # 查看表结构 mysql> desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(30) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) # 插入数据 mysql> insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 # 查询数据 mysql> select * from stu; +------+------+ | id | name | +------+------+ | 1 | jack | | 2 | tom | | 3 | kity | | 4 | nono | +------+------+ 4 rows in set (0.00 sec) 

成绩表

# 创建成绩表 mysql> create table exam (id int, grade int); Query OK, 0 rows affected (0.06 sec) # 查看表结构 mysql> desc exam; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | grade | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.01 sec) # 插入数据 mysql> insert into exam values(1, 56),(2,76),(11, 8); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 # 查看表数据 mysql> select * from exam; +------+-------+ | id | grade | +------+-------+ | 1 | 56 | | 2 | 76 | | 11 | 8 | +------+-------+ 3 rows in set (0.00 sec) 
  • 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
学生表的内容要全部显示出来,使用左外连接。
mysql> select * from stu left join exam on stu.id = exam.id; +------+------+------+-------+ | id | name | id | grade | +------+------+------+-------+ | 1 | jack | 1 | 56 | | 2 | tom | 2 | 76 | | 3 | kity | NULL | NULL | | 4 | nono | NULL | NULL | +------+------+------+-------+ 4 rows in set (0.00 sec) 
在外连接中,有的信息直接打印,没有的信息使用NULL打印。

1.2.1 右外连接
 

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

语法:

select 字段 from 表名1 right join 表名2  on 连接条件;

案例:

  • 对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
把成绩表都打印出来,使用右外连接。
mysql> select * from stu right join exam on stu.id = exam.id; +------+------+------+-------+ | id | name | id | grade | +------+------+------+-------+ | 1 | jack | 1 | 56 | | 2 | tom | 2 | 76 | | NULL | NULL | 11 | 8 | +------+------+------+-------+ 3 rows in set (0.00 sec) 
也可以使用左外连接,将成绩表作为左表。 
mysql> select * from exam left join stu on exam.id = stu.id; +------+-------+------+------+ | id | grade | id | name | +------+-------+------+------+ | 1 | 56 | 1 | jack | | 2 | 76 | 2 | tom | | 11 | 8 | NULL | NULL | +------+-------+------+------+ 3 rows in set (0.00 sec) 

1.3 实战OJ

Rank Scores

Exchange Seats

Read more

【C++98 实战】从零实现学生成绩管理系统(夯实基础+完整功能)

前言 对于C++初学者而言,单纯的语法学习往往枯燥且难以落地,而通过实战项目将语法知识转化为实际应用,是提升编程能力的核心路径。本文将基于C++98标准(兼容老旧编译器,无C++11及以上特性),从零实现一款功能完整的学生成绩管理系统,覆盖「信息录入、成绩修改、多条件查询、数据统计、排序、文件导出」等核心场景,帮助大家夯实C++基础语法,掌握批量数据管理的核心思路。 注:本文使用AI编写 一、项目设计思路 1. 核心技术选型 本项目聚焦C++基础核心知识点,不引入第三方库,纯原生实现,技术栈如下: * 数据封装:结构体(struct)封装学生信息,类(class)封装核心业务逻辑,实现数据与逻辑分离; * 容器存储:使用std::vector动态存储学生信息,适配学生数量动态变化; * 文件操作:std::fstream实现数据持久化导出,兼容C+

By Ne0inhk
【C++】优选算法必修篇之双指针实战:有效三角形个数 & 和为s的两个数字

【C++】优选算法必修篇之双指针实战:有效三角形个数 & 和为s的两个数字

【C++】优选算法必修篇之双指针实战:有效三角形个数 & 和为s的两个数字 * 双指针应用场景 * 目录 * 1. 有效三角形个数 * 1.1 题目链接 * 1.2 题目描述 * 1.3 题目示例 * 1.4 算法思路 * 1.5 核心代码 * 1.6 示例测试(总代码) * 2. 和为s的两个数字 * 2.1 题目链接 * 2.2 题目描述 * 2.3 题目示例 * 2.4 算法思路 * 2.5 核心代码 * 2.6 示例测试(总代码) * 总结

By Ne0inhk
海康工业相机SDK二次开发(VS+QT+海康SDK+C++)

海康工业相机SDK二次开发(VS+QT+海康SDK+C++)

前言 工业相机在现代制造和工业自动化中扮演了至关重要的角色,尤其是在高精度、高速度检测中。海康威视工业相机以其性能稳定、图像质量高、兼容性强而受到广泛青睐。特别是搞机器视觉的小伙伴们跟海康打交道肯定不在少数,笔者在平常项目中跟海康相关人员对接也是比较多。 那么,本文将全面介绍如何基于海康工业相机的 SDK,使用 Visual Studio 和 Qt 构建上位机程序,逐步实现工业相机的图像采集、显示以及参数配置。 以下是巴斯勒相机开发 巴斯勒工业相机SDK二次开发(VS+QT+巴斯勒SDK+C++)-ZEEKLOG博客 一、海康工业相机简介 1. 工业相机的主要功能 * 图像采集:捕获高速、高清的静态或动态图像。 * 高速传输:通过 GigE 或 USB 接口将图像传输到上位机。 * 稳定运行:设计用于工业环境,具有高可靠性。 2. 海康工业相机优势 * 高分辨率:支持从 0.3MP 到

By Ne0inhk