iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >【MySQL】MySQL表之联合查询(多表查询)
  • 833
分享到

【MySQL】MySQL表之联合查询(多表查询)

mysql数据库java 2023-08-16 14:08:53 833人浏览 八月长安
摘要

📌前言:本篇博客介绍Mysql数据库的mysql表之联合查询(多表查询),学习Mysql之前要先安装好MySQL,如果还没有安装的小伙伴可以看看博主前面的博客,里面有详细的安装教程。 那我们废话不多说,直接进入主体!

📌前言:本篇博客介绍Mysql数据库mysql表之联合查询(多表查询),学习Mysql之前要先安装好MySQL,如果还没有安装的小伙伴可以看看博主前面的博客,里面有详细的安装教程

那我们废话不多说,直接进入主体!🚀🚀🚀


一.联合查询

然后就到联合查询,所谓联合,就是把多个表的记录往一起合并,一起进行查询,也叫多表查询。多表查询是整个sql中最复杂的部分,也是笔试中爱考的部分,但是实际开发中一般禁止使用多表查询。

  • Tip📣:虽然多表查询是笔试中爱考的部分,但在实际工作中截然不同,就所谓面试造核弹,工作拧螺丝~

1.笛卡尔积

📌多表查询中的核心操作,就是笛卡尔积,笛卡尔积的计算非常简单,就类似于排列组合,笛卡尔积是针对任意两张表之间进行的运算。

比如:

再比如:

图中的就是笛卡尔积的运算过程:

  1. 先拿第一张表的第一条记录,和第二张表的每个记录,分别组合,得到一组新的数据。
  2. 然后继续再拿第一张表的第二条记录,重复刚刚的操作。
  3. 最后形成的所有新的数据,就是我们的笛卡尔积。

所以针对A B两张表,得到的笛卡尔积,此时笛卡尔积的列数,就是A的列数+B的列数,笛卡尔积的行数,就是A的行数 * B的行数。所以在实际工作中,公司的数据量非常大,那么进行多表查询的时候就很可能把数据给搞挂了,所以就直接一刀切,禁止多表查询这种危险性较大的操作。

上述操作我们在MySQL中操作一下:

先创建好studentclass表:

mysql> create table student(studentId int,name varchar(50),classId int);   insert into student values(1,'张三',1);   insert into student values(2,'李四',1);   insert into student values(3,'王五',2);   insert into student values(4,'赵六',2);
mysql> create table class(classId int,name varchar(20));   insert into class values(1,'java1班');   insert into class values(1,'java2班');

创建好之后我们查询一下确认没错:

然后就是我们的笛卡尔积,在SQL中进行笛卡尔积,最简单的做法就是直接select from后面跟上多个表名,表名之间用逗号分割。

mysql> select * from student,class;

可以看见,笛卡尔积是两张表中数据尽可能排列组合得到的,在这些排列组合中,有一些数据是我们需要的,有一些是没有意义的。也就是说,笛卡尔积是一个单纯无脑的排列组合,这些组合不一定都有意义。

像两张表中,classId这一列相等的才是我们需要的数据,对于这样的相等条件,就称为“连接条件”。带有连接条件的笛卡尔积,其实就是"多表查询"了。如果笛卡尔积中两个列的名字相同,在写条件的时候可以通过表名.列名的格式来访问,如果列名不会混淆,也就是两个列名条件不同名的话,可以通过表名.列名访问,也可以省略表名。

如:

在查询两张表后加入where连接"连接条件"。

然后我们看到还是有一些其实我们不需要的数据,在实际查询中,我们需要的数据往往只有几列,所以我们在查询的时候可以不用select * ,而是select 我们需要的那几列。如我们下面的表只想看学生对应班级名。

如:


2.创建查询例子表

然后我们学习一下各种查询,在学习这些查询之前,为了更好的说明和了解这些查询,我们先创建下列几个表,让大家更容易理解各类查询:

  • 📕classes班级表
mysql> create table classes(id int primary key auto_increment, name varchar(20), `desc` varchar(100));    insert into classes(name, `desc`) values    ('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构算法'),   ('中文系2019级3班','学习了中国传统文学'),   ('自动化2019级5班','学习了机械自动化');
  • 📙student学生表
mysql> create table student (id int primary key auto_increment, sn varchar(20),  name varchar(20), qq_mail varchar(20) , classes_id int);   insert into student(sn, name, qq_mail, classes_id) values   ('09982','黑旋风李逵','xuanfeng@qq.com',1),   ('00835','菩提老祖',null,1),   ('00391','白素贞',null,1),   ('00031','许仙','xuxian@qq.com',1),   ('00054','不想毕业',null,1),   ('51234','好好说话','say@qq.com',2),   ('83223','tellme',null,2),   ('09527','老外学中文','foreigner@qq.com',2);
  • 📗course课程表
mysql> create table course(id int primary key auto_increment, name varchar(20));   insert into course(name) values   ('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');
  • 📒score分数表
mysql> create table score(score decimal(3, 1), student_id int, course_id int);   insert into score(score, student_id, course_id) values   //黑旋风李逵   (70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),   //菩提老祖   (60, 2, 1),(59.5, 2, 5),   //白素贞   (33, 3, 1),(68, 3, 3),(99, 3, 5),   //许仙   (67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),   //不想毕业   (81, 5, 1),(37, 5, 5),   //好好说话   (56, 6, 2),(43, 6, 4),(79, 6, 6),   //tellme   (80, 7, 2),(92, 7, 6);

创建好之后我们一一查询一下:

实际上,在这个场景中,涉及到的主体有三个,学生,班级和课程,学生和班级是一对一的关系,学生和课程是多对多的关系,而分数表,就是学生和课程之间的关联表。

下面正式开始介绍我们的联合查询中的各种查询~


3.内连接

我们用案例来学习我们的查询,首先登场的是内连接查询,这种查询是比较常用的查询,也是我们上面有了解过的查询。

  • 例子1:查询“许仙”同学的成绩

📌第一步:查表

首先我们要想到,查询某位同学的成绩,所用到的表应该是哪些,这里是学生表和成绩表,所以我们查询的应该是学生表和成绩表,最简单的联合起来就是在select的时候用逗号连接两个表,比如select * from student,score; 我们看一下查询结果(此处省略n行):

可以看到我们查询的数据有160行那么多,我们仔细观察发现,虽然我们查询的是两张表的结果,但是查询结果的表是合并的,也就是说如果我们没有用上一些条件的话,查出来的表就相当于排列组合出来的无效数据了,所以我们要在查询多张表时应该有一个匹配的数据作为桥梁

📌第二步:确定条件

我们把学生表和成绩表拿下来,发现他们的学生id是一样的,所以我们可以在查询这两张表的时候用id作为配对条件,这时候用我们之前学过的where子句就可以啦。

📌第三步:查询结果

最后查询得到的就是一张对应学生对应成绩的表了,然后我们题目写的是要得到许仙同学的成绩,所以我们再筛选名字为许仙的就可以啦:

这便是我们其中一种内连接,也就是用条件匹配来联合多张表,我们还有一种内连接的写法是用join...on,其实都差不多,前面的是用逗号和where连接查询两张表,这里就用join...on连接,如下面的写法的查询结果是和上面一样的:

select * from student join score on student.id = score.student_id and student.name = '许仙'

内连接:

  1. select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
  2. select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
  • 例子2:查询所有同学的总成绩,及同学的个人信息

同样的先看一下总成绩和个人信息需要用到的表,然后连接两张表,条件是id相同,以及需要的是同学的个人信息,当然这里还有总成绩需要排序后计算和,所以我们就可以写出查询:

select student.sn,student.name,student.qq_mail,sum(score.score) from student,score where student.id = score.student_id group by student_id;

查询结果:

像这样的多表查询,看起来比较复杂,按顺序多写几遍就可以得到规律,很流畅的就写出来了。比如这里的查询的是同学信息和总成绩,使用的表是学生表和成绩表,条件是id相同,总成绩需要排序计算。

  • 例子3:查询所有同学的各科成绩

这里的话同样是先分析一下,查询的是各科成绩,需要用到的表是学生表,成绩表还有课程表,那么三个表联合的时候也一样,只要条件匹配就可以很好的连起来。

select student.name,course.name,score.score from student,course,score where student.id = score.student_id and course.id = score.course_id;

查询结果:

当然三张表的也可以用join...on来实现,可以写成下面的样子:

from 表1 join 表2 on 条件 join 表3 on 条件

但是这种内连接的形式,我们还是推荐使用where子句,那join有什么用呢,这就到我们另一个连接,也就是外连接了。


4.外连接

join...on能够做到上面写法做不到的事情,也就是外连接。

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

例表创建:

//学生表mysql> create table student2(id int,name varchar(50),classes_id int);   insert into student2 values(1,'张三',1);   insert into student2 values(2,'李四',1);   insert into student2 values(3,'王五',2);   insert into student2 values(4,'赵六',3);
//班级表mysql> create table class(id int,name varchar(50));    insert into class values(1,'java1班');      insert into class values(,'java2班');

那么外连接是什么意思呢,我们同样用查询来说明一下,我们先看看这里的学生表和班级表的内容:

当我们学生表中有班级编号是3的同学,但是班级表却没有的时候,如果使用内连接时,就会省略掉班级编号为3的同学,比如我们现在使用内连接:

查询结果:

mysql> select student2.name,class.name from class,student2 where student2.classes_id = class.id;+--------+----------+| name   | name     |+--------+----------+| 张三   | java1班  || 李四   | java1班  || 王五   | java2班  |+--------+----------+

上面的这种写法就相当于inner join,所以当我们需要保存其中一张表的完整性的时候,我们就用到了外连接,这里的左外连接和右外连接的意思就是,左外就是保留左边的完整性,右外就是保留右边的完整性。也就是说左外链接的时候就会以左侧的表为主,尽可能的把数据都列出来,大不了后侧表对应列变成null。

语法:

  • 左外连接,表1完全显示 select 字段名 from 表名1 left join 表名2 on 连接条件;
  • 右外连接,表2完全显示 select 字段 from 表名1 right join 表名2 on 连接条件;

例子(当连接中为保留表的完整性就会在没有数据的地方加入null):

mysql> select student2.name,class.name from student2 left join class on student2.classes_id = class.id;+--------+----------+| name   | name     |+--------+----------+| 张三   | java1班  || 李四   | java1班  || 王五   | java2班  || 赵六   | NULL     |+--------+----------+

这就是外连接。

也就是说,内连接就是包含两个表中同时拥有的记录,而外连接中,左外连接是以左侧表为主,左侧表中的每个记录都会在左外连接中有体现,右外连接则是以右侧表为主,每个记录在右外连接都有体现,那么有没有既包含左侧表又包含右侧表的"全外连接"呢,答案是mysql不支持!


5.自连接

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

我们可以继续使用上面的成绩表和课程表来给大家说明,为了可观我们先把表拿下来:

mysql> select * from course;+----+--------------------+| id | name               |+----+--------------------+|  1 | Java               ||  2 | 中国传统文化       ||  3 | 计算机原理         ||  4 | 语文               ||  5 | 高阶数学           ||  6 | 英文               |+----+--------------------+6 rows in set (0.00 sec)
mysql> select * from score;+-------+------------+-----------+| score | student_id | course_id |+-------+------------+-----------+|  70.5 |          1 |         1 ||  98.5 |          1 |         3 ||  33.0 |          1 |         5 ||  98.0 |          1 |         6 ||  60.0 |          2 |         1 ||  59.5 |          2 |         5 ||  .... |     .....  |     ....  |+-------+------------+-----------+(省略了后面部分数据)20 rows in set (0.00 sec)

我们依然用例题的方式来理解:

例子:显示所有"计算机原理"成绩比"Java"成绩高的成绩信息

首先我们要知道这里的是成绩比较,而成绩都在成绩表中,所以应该是用自连接来查看自己,但是这里涉及到两个科目,所以需要一些课程表的信息,但需要的不多,所以没必要也连接课程表,我们只需要知道这两个科目在成绩表中的id就行。

查看两个科目在成绩表中的course_id

select id,name from course where name = 'Java' or name = '计算机原理';

发现id是1和3,我们就可以在成绩表中自连接查询了

mysql> select s1.* from score s1,score s2 where s1.student_id = s2.student_id and    -> s1.score < s2.score and    -> s1.course_id = 1 and    -> s2.course_id = 3;

这里的意思是查询成绩表中,s1代表id为1的科目,s2代表id为3的科目,查询其中学生id一样并且s1成绩小于s2的,显示s1的所有信息,也就是成绩低那一科的信息。这里就是用自连接的方式去显示,同样也可以用join on 去写。


🚩以上便上MySQL表之联合查询(多表查询),欢迎关注。一起学习,共同努力!

还有一件事:

来源地址:https://blog.csdn.net/weixin_54225715/article/details/124528207

您可能感兴趣的文档:

--结束END--

本文标题: 【MySQL】MySQL表之联合查询(多表查询)

本文链接: https://www.lsjlt.com/news/371305.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【MySQL】MySQL表之联合查询(多表查询)
    📌前言:本篇博客介绍MySQL数据库的MySQL表之联合查询(多表查询),学习MySQL之前要先安装好MySQL,如果还没有安装的小伙伴可以看看博主前面的博客,里面有详细的安装教程。 那我们废话不多说,直接进入主体!...
    99+
    2023-08-16
    mysql 数据库 java
  • MySQL联合查询(多表查询)
    一、内连接 select *from 表1 [ inner | cross ] join 表2 [ on过滤条件 ] [ where查询条件 ] ; [ inner | cross ]: join 内连接关键字(必须要有...
    99+
    2023-09-14
    mysql 数据库 database
  • 【MySQL】聚合查询 + 多表联合查询(重点)
    文章目录 前言一、聚合查询1, 聚合函数2, 聚合函数使用示例3, GROUP BY 子句4, HAVING 子句 二、联合查询(重点)1, 笛卡尔积2, 内连接2.1, 示例12...
    99+
    2023-09-29
    mysql 数据库 聚合查询 联合查询 内连接
  • MySQL之单表查询、多表查询
    一、单表查询: 单个表的查询方法及语法顺序需要通过实际例子来熟悉 先将表数据创建下: mysql> create database singe_t1; # 建个数据库singe_t1 Query OK, 1 row aff...
    99+
    2023-01-31
    MySQL
  • Mysql 多表关联查询
    文章目录 1. Mysql中表之间的关系1.1 多表关系1.2 外键约束 2. 多表联合查询2.1 交叉连接查询:笛卡尔积2.2 内连接查询:inner join2.3 外连接查询2.3.1 左连接:2.3.2 右连接:2.3....
    99+
    2023-08-21
    mysql 数据库 sql
  • mysql多表联合的查询方法
    本文主要给大家介绍mysql多表联合的查询方法,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql多表联合的查询方法吧。   ...
    99+
    2022-10-18
  • 【MySQL】详解聚合查询、多表查询
    MySQL 增删查改(进阶) 文章目录 MySQL 增删查改(进阶)01 表的设计表的三大范式 02 查询操作进阶新增聚合查询countsumavgmaxmin 分组查询 GR...
    99+
    2023-10-07
    mysql adb 数据库
  • MySQL的多表关联查询
    一、多表关联查询 多表关联查询是使用一条SQL语句,将关联的多张表的数据查询出来。 1.1 交叉查询 交叉查询就是将多张表的数据没有条件地连接在一起进行展示。 1.1.1 语法 使用交叉查询类别和商品 -- 目标:查询所有分类,以及每个分类...
    99+
    2023-08-22
    mysql 数据库 java
  • Mysql 复杂查询丨联表查询
    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! JOIN(联表查询) 联表查询(Join)是一种在数据库中使用多个表进行关联查询的操...
    99+
    2023-08-16
    mysql 数据库
  • 详解MySQL子查询(嵌套查询)、联结表、组合查询
    一、子查询 MySQL 4.1版本及以上支持子查询 子查询:嵌套在其他查询中的查询。 子查询的作用: 1、进行过滤: 实例1:检索订购物品TNT2的所有客户的ID = + 一般,在WHERE...
    99+
    2022-10-18
  • MySQL DML操作--------多表联合查询实战
    1. 背景   * 多表联合查询是把不同表的记录到一起的一种方式   * 在SQL标准中规划的联合(join)大致分内连接,外连接,全连接。其中外连接又分左外连接,右...
    99+
    2022-10-18
  • MySQL----多表查询
    MySQL----多表查询 多表关系表与表之间的联系:一对多(多对一)多对多一对一 多表查询多表查询的分类数据准备内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询 多表查询案例 多表关系 在进...
    99+
    2023-08-19
    mysql sql 数据库 多表查询 DB
  • 【MySQL】多表查询
    多表查询 多表关系 一对多(多对一)多对多一对一 一对多 案例:部门与员工 关系:一个部门对应多个员工,一个员工对应一个部门 实现:在多的一方建立外键,指向一的一方的主键 多对多 案例:学生与课程 关...
    99+
    2023-10-04
    mysql 数据库 sql
  • MySQL 多表查询
      union 结果集合并 使用多个select分别查询不同的表,把多个select查到的记录合并在一起 一个select查到m条记录,另一个select查到n条记录,合并之后就是m+n条记录   #查询全校...
    99+
    2017-05-29
    MySQL 多表查询
  • MySQL --- 多表查询
    多表查询、事务、以及提升查询效率最有手段的索引  一. 多表查询 1.1 多表查询 --- 概述 1.1.1 数据准备 将资料中准备好的多表查询数据准备的SQL脚本导入数据库中。 部门表: 员工表: 1.1.2 介绍 多表查询:指从多张表...
    99+
    2023-09-02
    mysql 数据库
  • MySQL多表查询
    文章目录 一、什么是多表查询1、概述2、笛卡尔积现象 二、多表查询的分类1、等值连接 vs非等值连接2、自连接 vs 非自连接3、内连接 vs 外连接4、满外连接(FULL OUTE...
    99+
    2023-09-01
    mysql 数据库 sql
  • mysql-多表查询
    准备工作:准备两张表,部门表(department)、员工表(employee)mysql> create database db2;Query OK, 1 row affected (0.00 sec)mysql> use d...
    99+
    2023-01-30
    mysql
  • 连接查询(多表查询)——MySQL
    连接查询(多表查询) 又称多表查询,当查询的字段涉及多个表的时候,就要用到连接查询 分类: 为表起别名: 提高语句的简洁度区分多个重名字段注意:如果为表起了别名,则查询的字段就不能使用原来的别名去限定 内连接 查询A、B 交集部分数据 语...
    99+
    2023-08-18
    数据库 mysql 多表查询
  • MySQL数据库查询之多表查询总结
    目录多表关系表与表之间的联系:一对多(多对一)多对多一对一多表查询多表查询的分类1.连接查询:2.子查询内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询多表查询案例...
    99+
    2022-11-13
    mysql多表查询语句 mysql多表连接查询方式 mysql多表查询面试题
  • 【MySQL系列】MySQL复合查询的学习 _ 多表查询 | 自连接 | 子查询 | 合并查询
    「前言」文章内容大致是对MySQL复合查询的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、基本查询回顾二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4....
    99+
    2023-08-30
    mysql 学习 android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作