使用 SQL (DQL) 查询数据
介绍
自 20 世纪 70 年代初以来,数据库系统允许我们使用一种称为 SQL 或结构化查询语言的简单语言来存储和操作信息。尽管复杂的 Web 应用程序和物联网的广泛使用提高了 NoSQL 的普及度,但关系数据库仍然是各种规模的公司和组织的宝贵资产。
虽然我们将解释如何查询存储在 MySQL 关系数据库中的信息,但下面的示例可以在其他系统上执行,只需进行少量(如果有的话)修改即可。如果您想使用相同的数据库,请随意使用此脚本来创建和填充它。
介绍 DQL(数据查询语言)
在本指南中,我们将使用一个名为library 的数据库,其实体关系图如图 1 所示,其中每个表存储以下内容:
作者、出版商、客户和图书管理员:每条记录的唯一标识符和相应的名称。
书籍:除了每本书的唯一标识符及其名称外,书籍还具有 13 个字符的 ISBN、版本号,并通过使用外键与作者和出版商相关联。因此,它们指向这些表中的唯一标识符,从而确保给定书籍的作者和出版商已存在于数据库中。
上表中的唯一标识符充当主键。特别是在图书表中,我们不将 ISBN 用于此目的,因为我们可能有同一本书和同一版本的多个副本。
- loans存储每本已借出的书籍。author_id 、customer_id和book_id作为外键的使用与借出日期和当前状态(有效或无效)相辅相成。
最简单的 DQL 形式是针对整个单个表的SELECT语句。其他示例包括从一个或多个表中选择特定字段、对结果进行排序和分组、创建列和表别名以及使用过滤器缩小搜索结果范围。我们将通过一系列示例探索所有这些情况(以及更多情况)。让我们开始吧!
注意:在执行以下查询之前,您需要通过USE library;告诉数据库引擎您打算使用库数据库。在 MySQL 中,末尾的分号是完成语句所必需的,但在其他数据库系统(如 Microsoft SQL Server)中是可选的。
示例 1 - 从表中选择所有列和记录
要显示商店中书籍的所有信息,您可以执行以下操作:
SELECT * FROM books;
其中星号是通配符,代表给定表中的所有列。您可以在图 2 中查看结果,其中输出已被截断以方便阅读:
这种方法在不加限制或过滤的情况下使用时,可能会对查询性能产生负面影响。通常情况下,指定您感兴趣的字段列表是更明智的做法。
示例 2 - 从表中选择一个或多个字段
此时,从books表中检索所有字段可能没有多大意义,因为我们仍然无法从author_id和publisher_id列中得出含义。因此,如果您希望查看名称和 ISBN 列表,您可以执行以下操作:
SELECT book_name, book_isbn FROM books;
或者,另外一种方式:
SELECT DISTINCT book_name, book_isbn FROM books;
第一个查询返回所有书籍记录并让您大致了解每本书的副本数量,而第二个查询将允许您识别所有不同的书名和 ISBN 组合,如图 3 所示:
如上所示,books表中有 10 个不同的书名。
示例 3 - 创建列和表别名
别名是表和列的替代名称,在编写更复杂的查询或呈现结果时非常有用。
要创建别名,我们将使用AS关键字,后跟其名称。下面的查询显示了books表的别名b。这意味着每次我们需要引用books时,只需使用b即可。此外,我们希望输出显示Title和ISBN作为标题,而不是book_name和book_isbn(见图 4):
SELECT DISTINCT
b.book_name AS Title,
b.book_isbn AS ISBN
FROM books AS b;
在上面的查询中,由于我们只使用一个表,因此不一定需要使用表别名作为列的前缀。但是,这样做是一种很好的做法,因为当我们在查询中包含更多表时,将需要这样做。
尽管这种技术的好处一开始可能看起来并不明显,但随着查询复杂性的增加,它们将变得明显。
示例 4 - 连接表:第 1 部分
我们使用整数作为外键来引用其他表的唯一标识符至少有几个很好的理由。
首先,它可以让我们避免重复信息,并让我们更好地控制数据。从数据完整性的角度来看,将作者的真实姓名分别存储在authors中比在books中存储更有意义。
其次,就磁盘使用量而言,存储整数通常比存储完整字符串更便宜。根据 MySQL 官方文档,存储整数仅需要 4 个字节,而存储字符串则需要L + 1 个字节(其中L是字符串的长度)。因此,在books中通过作者 ID(1、2、3 或 4)引用作者比重复作者中已有的名称更可取,如图 5 所示:
话虽如此,让我们利用JOIN关键字同时查询书籍和作者表,并检索具有各自作者的书名列表,如图 6 所示:
SELECT DISTINCT
b.book_name AS Title,
a.author_name AS Author
FROM books AS b JOIN authors AS a
ON b.author_id = a.author_id;
在哪里:
a和b分别是authors和books的别名。
Title和Author分别是book_name和author_name的别名。
JOIN(或其等效INNER JOIN)让我们能够使用基本集合论来操纵a和b 。这种特殊类型的JOIN将返回author_id在两个表中都存在的记录。
根据它们在查询中的呈现方式,b是左表,a是右表,因为前者首先出现在FROM关键字之后。当使用其他类型的JOIN(LEFT JOIN或RIGHT JOIN )时,这种区别很重要。图 7 显示了这两种情况下的预期结果。
简而言之,LEFT JOIN和RIGHT JOIN分别返回两个集合所共有的所有记录以及仅存在于左表和右表上的记录。
示例 5 - 连接表:第 2 部分
需要注意的是,您可以根据需要连接任意数量的表。例如,以下查询的输出(如图 8 所示)将显示谁从每个图书管理员那里借了哪本书以及何时借的:
SELECT
c.customer_name AS Customer,
b.book_name AS Title,
l.loan_date AS Date,
lb.librarian_name AS Librarian
FROM customers c JOIN loans l
ON c.customer_id = l.customer_id
JOIN books b ON b.book_id = l.book_id
JOIN librarians lb ON lb.librarian_id = l.librarian_id;
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~