iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >【MySQL联合查询】轻松实现数据关联
  • 552
分享到

【MySQL联合查询】轻松实现数据关联

mysql数据库sqlPoweredby金山文档 2023-09-15 10:09:33 552人浏览 安东尼
摘要

1、联合查询 联合查询又称为多表查询,它的基本执行过程就是笛卡尔积 1.1 认识笛卡尔积 那么什么是笛卡尔积呢? 答:笛卡尔积就是将两张表放在一起进行计算,把第一张表的每一行分别取出来和第二张表的每一行进行连接,得到一个新的行。

1、联合查询

联合查询又称为多表查询,它的基本执行过程就是笛卡尔积

1.1 认识笛卡尔积

那么什么是笛卡尔积呢?

答:笛卡尔积就是将两张表放在一起进行计算,把第一张表的每一行分别取出来和第二张表的每一行进行连接,得到一个新的行。

举例说明笛卡尔积:

假设我们现在有两张表分别为学生信息表和班级信息表

现在我们把这两张表进行笛卡尔积操作:

笛卡尔积相当于乘法运算,列数是两个表列数之和,行数是两个表行数之积

注:笛卡尔积执行后产生的结果大多是无效的,此时我们就可以采用条件进行筛选

1.2 笛卡尔积进行多表查询

接下来我们就来试一下如何进行笛卡尔积操作:

首先创建两张表,分别为上述的学生信息表和班级信息表,创建完两张表后并给它们添加上述表中的内容

select * from student;+----+------+---------+| id | name | classid |+----+------+---------+|  1 | 张三 |       1 ||  2 | 李四 |       2 ||  3 | 王五 |       1 |+----+------+---------+
select * from class;+---------+-----------+| classid | classname |+---------+-----------+|       1 | 舞蹈班    ||       2 | 跆拳道班  |+---------+-----------+

然后对这两张表进行笛卡尔积操作

select * from student,class;+----+------+---------+---------+-----------+| id | name | classid | classid | classname |+----+------+---------+---------+-----------+|  1 | 张三 |       1 |       1 | 舞蹈班    ||  1 | 张三 |       1 |       2 | 跆拳道班  ||  2 | 李四 |       2 |       1 | 舞蹈班    ||  2 | 李四 |       2 |       2 | 跆拳道班  ||  3 | 王五 |       1 |       1 | 舞蹈班    ||  3 | 王五 |       1 |       2 | 跆拳道班  |+----+------+---------+---------+-----------+

上述的笛卡尔积执行后产生的结果大多数是无效的,此时我们就可以采用条件进行筛选

当 student 表中的 classid 和 class 表中的 classid 相等时,则这条数据是有效的数据

select * from student,class where classid = classid;ERROR 1052 (23000): Column 'classid' in where clause is ambiguous

如果直接用 classid = classid 则会报错,因为它无法分辨哪个classid 和 哪个 classid 进行比较

select * from student,class where student.classid = class.classid;+----+------+---------+---------+-----------+| id | name | classid | classid | classname |+----+------+---------+---------+-----------+|  1 | 张三 |       1 |       1 | 舞蹈班    ||  2 | 李四 |       2 |       2 | 跆拳道班  ||  3 | 王五 |       1 |       1 | 舞蹈班    |+----+------+---------+---------+-----------+

那么此时就可以采用 表名.列名 的方式进行区分

注:多表查询除了可以加上连接条件外,还可以加上其他条件

多表查询出来用 from 多个表加逗号分隔 来连接多个表外,还可以用 join on 来连接,还可以是 inner join on

join on 实现多表查询:

select * from student join class on student.classid = class.classid;+----+------+---------+---------+-----------+| id | name | classid | classid | classname |+----+------+---------+---------+-----------+|  1 | 张三 |       1 |       1 | 舞蹈班    ||  2 | 李四 |       2 |       2 | 跆拳道班  ||  3 | 王五 |       1 |       1 | 舞蹈班    |+----+------+---------+---------+-----------+

join 连接的是两个表,on 后面跟的是连接条件

inner join on 实现多表查询:

select * from student inner join class on student.classid = class.classid;+----+------+---------+---------+-----------+| id | name | classid | classid | classname |+----+------+---------+---------+-----------+|  1 | 张三 |       1 |       1 | 舞蹈班    ||  2 | 李四 |       2 |       2 | 跆拳道班  ||  3 | 王五 |       1 |       1 | 舞蹈班    |+----+------+---------+---------+-----------+

inner join on 其实跟 join on 一样,此处不做过多解释

from 多个表 和 join on 的主要区别:

  • from 多个表只能实现内连接

  • join on 既可以实现内连接也可以实现外连接

1.3 内连接和外连接

内连接 和 外连接的主要区别:

  • 当连接的两个表里面的数据是一一对应的时候,内连接和外连接其实就没啥区别

  • 当连接的两个表里面的数据不是一一对应的时候,内连接和外连接就有区别了

1.3.1 两张表一一对应

现在有两张表,分别为 student 学生表 和 score 成绩表:

select * from student;+----+------+| id | name |+----+------+|  1 | 张三 ||  2 | 李四 ||  3 | 王五 |+----+------+
select * from scoretable;+-----------+-------+| studentId | score |+-----------+-------+|         1 |    97 ||         2 |    86 ||         3 |    73 |+-----------+-------+

id 和 studentId 是一一对应的,所有内连接和外连接没什么区别

内连接:

select * from student,scoreTable where student.id = scoretable.studentId;+----+------+-----------+-------+| id | name | studentId | score |+----+------+-----------+-------+|  1 | 张三 |         1 |    97 ||  2 | 李四 |         2 |    86 ||  3 | 王五 |         3 |    73 |+----+------+-----------+-------+

外连接:

select * from student join scoreTable on student.id = scoretable.studentId;+----+------+-----------+-------+| id | name | studentId | score |+----+------+-----------+-------+|  1 | 张三 |         1 |    97 ||  2 | 李四 |         2 |    86 ||  3 | 王五 |         3 |    73 |+----+------+-----------+-------+

1.3.2 两张表不一一对应

现在有两张表,分别为 student 学生表 和 score 成绩表:

select * from student;+----+------+| id | name |+----+------+|  1 | 张三 ||  2 | 李四 ||  3 | 王五 |+----+------+
select * from scoretable;+-----------+-------+| studentId | score |+-----------+-------+|         1 |    97 ||         2 |    86 ||         6 |    73 |+-----------+-------+

现在我们可以看到 student 中的 id 为 3 的在 scoretable 中没有对应的 studentId

内连接:

select * from student,scoreTable where student.id = scoretable.studentId;+----+------+-----------+-------+| id | name | studentId | score |+----+------+-----------+-------+|  1 | 张三 |         1 |    97 ||  2 | 李四 |         2 |    86 |+----+------+-----------+-------+

当进行内连接的时候因为student中的id为3 的和scoretable中的studentId为6的不匹配所以就被筛除了没有查询出来

外连接:

当两张表不是一一对应的时候,外连接又可以分为 左外连接右外连接

  • 左外连接:left join on

select * from student left join scoreTable on student.id = scoretable.studentId;+----+------+-----------+-------+| id | name | studentId | score |+----+------+-----------+-------+|  1 | 张三 |         1 |    97 ||  2 | 李四 |         2 |    86 ||  3 | 王五 |      NULL |  NULL |+----+------+-----------+-------+

左外连接会把左表的结果尽量显示出来,如果右表中没有对应的记录,就使用NULL填充

  • 右外连接:right join on

select * from student right join scoreTable on student.id = scoretable.studentId;+------+------+-----------+-------+| id   | name | studentId | score |+------+------+-----------+-------+|    1 | 张三 |         1 |    97 ||    2 | 李四 |         2 |    86 || NULL | NULL |         6 |    73 |+------+------+-----------+-------+

右外连接会把右表的结果尽量显示出来,如果左表中没有对应的记录,就使用NULL填充

1.4 自连接

自连接:自己和自己进行笛卡尔积

自连接使用场景:当行与行进行比较时,就可以使用自连接,将行转成列进行比较

现在有两张表,分别为 scoretable 和 course

scoretable 表:

select * from scoretable;+-------+------------+-----------+| score | student_id | course_id |+-------+------------+-----------+|    70 |          1 |         1 ||    96 |          1 |         2 ||    97 |          1 |         3 ||    80 |          2 |         1 ||    92 |          2 |         2 ||    86 |          2 |         3 ||    91 |          3 |         1 ||    76 |          3 |         2 ||    77 |          3 |         3 |+-------+------------+-----------+

course 表:

select * from course;+----+------+| id | name |+----+------+|  1 | 语文 ||  2 | 数学 ||  3 | 英语 |+----+------+

现在我们要查询哪些同学的语文成绩比英语成绩低

首先自连接,将行转换成列:

select * from scoretable,scoretable;ERROR 1066 (42000): Not unique table/alias: 'scoretable'

自己跟自己连接名字不能重复

那表名不能重复,那还如何自连接呢?

答:可以起别名,起别名不光可以对列,还可以对表

select * from scoretable as s1,scoretable as s2;

自连接排列组合的时候会产生大量无效的数据,所有就需要指定连接条件

指定连接条件,将有效数据筛选出来:

select * from scoretable as s1,scoretable as s2 where s1.student_id = s2.student_id;

自连接的时候只有当 student_id 相等时才表示有效数据

添加条件,将左边表的语文成绩和右边表的英语成绩查询出来:

有效成绩查询出来后,就需要加上条件查询出左边的语文成绩和右边的英语成绩

select * from scoretable as s1,scoretable as s2 where s1.student_id = s2.student_id and s1.course_id = 1 and s2.course_id = 3;+-------+------------+-----------+-------+------------+-----------+| score | student_id | course_id | score | student_id | course_id |+-------+------------+-----------+-------+------------+-----------+|    70 |          1 |         1 |    97 |          1 |         3 ||    80 |          2 |         1 |    86 |          2 |         3 ||    91 |          3 |         1 |    77 |          3 |         3 |+-------+------------+-----------+-------+------------+-----------+

这样就将左侧的语文成绩查询出来了,右侧的英语成绩查询出来了

添加条件,将语文成绩比英语成绩低的同学查询出来:

接下来就要查询哪些同学的语文成绩比英语成绩低

select * from scoretable as s1,scoretable as s2 where s1.student_id = s2.student_id and s1.course_id = 1 and s2.course_id = 3 and s1.score < s2.score;+-------+------------+-----------+-------+------------+-----------+| score | student_id | course_id | score | student_id | course_id |+-------+------------+-----------+-------+------------+-----------+|    70 |          1 |         1 |    97 |          1 |         3 ||    80 |          2 |         1 |    86 |          2 |         3 |+-------+------------+-----------+-------+------------+-----------+2 rows in set (0.00 sec)

这样就把语文成绩比英语成绩低的学生信息查询出来了

1.5 子查询

子查询:把多个 sql 组合成一个

在实际开发中,子查询得慎用。因为子查询可能会构造出非常复杂,非常不好理解的 SQL。

写代码一般要么追求可读性和可维护性,要么追求程序的运行速度

1.5.1 单行子查询

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

student 表:

select * from student;+----+----------+------+| id | class_id | name |+----+----------+------+|  1 |        1 | 张三 ||  2 |        1 | 李四 ||  3 |        2 | 王五 ||  4 |        3 | 赵六 ||  5 |        2 | 王七 |+----+----------+------+

现在查询“张三”的同班同学,根据 class_id 进行查询

分开查询:

//查询出张三的class_idselect class_id from student where name = '张三';+----------+| class_id |+----------+|        1 |+----------+
//查询出来的张三的class_id为 1,再查询除了张三以外的class_id 为1的同学select * from student where class_id = 1 and name != '张三';+----+----------+------+| id | class_id | name |+----+----------+------+|  2 |        1 | 李四 |+----+----------+------+

单行子查询:

select * from student where class_id = ( select class_id from student where name = '张三') and name != '张三';+----+----------+------+| id | class_id | name |+----+----------+------+|  2 |        1 | 李四 |+----+----------+------+

1.5.2 多行子查询

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

scoretable 表:

select * from scoretable;+-------+------------+-----------+| score | student_id | course_id |+-------+------------+-----------+|    70 |          1 |         1 ||    96 |          1 |         2 ||    97 |          1 |         3 ||    80 |          2 |         1 ||    92 |          2 |         2 ||    86 |          2 |         3 ||    91 |          3 |         1 ||    76 |          3 |         2 ||    77 |          3 |         3 |+-------+------------+-----------+

course 表:

select * from course;+----+------+| id | name |+----+------+|  1 | 语文 ||  2 | 数学 ||  3 | 英语 |+----+------+

查询每位同学的“语文”“英语”课程的成绩信息

普通查询:

//首先查询出语文和英语成绩对应的idselect id from course where name = '语文' or name = '英语';+----+| id |+----+|  1 ||  3 |+----+
//再根据查询出来的语文英语对应的id,在 scoretable表中查询select * from scoretable where course_id = 1 or course_id = 3;+-------+------------+-----------+| score | student_id | course_id |+-------+------------+-----------+|    70 |          1 |         1 ||    97 |          1 |         3 ||    80 |          2 |         1 ||    86 |          2 |         3 ||    91 |          3 |         1 ||    77 |          3 |         3 |+-------+------------+-----------+

多行子查询:

select * from scoretable where course_id in(select id from course where name = '语文' or name = '英语');+-------+------------+-----------+| score | student_id | course_id |+-------+------------+-----------+|    70 |          1 |         1 ||    97 |          1 |         3 ||    80 |          2 |         1 ||    86 |          2 |         3 ||    91 |          3 |         1 ||    77 |          3 |         3 |+-------+------------+-----------+

1.5.3 合并查询

合并查询:就是将两个查询结果集,合并成一个

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

  • union操作符

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

course 表:

select * from course;+----+------+| id | name |+----+------+|  1 | 语文 ||  2 | 数学 ||  3 | 英语 ||  6 | 化学 ||  7 | 物理 |+----+------+

现在查询 id 小于等于 2 或者 name 为 "英文" 的课程信息

select * from course where id <= 2 union select * from course where name = '英语';+----+------+| id | name |+----+------+|  1 | 语文 ||  2 | 数学 ||  3 | 英语 |+----+------+

看到这里大家可能有个疑问,明明可以用 or 也能实现,为什么还要用 union?

答:用 or 查询只能时来自于同一个表,如果用 union 查询可以时来自于不同的表,子要查询的结果列匹配即可,匹配就是列的类型一样、列的一样、列的名字一样

  • union all 操作符

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

select * from course where id < 3 union all select * from course where name = '数学';+----+------+| id | name |+----+------+|  1 | 语文 ||  2 | 数学 ||  2 | 数学 |+----+------+

来源地址:https://blog.csdn.net/m0_66488562/article/details/129435287

您可能感兴趣的文档:

--结束END--

本文标题: 【MySQL联合查询】轻松实现数据关联

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

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

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

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

下载Word文档
猜你喜欢
  • 【MySQL联合查询】轻松实现数据关联
    1、联合查询 联合查询又称为多表查询,它的基本执行过程就是笛卡尔积 1.1 认识笛卡尔积 那么什么是笛卡尔积呢? 答:笛卡尔积就是将两张表放在一起进行计算,把第一张表的每一行分别取出来和第二张表的每一行进行连接,得到一个新的行。 ...
    99+
    2023-09-15
    mysql 数据库 sql Powered by 金山文档
  • MySQL数据库聚合查询和联合查询怎么实现
    这篇文章主要介绍“MySQL数据库聚合查询和联合查询怎么实现”,在日常操作中,相信很多人在MySQL数据库聚合查询和联合查询怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL数据库聚合查询和联合...
    99+
    2023-06-21
  • MySQL联合查询如何实现
    这篇文章主要介绍“MySQL联合查询如何实现”,在日常操作中,相信很多人在MySQL联合查询如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL联合查询如何实现”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-04
  • MySQL 数据库聚合查询和联合查询操作
    目录1. 插入被查询的结果2. 聚合查询2.1 介绍2.2 聚合函数2.3 group by 子句2.4 having3. 联合查询3.1 介绍3.2 内连接3.3 外连接...
    99+
    2022-11-12
  • MySQL数据库之联合查询 union
    目录1、应用场景2、基本语法3、order by的使用前言: 将多个查询结果的结果集合并到一起(纵向合并),字段数不变,多个查询结果的记录数合并 1、应用场景 同一张表中不同结果合并...
    99+
    2022-11-13
  • MySQL数据库之怎么联合查询
    这篇文章主要介绍了MySQL数据库之怎么联合查询的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL数据库之怎么联合查询文章都会有所收获,下面我们一起来看看吧。前言:将多个查询结果的结果集合并到一起(纵向合...
    99+
    2023-06-30
  • Mysql中怎么实现子查询和联合查询
    Mysql中怎么实现子查询和联合查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。查询: 在select查...
    99+
    2022-10-18
  • MySQL中的聚合查询和联合查询怎么实现
    这篇文章主要介绍“MySQL中的聚合查询和联合查询怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL中的聚合查询和联合查询怎么实现”文章能帮助大家解决问题。一、聚合查询(行与行之间的计...
    99+
    2023-07-05
  • MySQL联合查询实现方法详解
    联合查询简单说 就是将两次查询合并在一起 例如 我们这里有一个用户表 我们先编写一段SQL select name from staff where age > 21; 查询年龄大于21的 输...
    99+
    2022-11-01
  • MySQL聚合查询与联合查询操作实例
    目录一. 聚合查询1.聚合函数(count,sum,avg...)2.GROUP BY子句3.HAVING二. 联合查询((重点)多表)1.内连接2.外连接3.自连接4.子查...
    99+
    2022-11-13
  • mysql dblink跨库关联查询的实现
    目录1、解决方案2、操作3、缺点1、解决方案 mysql是不支持跨库连接的,如果我们实在要连接的话可以用dblink方式。 解释: dblink就是我们在创建表的时候连接到我们的远...
    99+
    2023-02-27
    mysql 跨库关联查询 mysql dblink跨库查询
  • mysql dblink跨库关联查询的实现
    目录1、解决方案2、操作3、缺点1、解决方案 mysql是不支持跨库连接的,如果我们实在要连接的话可以用dblink方式。 解释: dblink就是我们在创建表的时候连接到我们的远程库,然后我们本地新建的表数据就是映射...
    99+
    2023-02-27
    mysql 跨库关联查询 mysql dblink跨库查询
  • mysql中怎么实现跨库关联查询
    这篇文章将为大家详细讲解有关mysql中怎么实现跨库关联查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。业务场景:关联不同数据库中的表的查询比如说,要关联...
    99+
    2022-10-18
  • MySQL跨服务器关联查询的实现
    1. 首先确认服务器的Federated引擎是否开启 show engines; 2. 如果Federated 未开启,则需要开启 到mysql的my.cnf配置文件中修改在 [mysqld] 下方加入 federat...
    99+
    2023-01-05
    MySQL跨服务器关联查询 MySQL关联查询
  • mysql dblink跨库关联查询如何实现
    本文小编为大家详细介绍“mysql dblink跨库关联查询如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“mysql dblink跨库关联查询如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-05
  • Mybatis联合查询怎么实现
    本篇内容主要讲解“Mybatis联合查询怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mybatis联合查询怎么实现”吧!数据库表结构departmentemployee要求一现在的要求...
    99+
    2023-06-26
  • 数据库中关联子查询和非关联子查询有什么区别
    本篇内容主要讲解“数据库中关联子查询和非关联子查询有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据库中关联子查询和非关联子查询有什么区别”吧!子查询...
    99+
    2022-10-18
  • 如何实现mysql远程跨库联合查询
    这篇文章主要为大家展示了“如何实现mysql远程跨库联合查询”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现mysql远程跨库联合查询”这篇文章吧。情况一2个库在同一台物理主机联合查询(不...
    99+
    2023-06-29
  • 教你使用mongoose实现多集合关联查询
    目录关联查询(一对一)关联查询(一对多)1.聚合查询方式:2.虚拟字段查询方式总结在使用node开发后端项目的时候,通常会选择mongodb作为数据库,而使用mongodb通常是选择...
    99+
    2022-11-13
  • 如何使用mongoose实现多集合关联查询
    这篇文章主要介绍了如何使用mongoose实现多集合关联查询,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在使用node开发后端项目的时候,通常会选择mongodb作为数据库...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作