如何使用sql连接一次查询多个数据库表

了解如何使用SQL联接来简化查询、节省时间,并让您感觉自己是SQL超级用户。...

使用MySQL等关系数据库的最大好处之一是,它的关系结构允许您轻松地跨多个表存储和查询信息。

Join databases in mySQL

让我们探索如何从多个数据库表中准确地检索所需的数据,以及各种可用的联接,这些联接允许您提取所需的准确结果。

初始化示例数据库

这不是必需的,但是如果您希望遵循本文中的示例,可以使用以下终端命令在本地初始化示例数据库:

git clone https://github.com/mdizak/sample-select-db.gitcd sample-select-dbsudo mysql < store.sqlsudo mysql sampledbmysql> SELECT COUNT(*) FROM customers;

您应该得到一个结果,说明customers表中有2000行。

默认/内部联接

MySQL数据库中使用的默认连接称为内部连接,这是最常见和最直接的连接。此联接返回两个表中都有匹配记录的所有记录,并取消所有其他记录。

例如,如果您想查看客户的名字和姓氏,以及订单金额和日期(对于超过1000美元的所有订单),您可以使用以下SQL语句:

SELECTc.id, c.first_name, c.last_name, o.amount, o.created_atFROMcustomers c, orders oWHEREo.customer_id = c.id AND o.amount >= 1000;

关于上述问题的一些注意事项:

  • 正在选择五个不同的列,其中三个来自customers表,两个来自orders表。
  • 在FROM子句中定义了两个表,但后缀是字母“c”和“o”。它们只是在SQL中指定别名,可以是您想要的任何东西,并用于缩短SQL查询。
  • o.customer_id=c.id是查询的连接方面,并确保客户和订单之间的适当关联。

下面是一种不同的、技术上更符合语法的方法来编写相同的查询:

SELECTc.id, c.first_name, c.last_name, o.amount, o.created_atFROMcustomers c INNER JOIN orders oONcustomer_id = c.idWHEREo.amount >= 1000;

上面的查询比较容易阅读,因为您可以很容易地看到customers和orders表之间的连接。尽管如此,这两个查询是相同的,将产生完全相同的记录。

左连接

左联接将返回左表中与右表中的记录匹配的所有记录,并消除所有其他记录。例如,如果要查看数据库中每个产品的总销售额,可以尝试使用以下查询:

SELECTp.name, sum(item.amount) AS tamountFROMorders_items item LEFT JOIN products pONitem.product_id = p.idGROUP BY item.product_id ORDER BY tamount DESC

这将产生一个很好的两列视图,显示产品名称和总销售额,并按预期工作。查询遍历orders\u items表中的所有产品,将它们与products表中的记录关联,并返回每个产品的总销售额。

右连接

使用上面的示例,请注意,上面的查询只返回19条记录,而数据库中总共有22个产品。这是因为查询是从orders\u items表开始的,并将其与products表连接,而且由于某些产品从未订购过,因此orders\u items表中不存在这些产品的记录。

如果您想获得一个包含销售金额的所有产品的列表,包括尚未订购的产品,会发生什么情况?使用以下查询尝试右联接:

SELECTp.name, sum(item.amount) AS tamountFROMorders_items item RIGHT JOIN products pONitem.product_id = p.idGROUP BY p.id ORDER BY tamount DESC

这样更好,查询现在返回完整的22个产品,其中三个产品的值为null。这是因为右联接不使用orders\u items作为联接到products表的主表,而是翻转order并将products表联接到orders\u items表。

查询中的多个联接

有时您需要将三个或更多的表连接在一起以获得一组特定的结果。

例如,您可能需要一个购买了微波炉(产品id#1)的所有客户的列表,包括他们的姓名和订购日期。这需要跨三个表进行选择,这可以通过对以下查询使用两个联接来完成:

SELECTc.first_name, c.last_name, o.amount, o.created_atFROMcustomers c INNER JOIN orders oONc.id = o.customer_id INNER JOIN orders_items itemONitem.order_id = o.idWHEREitem.product_id = 1 ORDER BY o.created_at;

此查询返回所有426个微波炉订单,并按预期工作。它首先将所有客户与其各自的订单进行匹配,然后进一步查询结果集,方法是将所有订单仅与orders#items表中包含微波产品(id#1)的订单匹配。

决不要将子查询与in子句一起使用

请注意,无论如何,您应该避免在SQL查询中使用子查询,例如:

SELECT first_name,last_name FROM customers WHERE id IN (SELECT customer_id FROM orders WHERE status = 'approved' AND amount < 100);

像上面这样的查询效率很低,占用大量资源,应该尽量避免。相反,请使用上面几节中概述的正确连接。例如,上述查询应重写为:

SELECT c.first_name, c.last_name FROM customers c LEFT JOIN orders o ON o.customer_id = c.id WHERE o.status = 'approved' AND o.amount < 100;

使用sql联接节省时间

本文希望能帮助您了解MySQL等关系数据库的强大功能,以及如何构建SQL查询,使用连接从一个查询中的多个表中检索记录,从而使您能够检索到所需的确切结果。

您已经学习了SQL中的三种不同联接,如何别名列名和表名,如何在一个查询中使用多个联接,以及为什么应该避免子查询。不要再试图手动将不同的数据集编译成一个数据集,开始使用连接来打动同事并节省时间。

  • 发表于 2021-03-27 04:02
  • 阅读 ( 294 )
  • 分类:编程

你可能感兴趣的文章

sql语言(sql)和mysql数据库(mysql)的区别

关键区别–sql与mysql 数据库是数据的集合。有各种类型的数据库。关系数据库是以表的形式存储数据的数据库类型。这些表是相互关联的,因为它们使用约束。MySQL是一个关系数据库管理系统。用于对数据库执行操作的语言称...

  • 发布于 2020-10-17 12:07
  • 阅读 ( 247 )

内部联接(inner join)和自然连接(natural join)的区别

...列组成。行表示每个实体,而列表示属性。假设一个学生数据库。每行代表一个学生。这些列表示id、name、grade、age等属性。DBMS是表的集合,每个表都使用诸如外键之类的约束进行关联。有时仅仅使用一个表是不够的。有些情况...

  • 发布于 2020-10-18 12:15
  • 阅读 ( 1700 )

所有程序员都应该知道的13条最重要的sql命令

数据库驱动着现代网络。每个大的或动态的网站都以某种方式使用数据库,当与结构化查询语言(SQL)结合使用时,操纵数据的可能性真的是无穷无尽。如果您已经知道SQL,请确保您检查了所有网站开发人员都应该知道的编程技...

  • 发布于 2021-03-14 06:57
  • 阅读 ( 220 )

sql语句(sql)和hql公司(hql)的区别

...HQL 结构化查询语言(structuredquerylanguage,也称SQL)是一种数据库语言,它使用关系数据库管理的概念来管理数据。数据的管理包括select(从单个或多个表中检索数据)、insert(在表中添加一行或多行)、update(负责更改表中一行...

  • 发布于 2021-06-23 19:43
  • 阅读 ( 303 )

参加(join)和内部连接(inner join)的区别

...they differ in their functionalities or performances. 什么是“加入”数据库? “Join”语法能够从两个或多个数据库或数据库表中检索匹配的列。数据库总是可视化为表,它们是以列和行的形式保存数据的实际单个单元。每个表都使用一个...

  • 发布于 2021-06-24 03:08
  • 阅读 ( 215 )

sql语句(sql)和plsql语言(plsql)的区别

...区别在于SQL是一种查询语言,用于存储、操作和检索关系数据库中的数据,而PLSQL是SQL的扩展,用于管理Oracle关系数据库中的数据。 关系数据库管理系统将数据存储在数据库中。数据库由一组表组成。SQL允许用户访问RDBMS中的数...

  • 发布于 2021-06-30 23:38
  • 阅读 ( 251 )

实例(instance)和sql server中的数据库(database in sql server)的区别

SQL server中实例和数据库的主要区别在于,实例是作为操作系统服务运行的sqlservr.exe可执行文件的副本,而数据库是在表中存储数据的系统数据集合。 sqlserver是微软开发的关系数据库系统。它由GUI和命令行组成。程序员可以使用S...

  • 发布于 2021-07-01 06:19
  • 阅读 ( 979 )

订货人(order by)和sql中的分组依据(group by in sql)的区别

...助于根据一列或多列对结果进行分组。 DBMS是一种帮助在数据库中存储和管理数据的软件。此外,还根据关系模型设计了一个数据库管理系统,即关系数据库管理系统(RDBMS)。程序员可以使用结构化查询语言(SQL)对RDBMS数据库...

  • 发布于 2021-07-01 23:11
  • 阅读 ( 295 )

看法(view)和桌子(table)的区别

...在于,视图是基于SQL语句结果集的虚拟表,而表是由存储数据库数据的行和列组成的数据库对象。 一般来说,关系数据库管理系统(RDBMS)是一种帮助创建和管理数据库的软件,这些数据库是根据关系模型设计的。此外,MySQL、M...

  • 发布于 2021-07-02 00:06
  • 阅读 ( 241 )

看法(view)和物化视图(materialized view)的区别

...,它不存储在磁盘中,而物化视图是存储在磁盘中的原始数据库的物理副本。 DBMS是一种允许在数据库中存储和管理数据的软件。关系数据库管理系统(RDBMS)是根据关系模型设计的数据库管理系统。程序员可以编写SQL查询来对RD...

  • 发布于 2021-07-02 00:53
  • 阅读 ( 824 )
bphb1993
bphb1993

0 篇文章

相关推荐