当前位置: 首页 > article >正文

MYSQL_联合查询(全)

上篇复习:

聚合函数


1.COUNT(列名/常量/*)#统计记录的条数,推荐使用count(*)
2.SUM(列名)# 求和,列必须是数值类型
ROUND(数值,小数点的位数)#格式化小数输出格式
3.AVG(列名)# 求平均值,列必须是数值类型
4. MAX(列名) # 求最大值,列必须是数值类型
5. MIN(列名) # 求最小值,列必须是数值类型


分组查询


select 要分组的列,聚合函数(列名)from 表名 group by 要分组的列 having 对分组的结果进行过滤

WHERE子句与HAVING子句的区别

1.WHERE子句:用于在分组前过滤数据行。
2.HAVING子句:用于在分组后对分组结果进行筛选,特别适用于聚合函数的条件过滤。
3.HAVING与GROUP BY:通常与GROUP BY一起使用,便于对分组后的结果进行筛选。
4.WHERE和HAVING的结合使用:先使用WHERE子句进行行级筛选,然后再使用子句HAVING进行分组后的筛选。

0b0ea872e761450eaf233c20139120d7.webp

联合查询:

1.使用联合查询的步骤

  • 明确查询需求:确定要从两个(或多个)表中查询哪些数据。明确哪些表包含所需信息,哪些字段之间有关系。(笛卡尔积)

  • 选择 JOIN 类型:根据需求选择合适的 JOIN 类型:

    • INNER JOIN(内连接):只返回两个表中都有匹配的数据。
    • LEFT JOIN(左连接):返回左表的所有数据,右表中没有匹配时显示 NULL
    • RIGHT JOIN(右连接):返回右表的所有数据,左表中没有匹配时显示 NULL
    • FULL JOIN(全连接):(MySQL 需用 UNION 实现):返回两个表中的所有数据。
    • CROSS JOIN(交叉连接):返回两个表的笛卡尔积,生成所有可能的组合。
  • 编写 JOIN 查询语句:编写 SQL 查询语句,指定表之间的连接条件(ON 条件),通常是表之间的主键和外键。例如:

  • 7dbb9eccd43c486090d07ce43af9d10f.png

  • (可选)添加过滤条件:使用 WHERE 子句进一步限制结果集,比如查询特定条件下的记录。

  • 执行并验证查询结果:运行查询,检查返回的结果是否符合需求。可以使用一些聚合函数(如 COUNT()SUM() 等)来检查结果数量。

看完上述使用联合查询的步骤后,相信大家已经对联合查询有了一定的理解。

那么为什么要使用联合查询呢?

联合查询的主要作用是从多个表中查询相关数据,并将数据组合成有意义的结果集。有以下特点

  • 避免数据冗余:在设计数据库时,通常会使用范式分割数据,减少冗余。联合查询帮助从分散的表中合并数据,避免重复存储大量数据。

  • 高效的数据管理:当数据分布在多个表中时,通过 JOIN 可以快速检索关联数据。例如,在订单系统中,可以通过 JOIN 将订单表和商品表关联,以查看某个订单的所有商品信息。

  • 多表关系查询:大部分实际应用场景的数据是相互关联的,比如员工和部门、学生和课程、客户和订单。联合查询能够从关联表中提取相关数据,满足业务需求。

  • 简化查询逻辑:在单条 SQL 语句中获取多个表的关联数据,简化了数据提取和处理的逻辑,避免了在应用程序中多次访问数据库的需求。

我将从使用联合查询的步骤中一 一为大家讲解:

1.笛卡尔积的讲解

概念:是指将两个表中的每一条记录都与另一个表中的每一条记录组合,生成所有可能的组合。如果表 A 有 m 条记录,表 B 有 n 条记录,那么笛卡尔积的结果会包含 m * n 条记录。

笛卡尔积通常由 CROSS JOIN 生成。若没有 ON 条件或 WHERE 条件限制,其他类型的 JOIN 也会产生笛卡尔积,然后再从中筛选符合条件的记录。

假设我们有两个表:

INSERT INTO school VALUES (1,'李白'),(2,'白居易');

ca422e010172477b84d21cf0bc75e16f.png

INSERT INTO subject VALUES (1,'Math'),(2,'English'),(3,'Science');

22c842dea6c845a68a237bab2c5d86c0.png

对这两个表执行 CROSS JOIN:

SELECT school.name, subject.subject01
FROM school
CROSS JOIN subject;

cb0ac67a326740709acd01c5d412bbd9.png

解释:每个 A 表的记录和 B 表的记录组合在一起,生成了 2(表 A 行数)× 3(表 B 行数)= 6 条记录。

笛卡尔积的作用

  • 组合所有可能的情况:笛卡尔积列出了两个表之间所有可能的组合,这在需要生成所有情况(如测试数据、组合分析等)时很有用。
  • 通常需避免笛卡尔积:在大部分实际应用中,笛卡尔积会生成大量无用的组合数据,造成查询负担。因此,如果不需要所有组合,应该加上 ON 条件限制,以避免生成笛卡尔积。

 

2.内连接(INNER JOIN)

内连接(INNER JOIN) 是数据库中最常用的连接方式之一,作用是从多个表中获取符合条件的数据。内连接只返回在两个表中都有匹配关系的记录,未匹配的记录不会出现在结果中。

内连接的工作原理

当我们使用内连接时,数据库会在两个表中查找满足指定条件的记录,将符合条件的记录合并在一起返回。不符合条件的记录会被过滤掉。因此,内连接的结果集仅包含在两个表中都有匹配项的记录

内连接的语法

3df10ddf53404ee8a04b56c28ce144b5.png

  • 表1表2:要进行连接的两个表。
  • ON 表1.列 = 表2.列:这是连接条件,指定如何在两个表之间匹配记录。通常是通过主键和外键之间的关系来连接。

示例讲解

假设我们有两个表:students 表和 courses 表。students 表记录学生的信息,courses 表记录选课信息。

students 表(学生表)

5bdcf666c4074d6da51cf8385ffa79e4.png

courses 表(选课表)

3e046e6b4c7542538273aab580583c8e.png

  • students 表中的 student_id 是学生的唯一标识符。
  • courses 表中的 student_id 表示选课学生的编号,指向 students 表中的 student_id,表示哪个学生选了这门课。
  • 问题

    我们想要查询每位选了课的学生的姓名和课程名称。

    使用 INNER JOIN 查询

    根据上面的问题,我们可以使用 INNER JOIN 查询 students 表和 courses 表,将符合条件的数据组合起来:

SELECT students.student_name, courses.course_name
FROM students
INNER JOIN courses ON students.student_id = courses.student_id;

05399dfac09441bbbdb0f5cdfd7a1124.png

解释

  • students.student_name:我们选择学生表中的 student_name 列,表示学生姓名。
  • courses.course_name:我们选择选课表中的 course_name 列,表示课程名称。
  • ON students.student_id = courses.student_id:我们通过 student_id 列将 students 表和 courses 表连接起来。这样可以确保只返回那些在 courses 表中有匹配项的学生记录。
  • 只有在 students 表和 courses 表中都有匹配关系的学生记录才会出现在结果中。David 没有选课,所以不会出现在结果中。

详细解析 INNER JOIN 查询流程

 

总结

 

 

 

 

3.LEFT JOIN(左连接)

 

  1. 选择字段:首先,确定你需要查询哪些字段。在上面的示例中,我们选择了 students.student_namecourses.course_name

  2. 指定表:然后指定进行连接的表。在此例中,我们选择了 studentscourses

  3. 连接条件:指定两个表之间如何关联。一般通过两个表的主键和外键关系进行连接。在这里,students 表中的 student_idcourses 表中的 student_id 是连接条件。

  4. 过滤无匹配数据:在执行内连接时,MySQL 只会返回匹配的记录。如果某个学生没有在 courses 表中找到匹配的课程记录,那么这个学生的数据将不会出现在结果中。

  5. INNER JOIN 的特点和适用场景

  6. 返回匹配记录:INNER JOIN 只返回在两个表中都有匹配关系的记录。
  7. 不包含 NULL:如果某个表中的记录在另一个表中没有匹配项,则这些记录不会显示在结果中。
  8. INNER JOIN 是 SQL 中的基本连接类型,主要用于从多个表中查询匹配的数据。
  9. 只返回匹配数据:INNER JOIN 查询只会返回两个表中都存在匹配条件的记录,未匹配的记录将被过滤掉。
  10. 查询流程:选择字段 -> 指定表 -> 定义连接条件 -> (可选)添加 WHERE 过滤条件。
  11. 适用场景:INNER JOIN 常用于查询两表间有严格关系的数据,比如查询订单和商品、用户和账户信息等。只希望返回那些存在匹配关系的记录。

LEFT JOIN(左连接)是 SQL 中的一种连接方式,用于从两个表中获取数据。左连接会返回左表中的所有记录,以及右表中与左表匹配的记录。如果右表中没有匹配的记录,对应的右表字段会显示为 NULL。LEFT JOIN 常用于需要保留左表所有记录的查询,即使在右表中没有对应数据。

LEFT JOIN 的工作原理

左表:在 FROM 关键字后面的表(第一张表)。 右表:在 JOIN 关键字后面的表(第二张表)。

在 LEFT JOIN 中,左表中的所有记录都会显示出来;右表中只有那些与左表匹配的记录才会显示,如果没有匹配的数据,右表的列会显示为 NULL

LEFT JOIN 语法

ccf88973d36d4a158d93b7f7c2a30b1a.png

 

  1. 左表:需要保留所有记录的表。
  2. 右表:与左表进行匹配的表。
  3. ON:定义两个表之间的连接条件,通常是通过两个表之间的外键关系。

示例数据库结构

假设我们有两张表:employees 表和 departments 表。

employees 表(员工表)

d4f9eebc029e47d9ba0ecd7b8cfcf8ce.png

departments 表(部门表)

3732c024904a482597f3cb02ead8d6b4.png

  • employees 表中存储了员工的信息,每个员工有一个 department_id 列,用于指向其所属部门。
  • departments 表中存储了部门的信息。

问题

我们想要查询每个员工的姓名和其所在的部门名称。如果员工没有分配部门,那么部门名称应显示为 NULL

LEFT JOIN 示例代码

根据上述需求,我们可以使用 LEFT JOIN 进行查询:

SELECT employees.employee_name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

 

0a6e04174cd0419fb63a48079b66b155.png

结果说明:LEFT JOIN 保留了 employees 表(左表)中的所有记录。对于没有部门(即 department_id 为 NULL 或无对应部门)的员工 CharlieDavid,部门名称显示为 NULL

LEFT JOIN 查询步骤

  1. 指定选择字段:在 SELECT 子句中指定需要查询的字段,如 employees.employee_namedepartments.department_name

  2. 选择表和 LEFT JOIN:将 employees 表(左表)和 departments 表(右表)进行 LEFT JOIN。

  3. 定义连接条件:使用 ON 关键字指定连接条件,通过 employees.department_id = departments.department_id 来匹配两个表的数据。

  4. 返回结果:LEFT JOIN 将保留左表中所有的记录,如果右表中没有匹配项,则右表的字段将显示为 NULL

LEFT JOIN 使用场景

LEFT JOIN 通常用于需要查询所有左表数据的情况,即使在右表中没有对应数据。例如:

 

总结

 

  • 员工和部门:查询所有员工及其所在部门,即使有的员工没有分配部门。
  • 订单和支付记录:查询所有订单及其支付情况,即使有的订单还未支付。
  • 学生和选课信息:查询所有学生的姓名及所选课程,即使有的学生没有选课。
  • 更多 LEFT JOIN 示例

    示例 1:查询每个员工的姓名、部门名称和部门 ID

    在上面的例子中,如果想显示每个员工的 department_id,也可以加入该字段:

  • SELECT employees.employee_name, employees.department_id, departments.department_name
    FROM employees
    LEFT JOIN departments ON employees.department_id = departments.department_id;

     

  • ccb8c07c9e5b4ea2a4cc1dba463e8f85.png

  • 解释:这里加入了 employees.department_id 列,让我们看到每个员工的部门编号。如果 department_id 为 NULL 或者无匹配的部门信息,department_name 列显示 NULL。

  • LEFT JOIN 与 INNER JOIN 的区别

  • LEFT JOIN:保留左表中所有记录,右表中没有匹配的记录显示为 NULL
  • INNER JOIN:仅返回两表中都有匹配关系的记录,不保留无匹配项的记录。
  • LEFT JOIN 用于查询左表的所有记录,不管右表中是否有匹配记录。
  • NULL 表示右表中没有匹配项。
  • LEFT JOIN 适用于希望保留主表(左表)数据完整性的场景,比如显示所有员工及其部门信息,即使员工没有分配部门。

4.RIGHT JOIN(右连接):

1.什么是RIGHT JOIN

RIGHT JOIN是SQL中的一种连接方式,用于从右表中大约所有记录,把匹配的左表记录填充在一起。如果右表有记录而左表没有对应的,记录查询结果中的这些字段会显示为NULL

简单来说,RIGHT JOIN保留右表中的所有记录,并根据条件连接左表中的记录。

2.为什么使用RIGHT JOIN

RIGHT JOIN常用于需要保留右表的所有记录的情况,尤其在右表有需要显示完整的信息时,比如菜品表、分区表等,即使左表中没有相关记录,也不希望遗漏右表的数据。

  • 右表:在RIGHT JOIN中,右表是我们保留所有记录的表。即使左表中没有匹配的记录,右表的所有记录都会显示。
  • 左表:在RIGHT JOIN中,左表的数据仅在与右表的记录匹配时才会显示,如果没有匹配的记录,左表的字段将会显示为NULL

RIGHT JOIN 的工作原理

RIGHT JOIN(右连接)是SQL中的一种连接方式,作用与LEFT JOIN(左连接)类似,但它是“左连接”的镜像。具体来说,RIGHT JOIN会返回右表(即JOIN后面的表) )中的所有记录,以及左表中与右表匹配的记录。如果左表中没有匹配的记录,右表的对应字段将显示为NULL

RIGHT JOIN 语法

ab1045226c0342d3b98e3d59e8a6902a.png

  • 左表:在FROM关键字后指定的表(第一张表)。
  • 右表:在RIGHT JOIN后指定的表(第二张表)。
  • ON:连接条件,用于定义两个表之间如何匹配,通常是通过外键和主键的关系进行连接。

示例数据库结构

假设我们有两张表:employees表和departments表,和之前 LEFT JOIN 的例子类似,但我们这次重点讲解 RIGHT JOIN。

employees表(员工表)

3a5cf42e68894038a9677a7e6103dc3c.png

departments表(部门表)

9787dbba043c464a99aaaaddf7c6163f.png

  • employees表存储了员工信息,department_id字段表示员工所属的部门。
  • departments表存储了部门信息,department_id字段表示部门的唯一标识。

问题

我们想要查询每个员工的姓名以及他们所在的部门。如果某个部门没有员工(即右表中有部门数据,左表中没有匹配的数据),我们希望显示该部门的员工名称和NULL员工数据。

RIGHT JOIN 示例代码

根据上述需求,使用RIGHT JOIN来查询:

SELECT employees.employee_name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

 

7df8b59bd1b4424d93853e905c10750e.png

解释

  • AliceBob分别有匹配的部门(HR 和 Sales),因此它们的记录出现在结果中。
  • MarketingIT部门没有员工匹配,右表中的这两个部门仍然显示在结果中,但对应的员工姓名显示为NULL
  • RIGHT JOIN保留了右表departments)中的所有记录,即使左表(employees)中没有相应的匹配项。

RIGHT JOIN 查询步骤

  1. 选择字段:在SELECT子句中选择您需要返回的字段。在这里,我们选择了employees.employee_namedepartments.department_name

  2. 指定表和 RIGHT JOIN:将employees表(左表)和departments表(右表)进行RIGHT JOIN

  3. 定义连接条件:通过ON employees.department_id = departments.department_id来定义两个表之间的连接条件。

  4. 返回结果:RIGHT JOIN 会保留右表departments)中的所有记录,左表中的记录只有当它们匹配时才会显示。如果不匹配,左表的字段会显示为NULL

RIGHT JOIN 使用场景

RIGHT JOIN 常用于需要保留右表所有记录的场景,例如:

  • 部门和员工:查询所有部门及其员工,有时即使部门没有员工。
  • 订单和支付记录:查询所有支付记录,某些甚至记录没有对应的订单。
  • 学生和课程:查询所有课程及其选课学生,即使课程没有学生选修。

这两种 JOIN 都会返回两个表中匹配的数据,唯一的区别是它们保留的表不同。LEFT JOIN 保留左表的数据,而 RIGHT JOIN 保留右表的数据。

总结

  • RIGHT JOIN 与 LEFT JOIN 的区别

  • RIGHT JOIN:保留右表的所有记录,左表中没有匹配的记录会显示为NULL
  • LEFT JOIN:保留左表的所有记录,右表中没有匹配的记录会显示为NULL
  • RIGHT JOIN是SQL中的一种连接方式,它会返回右表(即JOIN后面的表)中的所有记录,即使左表中没有匹配的记录。
  • 如果左表中没有匹配的记录,左表中的字段会显示为NULL
  • RIGHT JOIN 常用于需要确保显示右表中所有记录的场景,比如查询所有部门及其员工信息,即使部门某些没有员工。

5.FULL JOIN(全连接)

FULL JOIN(全连接)是SQL中的一种连接方式,它结合了LEFT JOINRIGHT JOIN的特性,返回左表和右表中的所有记录。如果一方的表与另一方的记录不匹配,现在没有匹配的部分就会NULL填充。简单来说,FULL JOIN 会返回两个表中的所有记录,无论是否有匹配的关系。

需要注意的是,MySQL并不直接支持FULL JOIN,我们可以通过LEFT JOINRIGHT JOIN的组合,使用UNION来模拟实现 FULL JOIN 的效果。

FULL JOIN的工作原理

  • 左表(Left Table):FULL JOIN 返回左表中的所有记录,无论右表中是否有匹配的记录。
  • 右表(Right Table):同样,FULL JOIN 还会返回右表中的所有记录,如果左表没有匹配的记录,右表的相关字段将NULL填充。
  • 如果表中有匹配的记录,则将两个匹配的记录合并在一起组成,一条记录。

FULL JOIN 模拟方法

由于MySQL不支持FULL JOIN,我们通常通过结合LEFT JOINRIGHT JOIN来模拟FULL JOIN。具体的操作是:

2e20c87268d241df86011b46b8ebfbd7.png

UNION操作会符来重复的记录,因此我们可以确保最终结果是两个表中的所有记录。

示例数据库结构

假设我们有两个表:employees表和departments表。

employees表(员工表)

3a5cf42e68894038a9677a7e6103dc3c.png

departments表(部门表)

9787dbba043c464a99aaaaddf7c6163f.png

 

为什么使用 FULL JOIN?

 

FULL JOIN 使用场景

 

FULL JOIN 与 LEFT JOIN、RIGHT JOIN 的区别

 

总结

 

6.CROSS JOIN(交叉连接)

 

  • employees表存储了员工信息,department_id字段表示员工所属的部门。
  • departments表存储了部门信息,department_id字段表示部门的唯一标识。
  • 问题

    我们想要查询所有的员工信息和部门信息,无论员工是否有部门,或者部门是否有员工。

    FULL JOIN 模拟代码

    我们可以通过LEFT JOINRIGHT JOIN结合UNION来实现FULL JOIN的效果。以下是模拟FULL JOIN的SQL查询:

  • -- 模拟 FULL JOIN
    SELECT employees.employee_name, departments.department_name
    FROM employees
    LEFT JOIN departments ON employees.department_id = departments.department_id
    UNION
    SELECT employees.employee_name, departments.department_name
    FROM employees
    RIGHT JOIN departments ON employees.department_id = departments.department_id;

    24ba454077c54feab11fda1081c7e8d4.png

  • 解释

    • 这条查询返回了员工表和部门表中的所有记录。
    • AliceBob分别有匹配的部门(HR 和 Sales),因此它们的记录出现在结果中。
    • Charlie是没有部门的员工名称,结果中显示了NULL部门。
    • Marketing部门有员工(David),因此它也显示在结果中。
    • IT部门没有任何员工,因此它显示在结果中,并且员工字段为NULL

    FULL JOIN 查询步骤

  • LEFT JOIN 查询:使用LEFT JOIN返回左表(employees)中的所有记录,以及右表(departments)中匹配的记录。
  • RIGHT JOIN 查询:使用RIGHT JOIN返回右表(departments)中的所有记录,以及左表(employees)中匹配的记录。
  • UNION 操作:使用UNION将这两个结果合并为一个结果集。UNION会删除重复的记录。
  • 保留所有记录:FULL JOIN 用于查询两个表的所有记录,无论这些记录是否有匹配的项。它可以确保您不会丢失任何一方的数据。
  • 解决不匹配问题:有时你需要查询两个表中的所有记录,即使某些数据没有完全匹配项。例如,想查看所有员工和部门的信息,即使某些员工没有部门,或者某些部门没有员工。
  • 员工和部门:查询所有员工所属部门,某些员工即使没有分配部门,或者某些部门没有员工。
  • LEFT JOIN:返回左表中的所有记录,以及右表中与左表匹配的记录。如果右表不匹配,则显示NULL
  • RIGHT JOIN:返回右表中的所有记录,以及左表中与右表匹配的记录。如果左表不匹配,则显示NULL
  • FULL JOIN:返回两个表中的所有记录。如果某个表没有匹配记录,则显示NULL
  • FULL JOIN在MySQL中无法直接使用,但我们可以通过LEFT JOINRIGHT JOIN的结合,对抗UNION操作来实现其效果。
  • FULL JOIN 会返回两个表中的所有记录,确保不会丢失任何一方的数据,即使数据没有匹配项。
  • 在实际应用中,FULL JOIN是一个非常有用的工具,特别适用于需要展示完整数据的场景,例如员工与部门、订单与支付记录等。
    • 订单和支付记录:查询所有订单和支付记录,即使某些订单还没有支付,或者某些记录支付没有对应的订单。
    • 学生和课程:查询所有学生及其选修的课程,即使某些学生没有选课,或者某些课程没有学生选修。

CROSS JOIN(交叉连接)是SQL中的一种特殊连接方式,用于生成两个表之间的笛卡积。即,将一个表的每条记录与另一个表的每条记录进行组合,生成所有可能的组合。这意味着如果表 A 有m条记录,表 B 有n条记录,那么CROSS JOIN结果将包含m * n记录条。

CROSS JOIN也被称为笛卡尔(Cartesian Product),它通常用于生成所有可能的组合。

CROSS JOIN的工作原理

CROSS JOIN会返回两个表的每一条记录组成的组合,即每一条左表的记录与右表中的每一条记录都会组合,一个新的记录。 结果集:如果左表有m条记录,右表有n条记录,CROSS JOIN 的结果集将包含m * n条记录。

交叉连接语法

2a99f833aa104478809074835ba80d8f.png

 

假设我们有两个表:employees表和departments表。

示例数据库结构

 

  • 表1:第一个表(左表),它的每一条记录会和右表的每一条记录进行组合。
  • 表2:第二个表(右表),它的每一条记录会与左表的每一条记录组合。

假设我们有两个表:employees表和departments表。

employees表(员工表)

3a5cf42e68894038a9677a7e6103dc3c.png

departments表(部门表)

9787dbba043c464a99aaaaddf7c6163f.png

  • employees表存储了员工信息,department_id字段表示员工所属的部门。
  • departments表存储了部门信息,department_id字段表示部门的唯一标识。

问题

我们想要查看所有员工和所有部门的所有可能组合。那么,我们要查询每个员工和部门每个的配置情况。

CROSS JOIN 示例代码

使用CROSS JOIN来查询所有员工与所有部门的组合:

f358ff40f22e4b9699177a818f8d9567.png

 

解释

  • 这个返回查询了所有员工和所有部门的组合。由于employees表有4个员工,departments​​表有4个部门,所以查询结果共有4 * 4 = 16条记录。
  • 每个员工与每个部门组合成一条记录。比如,AliceHR组合,AliceSales组合,依此类推。

CROSS JOIN 查询步骤

  1. 选择字段:在SELECT子句中选择您需要返回的字段,这里是employees.employee_namedepartments.department_name

  2. 指定表和 CROSS JOIN:使用CROSS JOIN连接employees表和departments表。

  3. 返回结果CROSS JOIN会返回所有可能的组合,因此它会生成两个表之间的笛卡尔积。

CROSS JOIN 使用场景

交叉连接在以下场景中特别有用:

  1. 生成所有组合:如果您需要查看两个表的所有可能组合,比如生成员工和部门的所有配置,或者产品与促销的所有可能配置。
  2. 测试数据:在进行性能测试或生成模拟数据时,CROSS JOIN可以帮助你快速生成海量的数据集,尤其是当你需要创建一个海量的数据集来模拟多种情况时。
  3. 装备配置或组合问题:在一些算法中,CROSS JOIN 可以用于生成所有可能的装备,或者解答一些组合问题。

CROSS JOIN 与其他 JOIN 类型的区别

 

CROSS JOIN:返回两个表之间的所有可能组合(笛卡尔积)。它不会使用任何连接条件,因此每条记录都会与另一个表中的每条记录进行组合。

INNER JOIN:只返回两个表中匹配的记录。如果没有匹配项,则不返回任何记录。

LEFT JOIN(左连接):返回左表中的所有记录和右表中匹配的记录。如果右表没有匹配项,右表的字段会显示为NULL

RIGHT JOIN(右连接):返回右表中的所有记录和左表中匹配的记录。如果左表没有匹配项,左表的字段会显示为NULL

CROSS JOIN 的疑虑

 

总结

  • 数据量激增:由于CROSS JOIN会生成两个表的所有组合之间,其结果集大小会急剧增加很多。因此,如果表中记录,CROSS JOIN生成的结果集可能会非常庞大​​,导致查询性能问题。

    例如,如果表 A 有 1000 条记录,表 B 有 2000 条记录,那么 CROSS JOIN 的结果集将包含 1000 * 2000 = 2,000,000 条记录。这样的数据量可能会给数据库和网络带来负担。

  • 字符串使用:CROSS JOIN在实际应用中很少使用,因为它会产生大量的无用数据,通常只在特定的需要生成所有组合的情况下使用。如果不小心使用CROSS JOIN连接大量数据表,可能会导致性能问题。

  • CROSS JOIN用于生成两个表的笛卡尔积,即返回两个表中每条记录的所有可能组合。
  • 它通常用于查看所有可能组合的场景,例如员工需要与部门的配置、产品与颜色的组合等。
  • 使用CROSS JOIN时要特别注意结果集的大小,避免由于数据量过大导致性能问题。

 

结语:SQL联合查询,玩转数据世界!

经过一番探索,我们已经掌握了 SQL 中联合查询(JOIN)的四大宝藏:INNER JOINLEFT JOINRIGHT JOINCROSS JOIN,每一种连接方式都相当于数据之间的桥梁,帮助我们跨越不同的表格,找到那些“隐藏”的关系和数据。

INNER JOIN,就像是“好友聚会”,只有那些完全匹配的朋友才会被邀请参加。 LEFT JOINRIGHT JOIN,就像温暖的左边(左表)右边(右表),总是保证至少一个人能留下来,另一边的人消失。 CROSS JOIN,则犹如一场疯狂的派对,每个人都拥有自己的组合,制作出一个超级庞大的“组合图谱”,为你展现无限可能!

希望你能在这个充满乐趣的SQL学习之旅中,不断发现新知识,享受其中的乐趣,成为查询数据库的“魔术师”!无论数据表如何复杂,只要掌握联合查询的奥秘,任何问题都可以迎刃而解,享受与数据互动的每一刻!

祝你在 SQL 的世界里玩得开心,查询自如!🎉

无论你是在寻找匹配的数据,还是需要生成所有可能的组合,SQL联合查询都是你在数据库世界中的得力助手。通过掌握这些技能,你可以轻松地处理复杂的数据需求,产出更丰富的数据、更精彩的查询报告。数据的世界不再茫然,仿佛一扇窗打开了属于你的数据大门。

 

 

 


http://www.kler.cn/a/445359.html

相关文章:

  • 《全面解析 QT 各版本:特性、应用与选择策略》
  • YOLOv8全解析:高效、精准的目标检测新时代——创新架构与性能提升
  • visual studio 2022 c++使用教程
  • Kingbase数据库备份还原操作手册
  • 利用爬虫获取的数据能否用于商业分析?
  • Vue3 + Element-Plus + vue-draggable-plus 实现图片拖拽排序和图片上传到阿里云 OSS 父组件实现真正上传(最新保姆级)
  • MacOS安装MySQL
  • 监控IP频繁登录服务器脚本
  • 卡尔曼滤波效果(python应用)
  • 半导体制造技术导论(第二版)萧宏 第十二章 化学机械研磨工艺
  • 负载均衡-lvs
  • TDengine 新功能 通过 UID 删除不可见表
  • Midjourney参数大全
  • 【ETCD】当客户端从follower节点发起写请求时候,ETCD集群是如何处理此次的写请求呢?
  • 如何从 ASP.NET Core IIS上传大文件一些配置
  • [python SQLAlchemy数据库操作入门]-02.交易数据实体类建立
  • Kioptix Level 2靶场练习保姆级---春不晚
  • git企业开发的相关理论(一)
  • 深入解析MySQL Explain关键字:字段意义及调优策略
  • EasyExcel 导出文件
  • html中实用标签dl dt dd(有些小众的标签 但是很好用)
  • Expected end or semicolon (after name and no valid version specifier)
  • 非结构化数据分析与应用(Unstructured data analysis and applications)(pt3)图像数据分析1
  • NVR管理平台EasyNVR接入的安防监控摄像机如何计算音频码流?
  • 【python算法题目】统计一个文本中所有大写字母出现的次数
  • MySQL JOIN算法实现和选择