首页 > 数据库 >18、MySQL多表连查详解

18、MySQL多表连查详解

时间:2024-04-03 19:14:18浏览次数:23  
标签:返回 JOIN 多表连查 18 连接 MySQL 左表 匹配 id

MySQL的多表连查(即多表连接查询)对于数据库管理员、开发人员以及数据分析师来说都是非常重要的。对此,笔者专门写一文进行详细讲解,以便个人学习:

首先建立两张表用于数据验证:

 

1、笛卡尔积:

笛卡儿积(Cartesian product)是指在两个集合A和B之间的所有可能的有序对的集合。具体来说,如果A是一个集合,B也是一个集合,那么A和B的笛卡儿积A×B是一个新的集合,该集合中的元素是A中的元素和B中的元素的所有可能的有序对

例如,如果A = {a, b},B = {1, 2, 3},那么A和B的笛卡儿积A×B就是{(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)}。在这个例子中,A×B包含了6个元素,每个元素都是一个有序对,其中第一个元素来自集合A,第二个元素来自集合B。

 

2、内连接INNER JOIN:

内连接根据两个表之间的共同字段进行匹配,并只返回那些在两个表中都存在匹配值的记录。如果某个表中的记录在另一个表中没有匹配的记录,则该记录不会出现在内连接的结果集中。

 

(1)、情况一:

SELECT * FROM `t_one` A INNER JOIN `t_two` B ON A.id = B.id

根据两表的id字段进行匹配,仅返回两个表之间存在匹配关系的行。

满足共有条件的id为1、2、3,匹配结果共9条数据:

  当id为1的匹配结果集:2x3=6

  当id为2的匹配结果集:1x2=2

  当id为3的匹配结果集:1x1=1

(2)、情况二:

SELECT * FROM `t_one` A INNER JOIN `t_two` B ON A.id = B.id AND A.id = 2

根据两表的id字段且左表id为1进行匹配,仅返回两个表之间存在匹配关系的行。

满足共有条件的id为2,匹配结果共2条数据:

  当id为2的匹配结果集:1x2=2

(3)、情况三:

SELECT * FROM `t_one` A INNER JOIN `t_two` B ON A.id = B.id WHERE A.id = 1

SQL执行过程通常是先从指定的表中获取数据(FROM子句),然后对获取的数据进行条件筛选(WHERE子句)。这种执行顺序有助于减少不必要的数据传输和计算成本,提高查询效率。FROM 子句包括左右连接(例如 LEFT JOIN、RIGHT JOIN 等)。

等价于查询首先进行连接,然后过滤结果集:

SELECT * FROM (SELECT A.id,A.`name`,B.id AS id2,B.`name` AS name2 FROM `t_one` A INNER JOIN `t_two` B ON A.id = B.id) C WHERE C.id2 = 1

 

3、左连接LEFT JOIN:

左连接(LEFT JOIN)是一种外连接,以左表为主表,左表从上到下进行匹配,返回左右表满足条件的匹配结果集。如果左表中的某一行在右表中没有匹配的行,则结果集中右表的部分将包含 NULL 值,左表正常返回。

左连接在正常使用情况下(即带有有效的连接条件)不会产生笛卡尔积。产生笛卡尔积的情况更常见于 CROSS JOIN 或在 JOIN 操作中省略了连接条件

 

(1)、情况一:

SELECT * FROM `t_one` A LEFT JOIN `t_two` B ON A.id = B.id

左连接以左边表为主表,左表从上到下进行匹配,返回左右表满足id值相等的匹配结果集。若右表不满足返回NULL,左表正常返回,共10条数据:

  当左表id为1时,满足的匹配结果集:2x3=6

  当左表id为2,满足的匹配结果集:1x2=2

  当左表id为3,满足的匹配结果集:1x1=1

  当左表id为6,满足的匹配结果集:右表不满足返回NULL,左表正常返回

(2)、情况二:

SELECT * FROM `t_one` A LEFT JOIN `t_two` B ON A.id = B.id AND A.id = 1

左连接以左边表为主表,左表从上到下进行匹配,同时返回左右表满足id值相等且左表id为1的匹配结果集,若右表不满足返回NULL,左表正常返回,共9条数据:

  当左表id为1时,满足的匹配结果集:2x3=6

  当左表id为2,满足的匹配结果集:右表不满足返回NULL,左表正常返回

  当左表id为3,满足的匹配结果集:右表不满足返回NULL,左表正常返回

  当左表id为6,满足的匹配结果集:右表不满足返回NULL,左表正常返回

(3)、情况三:

SELECT * FROM `t_one` A LEFT JOIN `t_two` B ON A.id = B.id WHERE B.id = 1

SQL执行过程通常是先从指定的表中获取数据(FROM子句),然后对获取的数据进行条件筛选(WHERE子句)。这种执行顺序有助于减少不必要的数据传输和计算成本,提高查询效率。FROM 子句包括左右连接(例如 LEFT JOIN、RIGHT JOIN 等)。

等价于查询首先进行连接,然后过滤结果集:

SELECT * FROM (SELECT A.id,A.`name`,B.id AS id2,B.`name` AS name2 FROM `t_one` A LEFT JOIN `t_two` B ON A.id = B.id) C WHERE C.id2 = 1

(4)常用应用:

查询仅左表存在的数据

SELECT * FROM `t_one` A LEFT JOIN `t_two` B ON A.id = B.id WHERE B.id IS NULL

 

4、右连接RIGHT JOIN:

右连接(RIGHT JOIN)是一种外连接,与左连接类似,此时以右表为主表,右表从上到下进行匹配,返回左右表满足条件的匹配结果集。如果右表中的某一行在左表中没有匹配的行,则结果集中左表的部分将包含 NULL 值,右表正常返回。

右连接在正常使用情况下(即带有有效的连接条件)不会产生笛卡尔积。产生笛卡尔积的情况更常见于 CROSS JOIN 或在 JOIN 操作中省略了连接条件

(1)、情况一:

SELECT * FROM `t_one` A RIGHT JOIN `t_two` B ON A.id = B.id

右连接以右边表为主表,右表从上到下进行匹配,返回左右表满足id值相等的匹配结果集。若左表不满足返回NULL,右表正常返回,共10条数据:

  当右表id为1时,满足的匹配结果集:3x2=6

  当右表id为2,满足的匹配结果集:2x1=2

  当右表id为3,满足的匹配结果集:1x1=1

  当右表id为4,满足的匹配结果集:左表不满足返回NULL,左表正常返回

(2)、情况二:

SELECT * FROM `t_one` A RIGHT JOIN `t_two` B ON A.id = B.id AND A.id = 1

右连接以右边表为主表,右表从上到下进行匹配,返回左右表满足id值相等且左表id为1的匹配结果集。若左表不满足返回NULL,右表正常返回,共10条数据:

  当右表id为1时,满足的匹配结果集:3x2=6

  当右表id为2,满足的匹配结果集:左表不满足返回NULL,左表正常返回

  当右表id为3,满足的匹配结果集:左表不满足返回NULL,左表正常返回

  当右表id为4,满足的匹配结果集:左表不满足返回NULL,左表正常返回

(3)、情况三:

SELECT * FROM `t_one` A RIGHT JOIN `t_two` B ON A.id = B.id WHERE A.id = 1

SQL执行过程通常是先从指定的表中获取数据(FROM子句),然后对获取的数据进行条件筛选(WHERE子句)。这种执行顺序有助于减少不必要的数据传输和计算成本,提高查询效率。FROM 子句包括左右连接(例如 LEFT JOIN、RIGHT JOIN 等)。

等价于查询首先进行连接,然后过滤结果集:

SELECT * FROM (SELECT A.id,A.`name`,B.id AS id2,B.`name` AS name2 FROM `t_one` A RIGHT JOIN `t_two` B ON A.id = B.id) C WHERE C.id = 1

(4)常用应用:

查询仅右表存在的数据

SELECT * FROM `t_one` A RIGHT JOIN `t_two` B ON A.id = B.id WHERE A.id IS NULL

 

5、全连接UNION:

全连接(Full Join)不是SQL中的标准连接类型,MySQL不支持。采用UNION 操作,可以用于合并两个查询的结果集,包括它们的交集和并集。

UNION操作用于合并两个或多个SELECT语句的结果集。它会删除重复的行,只返回唯一的行。如果需要保留重复的行,可以使用 UNION ALL

对于UNION操作,要求参与UNION的查询结果集的字段数必须相同,否则会出现语法错误。这是因为UNION是用来合并两个或多个查询结果集的,合并时要求每个查询结果的列数和数据类型必须相匹配,以便得到一个统一的结果集。

SELECT column1, column2

FROM table1

UNION

SELECT column1, column2

FROM table2;

 

6、多表逗号交叉连接:

多表逗号连接(Cross Join)和内连接(Inner Join)在某种程度上是类似的,但也有一些重要的区别:

(1)、多表逗号连接返回的结果是两个或多个表的笛卡尔积,即每个表的每一行都与其他表的每一行组合在一起。

(2)、内连接返回的结果是根据连接条件匹配的行,只有满足连接条件的行才会出现在结果集中。

 

 

标签:返回,JOIN,多表连查,18,连接,MySQL,左表,匹配,id
From: https://www.cnblogs.com/Iven-L/p/18113356

相关文章

  • PTA:7-118 N个数求和
    作者 陈越单位 浙江大学本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。输入格式:输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1a2/b2...给出N个有理数。题目保证所有分子和分母都在长整......
  • 表设计的18条军规
    表设计的18条军规 前言对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节。系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等。后端开发的日常工作,需要不断的建库和建表,来满足业务需求。通常情况下,建库的频率比建表要低很多,所以,我......
  • MySQL索引背后的数据结构及算法原理
    摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MyS......
  • 使用 Node.js 连接 MySQL
    使用Node.js连接MySQL 概述当使用Node.js开发Web应用程序时,经常需要与数据库进行交互来存储和检索数据。MySQL 是一个流行的关系型数据库管理系统,它提供了强大的功能和性能。本文将介绍如何使用Node.js连接MySQL数据库,并展示一些常见的操作示例。开始在这里我们将......
  • MySQL 中 GROUP_CONCAT() 用法
    GROUP_CONCAT是一种SQL聚合函数,用于将组内的多个值连接成一个字符串,并以指定的分隔符分隔这些值。在MySQL中,GROUP_CONCAT可以用于将多个行的值合并成一个字符串,并返回该字符串。以下是GROUP_CONCAT的基本语法:SELECTcolumn1,GROUP_CONCAT(column2SEPARATOR',')ASco......
  • MySQL 中模糊匹配
    1、like模糊匹配-单项常用通配符有两个:'%'百分号、'_'下划线。%:可以匹配0~多个字符_:只能匹配1个字符selectid,device_id,universityfromuser_profilewhere(universitylike'北京%'oruniversitylike'上海%')and(universitylike'%学院'orun......
  • 基于springboot+vue+Mysql的招生管理系统
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示系统首页学生注册专业信息个人中心管理员登录管理员功能界面学生管理专业信息管理专业报名......
  • 06 MySQL数据操作DML---插入insert、删除delete、更新update、查询select
    DML是指数据操作语言,用来对数据库中表的数据记录进行更新插入insert向表中指定字段插入数据insertinto表名(字段名1,字段名2,字段名3,...)values(字段名1值,字段名2值,字段名3值,...)INSERTintomy_student(id,`name`,age)values(2,'Jack',12);字段列表不一定非要......
  • mysql-多表连接的学习
    --4.3--****************************************************************************************1.多表连接1.1为了避免笛卡尔积,可以在where中加入有效的连接条件SELECTtable1.column,table2.columnFROMtable1,table2WHEREtable1.col......
  • mysql --聚合函数的学习
    聚合函数1.常见的聚合函数1.1AVG/SUM:只适用于数值类型的字段(或变量)1.2MAX/MIN:适用于数值类型、字符串类型、时间日期类型的字段(或变量)1.3COUNT1.3.1作用:计算指定字段在查询结构中出现的个数(不包含NULL值的)#如果计算表中有......