使用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;关于上述问题的一些注意事项:
下面是一种不同的、技术上更符合语法的方法来编写相同的查询:
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)的订单匹配。
请注意,无论如何,您应该避免在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;本文希望能帮助您了解MySQL等关系数据库的强大功能,以及如何构建SQL查询,使用连接从一个查询中的多个表中检索记录,从而使您能够检索到所需的确切结果。
您已经学习了SQL中的三种不同联接,如何别名列名和表名,如何在一个查询中使用多个联接,以及为什么应该避免子查询。不要再试图手动将不同的数据集编译成一个数据集,开始使用连接来打动同事并节省时间。
关键区别–sql与mysql 数据库是数据的集合。有各种类型的数据库。关系数据库是以表的形式存储数据的数据库类型。这些表是相互关联的,因为它们使用约束。MySQL是一个关系数据库管理系统。用于对数据库执行操作的语言称...
...列组成。行表示每个实体,而列表示属性。假设一个学生数据库。每行代表一个学生。这些列表示id、name、grade、age等属性。DBMS是表的集合,每个表都使用诸如外键之类的约束进行关联。有时仅仅使用一个表是不够的。有些情况...
数据库驱动着现代网络。每个大的或动态的网站都以某种方式使用数据库,当与结构化查询语言(SQL)结合使用时,操纵数据的可能性真的是无穷无尽。如果您已经知道SQL,请确保您检查了所有网站开发人员都应该知道的编程技...
...HQL 结构化查询语言(structuredquerylanguage,也称SQL)是一种数据库语言,它使用关系数据库管理的概念来管理数据。数据的管理包括select(从单个或多个表中检索数据)、insert(在表中添加一行或多行)、update(负责更改表中一行...
...they differ in their functionalities or performances. 什么是“加入”数据库? “Join”语法能够从两个或多个数据库或数据库表中检索匹配的列。数据库总是可视化为表,它们是以列和行的形式保存数据的实际单个单元。每个表都使用一个...
...区别在于SQL是一种查询语言,用于存储、操作和检索关系数据库中的数据,而PLSQL是SQL的扩展,用于管理Oracle关系数据库中的数据。 关系数据库管理系统将数据存储在数据库中。数据库由一组表组成。SQL允许用户访问RDBMS中的数...
SQL server中实例和数据库的主要区别在于,实例是作为操作系统服务运行的sqlservr.exe可执行文件的副本,而数据库是在表中存储数据的系统数据集合。 sqlserver是微软开发的关系数据库系统。它由GUI和命令行组成。程序员可以使用S...
...助于根据一列或多列对结果进行分组。 DBMS是一种帮助在数据库中存储和管理数据的软件。此外,还根据关系模型设计了一个数据库管理系统,即关系数据库管理系统(RDBMS)。程序员可以使用结构化查询语言(SQL)对RDBMS数据库...
...在于,视图是基于SQL语句结果集的虚拟表,而表是由存储数据库数据的行和列组成的数据库对象。 一般来说,关系数据库管理系统(RDBMS)是一种帮助创建和管理数据库的软件,这些数据库是根据关系模型设计的。此外,MySQL、M...
...,它不存储在磁盘中,而物化视图是存储在磁盘中的原始数据库的物理副本。 DBMS是一种允许在数据库中存储和管理数据的软件。关系数据库管理系统(RDBMS)是根据关系模型设计的数据库管理系统。程序员可以编写SQL查询来对RD...