【MySQL探索之旅】多表查询

2024-04-19 08:12

本文主要是介绍【MySQL探索之旅】多表查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 1. 多表查询的概念
    • 1.1 笛卡尔积
  • 2. 连接查询
    • 2.1 内连接
    • 2.2 外连接
      • 2.2.1 左外连接
      • 2.2.2 右外连接
    • 2.3 自连接
  • 3. 子查询
    • 3.1 单行子查询
    • 3.2 多行子查询
  • 4. 联合查询

1. 多表查询的概念

多表查询就是对多表查询我们需要的数据. 通过笛卡尔积进行查询

1.1 笛卡尔积

百度百科:

笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。

image-20240416153106532

案例:

image-20240416153733369

笛卡尔积就是得到了一个更大的表. 列数就是原来两个表列数的之和. 行数就是原来两个表行数之乘.

【注意】:笛卡尔积是全排列的过程,在尝试穷举所有的可能性,自然就会产生一些不符合实际情况的数据

上述案例就有一部分为无效数据/无意义的数据

初始化数据:

create table student(id int, name varchar(20), classId int);
inset into student values (1,'张三',1);
insert into student values (2,'李四',2);
insert into student values (3,'赵五',3);
insert into student values (4,'赵六',4);create table class(classId int, className varchar(20));
insert into class values (1,'计算机科学1班');
insert into class values (2,'软件工程1班');
insert into class values (3,'人工智能1班');
insert into class values (5,'信息安全1班');

2. 连接查询

2.1 内连接

语法:

-- 显示内连接
select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 and 其他条件;
-- 隐式内连接
select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;

案例1:

-- 查询张三的信息
select * from student, class where student.classId = class.classId and name = '张三';
-- 或者
select * from student inner join class on student.classId = class.classId and name = '张三';

运行结果:

image-20240416160146712

案例2:

-- 查询所有有班级的学生的信息
select * from student inner join class on student.classId = class.classId;
-- 或者
select * from student, class where student.classId = class.classId;

运行结果:

image-20240416160536306

2.2 外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完
全显示我们就说是右外连接。

2.2.1 左外连接

image-20240416162417809

语法:

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

案例:

-- 查询所有同学的信息,没有班级也要显示
select * from student left join class on student.classId = class.classId;

运行结果:

image-20240416161201950

2.2.2 右外连接

image-20240416162556727

语法:

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

案例:

-- 查询所有班级的信息,没有学生的班级也要显示
select * from student right join class on student.classId = class.classId;

运行结果:

image-20240416161341743

2.3 自连接

自连接是指在同一张表连接自身进行查询。

自连接将行与行之间的关系, 转换为列于列的关系

测试表:

image-20240418203459272

案例: 查询成绩表中的 Java 成绩大于 C语言成绩的同学

image-20240418202430781

为什么直接自连接报错呢? 如何报错的呢? 通过别名的方式来进行自连接

image-20240418202732384

添加连接条件

select * from sore as s1,sore as s2 where s1.name = s2.name and s1.className ='Java' and s2.className = 'C语言' and s1.sore > s2.sore;

运行结果:

image-20240418203408939

3. 子查询

子查询是指嵌入在其他 SQL 语句中的 select语句,也叫嵌套查询

这种写法实际开发中需要慎重使用, 这种写法违背了编程基本的思想原则(化繁为简), 如果是合并之后的 SQL 命令仍然非常简单直观的话, 使用子查询也是可以的.

3.1 单行子查询

单行子查询: 返回一行记录的子查询

案例: 查询张三同学的同班同学

image-20240418204738020

上诉两条 SQL 命令就可以转化为一条命令

select name from student where classId = (select classId from student where name = '张三') and name != '张三';

运行结果:

image-20240418204911546

3.2 多行子查询

多行子查询:返回多行记录的子查询

案例: 查询学习 计算机基础 或者 Python同学的课程信息

在这里插入图片描述

上诉两条 SQL 命令就可以转化为一条命令

select * from sore where name in (select name from sore where className = '计算机基础' or className = 'Python');

运行结果:

在这里插入图片描述

4. 联合查询

在实际应用中,为了合并多个 select 的执行结果,可以使用集合操作符 unionunion all。使用unionunion all时,前后查询的结果集中,字段需要一致。

  • union : 该操作符用于取得两个结果集的并集. 当使用该操作符时,会自动去掉结果集中的重复行。

    案例: 查询成绩小于90 或者 课程为 Java 的信息

    select * from sore where sore < 90 or className = 'Java';
    select * from sore where sore < 90 union select * from sore where className = 'Java';
    

    运行结果:
    在这里插入图片描述

  • union all : 该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

    案例: 查询成绩小于90 或者 课程为 Java 的信息

    select * from sore where sore < 90 union all select * from sore where className = 'Java';
    

    在这里插入图片描述

这篇关于【MySQL探索之旅】多表查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917008

相关文章

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们