首页 > 数据库 >深入探索MySQL多表查询:连接查询与子查询的艺术

深入探索MySQL多表查询:连接查询与子查询的艺术

时间:2024-11-18 10:19:24浏览次数:1  
标签:customers 多表 连接 id MySQL JOIN 查询 orders

深入探索MySQL多表查询:连接查询与子查询的艺术

在数据库操作中,多表查询是一项常见且重要的任务。无论是为了获取更全面的数据,还是为了实现复杂的业务逻辑,多表查询都是不可或缺的工具。MySQL提供了两种主要的多表查询方式:连接查询子查询。本文将深入探讨这两种查询方式的规律、优劣以及适用场景,帮助你更好地理解和应用它们。

一、子查询:嵌套的艺术

子查询,顾名思义,是将一个查询嵌套在另一个查询中。子查询的结果可以作为外部查询的条件或数据源。根据子查询返回的结果形式,我们可以将其分为三种类型:

  1. 单行单列

    当子查询返回的结果是一个单一的值时,通常用于比较运算符(如 =>< 等)。例如,查找名为“John Doe”的客户的订单:

    SELECT * FROM orders WHERE customer_id = (SELECT id FROM customers WHERE name = 'John Doe');
    

    这种情况下,子查询的结果是一个单一的值,可以直接用于比较。

  2. 多行单列

    当子查询返回的结果是一个列的多个值时,通常用于 INNOT IN 运算符。例如,查找所有来自美国的客户的订单:

    SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE country = 'USA');
    

    这种情况下,子查询的结果是一个列的多个值,可以用于 IN 运算符。

  3. 多行多列

    当子查询返回的结果是一个临时表时,通常用于 FROM 子句中,或者通过 EXISTSNOT EXISTS 进行过滤。例如,查找2023年1月1日之后的订单中,总金额大于1000的订单:

    SELECT * FROM (SELECT * FROM orders WHERE order_date > '2023-01-01') AS temp_orders WHERE total_amount > 1000;
    

    这种情况下,子查询的结果是一个临时表,可以作为外部查询的数据源。

二、连接查询:合并的艺术

连接查询是通过连接条件将多个表的数据合并在一起。根据连接的方式,我们可以将其分为内连接和外连接。

  1. 内连接(INNER JOIN)

    内连接只返回满足连接条件的记录。例如,查找所有订单及其对应的客户名称:

    SELECT orders.order_id, customers.name 
    FROM orders 
    INNER JOIN customers ON orders.customer_id = customers.id;
    

    在这个例子中,orders 表和 customers 表通过 customer_idid 进行连接,只返回有匹配记录的订单。

  2. 外连接

    外连接返回所有满足连接条件的记录,以及不满足条件的记录(对于 LEFT JOINRIGHT JOIN)。

    • LEFT JOIN:返回左表中的所有记录,即使右表中没有匹配的记录。例如,查找所有订单及其对应的客户名称,包括没有订单的客户:

      SELECT orders.order_id, customers.name 
      FROM orders 
      LEFT JOIN customers ON orders.customer_id = customers.id;
      

      在这个例子中,LEFT JOIN 返回所有订单,即使某些订单没有对应的客户记录。

    • RIGHT JOIN:返回右表中的所有记录,即使左表中没有匹配的记录。例如,查找所有客户及其对应的订单,包括没有订单的客户:

      SELECT orders.order_id, customers.name 
      FROM orders 
      RIGHT JOIN customers ON orders.customer_id = customers.id;
      

      在这个例子中,RIGHT JOIN 返回所有客户,即使某些客户没有对应的订单记录。

    • FULL OUTER JOIN:返回左表和右表中的所有记录,即使没有匹配的记录。MySQL本身不支持 FULL OUTER JOIN,但可以通过 UNION 实现类似的效果。例如,查找所有订单和客户,包括没有匹配的记录:

      SELECT orders.order_id, customers.name 
      FROM orders 
      LEFT JOIN customers ON orders.customer_id = customers.id
      UNION
      SELECT orders.order_id, customers.name 
      FROM orders 
      RIGHT JOIN customers ON orders.customer_id = customers.id;
      

      在这个例子中,UNIONLEFT JOINRIGHT JOIN 的结果合并,返回所有订单和客户,包括没有匹配的记录。

三、选择子查询还是连接查询?

在实际应用中,选择子查询还是连接查询取决于多个因素:

  1. 可读性

    连接查询通常更直观,尤其是在处理多表关系时。子查询在某些情况下可能更简洁,但嵌套层级过多时可能会影响可读性。

  2. 性能

    在某些情况下,连接查询的性能可能优于子查询,因为数据库优化器在处理连接时通常有更好的优化策略。然而,这并不是绝对的,具体取决于查询的复杂性和数据库的优化器。

  3. 复杂性

    对于简单的查询,子查询可能更方便。对于复杂的查询,尤其是涉及多个表的查询,连接查询通常更合适。

四、总结

使用子查询进行多表查询

  1. 单行单列:父查询使用比较运算符
  2. 多行单列:父查询使用in
  3. 多行多列:将查询结果做成一张虚拟表,再次查询

使用连接查询进行多表查询
1.通常关联字段:主表.主键=从表.外键,也不一-定。
2.关联的条件数=表数量- 1
3.多表查询的步骤:
1.确定查询哪些表
2.确定表连接条件
3.确定查询哪些列
4.如果还有过滤条件使用where

多表查询是数据库操作中的重要技能,掌握子查询和连接查询的规律和优劣,能够帮助我们更高效地处理复杂的数据需求。子查询通过嵌套的方式提供了灵活的条件和数据源,而连接查询则通过合并的方式提供了直观的多表关系处理。在实际应用中,根据具体需求选择最合适的方式,才能发挥出最大的效能。

希望本文能够帮助你更好地理解和应用MySQL中的多表查询,提升你的数据库操作技能。

标签:customers,多表,连接,id,MySQL,JOIN,查询,orders
From: https://www.cnblogs.com/itcq1024/p/18551880

相关文章

  • Windows10安装MySQL8.0.40
    官网地址https://www.mysql.com/环境查看Windows10MySQL8.0.40下载MySQL打开首页-下载-MySQL社区版本下载本次下载Window10的安装版本,其他系统如Linux,Mac可根据需要自行选择需要登录Oracle账号才能下载,如果没有账号则注册一个登录安装双击下载的软件开始......
  • vue3 下拉框自带的模糊查询不准确 el-autocomplete
    一、元素标签写法<el-form-itemlabel="配件名称"prop="materialName"><el-autocompletestyle="width:100%"v-model="form_feiyong.materialName":fetch-suggestions="querySearchVType"clearableplac......
  • 28. 使用MySQL之安全管理
    1.访问控制MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具有过多的访问权。考虑以下内容:多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表;某些用户需要读表,但可能不需要更新表;你......
  • 计算机毕业设计在线购物商城超市购物系统日用品商城小商品在线购买网站php+mysql+html
     一.功能介绍用户前台功能:前台主要包括网站首页、今日特卖、限时打折、商品中心、常见问题、我的购物车、登录、注册、商品详情,联系卖家,加入购物车、结算、个人中心等功能模块。今日特卖、限时打折、商品中心模块,用户可以查看全部商品信息,联系卖家、选择商品进行添加购物......
  • php毕业设计购物商城在线购物系统美食购物商城外卖系统点餐系统美食网站php+mysql+htm
    一,功能介绍        前台主要包括网站首页、商品推荐、最新商品、新闻咨询、商品分类、商品资讯、评论、登录、注册、加入购物车、结算、个人中心等功能模块商品推荐、最新商品在商品推荐、最新商品模块,用户可以查看全部商品信息,选择商品进行添加购物车等操作,购物......
  • 基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现六
    一、前言介绍:免费学习:猿来入此1.1项目摘要随着人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。然而,宠物的数量增长也带来了一系列问题,如流浪宠物数量的增加、宠物健康管理的缺失以及宠物领养收养信息的不透明等。这些问题不仅影响了宠物的生存状况,也给社会带来了一定......
  • 基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现五
    一、前言介绍:免费学习:猿来入此1.1项目摘要随着人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。然而,宠物的数量增长也带来了一系列问题,如流浪宠物数量的增加、宠物健康管理的缺失以及宠物领养收养信息的不透明等。这些问题不仅影响了宠物的生存状况,也给社会带来了一定......
  • mysql如何批量删除海量数据
    一、删除大表的部分数据一个表有1亿6000万的数据,有一个自增ID。最大值就是1亿6000万,需要删除大于250万以后的数据,有什么办法可以快速删除?看到mysql文档有一种解决方案:http://dev.mysql.com/doc/refman/5.0/en/delete.htmlIfyouaredeletingmanyrowsfromalargetable,......
  • ElasticSearch常用查询(一)
    一、前言​ 以前做的某个项目中包含了大量的查询聚合,现在有时间整理一番,记录一下ES常用查询聚合语法。二、常用查询语法2.1match查询​ match查询,模糊匹配(自动分词),在进行分词的模糊匹配时,要求该字段的类型是text..keyword类型。GETarticle/_search{"query":{"ma......
  • MySQL系统优化
    文章目录MySQL系统优化第一章:引言第二章:MySQL服务架构优化1.读写分离2.水平分区与垂直分区3.缓存策略第三章:MySQL配置优化1.内存分配优化BufferPool的优化查询缓存与表缓存KeyBuffer2.连接优化最大连接数会话超时连接池3.日志管理慢查询日志BinLog日志第......