SQL 查询表

了解如何使用 SQL 的 SELECT、FROM、LIMIT、ORDER BY 和 AS 来查询和排序表。

我们将涵盖的内容

  • 使用 SELECT 指定您想要获取的列
  • * 选择所有列
  • 使用 FROM 指定您想要查询的表或子查询
  • 在不聚合表的情况下,在开发查询时使用 LIMIT 来限制行数(这样就不会摧毁您的数据库)
  • 使用 -- 添加注释;它们不会影响结果,但有助于他人理解您的代码
  • 在每个查询末尾加上 ;
  • 使用 AS 更改列的名称
  • 使用 ORDER BY 对结果进行排序,ASC 表示升序,DESC 表示降序
  • 使用逗号分隔的列表选择特定列
  • 了解 SQL 的大小写约定以及何时区分大小写
  • 使用 MOD 函数从表中采样数据

在深入研究之前需要快速回顾一下吗?查看我们的 SQL 速查表,了解核心命令和语法。它也非常适合与刚开始从事数据分析的同事分享。

SQL:从表中获取所有行的查询

如果您想获取整个表及其所有行,例如这个 products

| id  | ean           | title                     | category  | vendor                       | price | rating | created_at                  |
| --- | ------------- | ------------------------- | --------- | ---------------------------- | ----- | ------ | --------------------------- |
| 1   | 1018947080336 | Rustic Paper Wallet       | Gizmo     | Swaniawski, Casper and Hilll | 29.46 | 4.6    | July 19, 2017, 7:44 PM      |
| 2   | 7663515285824 | Small Marble Shoes        | Doohickey | Balistreri-Ankunding         | 70.08 | 0      | April 11, 2019, 8:49 AM     |
| 3   | 4966277046676 | Synergistic Granite Chair | Doohickey | Murray, Watsica and Wunsch   | 35.39 | 4      | September 8, 2018, 10:03 PM |

您通过 SELECTFROM 表,如下所示

SELECT
  *
FROM
  products;
  • SELECT 是一个 SQL 保留字,用于指定要返回的列。保留字是 SQL 中具有特殊含义的关键字,数据库引擎会根据这些含义处理查询。
  • * 是通配符运算符,它告诉数据库从表中返回所有列。通常,您应该只在结果中包含您需要的确切列。不要尝试对非常大的表使用此方法而不 限制您的结果,除非您想让其他人的工作变得更糟。
  • FROM 是一个 SQL 保留字,它告诉数据库要在哪个(或哪些)表中查找列。表名必须精确(但大小写不敏感)。
  • 注意查询末尾的 ;。Metabase 在是否包含分号方面相当宽容,但其他编辑器/数据库可能并非如此。它们会查找分号来知道查询已完成。

数据库引擎在处理您的查询时所执行的操作顺序与您阅读代码的顺序不同。总的来说,您不必过多考虑这一点,因为人们已经投入了大量时间来优化这些查询引擎。

SQL:为代码添加注释

您可以使用 -- 为查询添加注释(应该这样做)。这是相同的查询,并附有说明性注释

-- Our first query
SELECT
  * -- The star means to get all columns
FROM
  products; -- The table to query

数据库的查询处理器知道忽略 -- 之后的任何内容。事实上,您可以在查询中放入一整艘帆船,结果也不会改变。

SELECT
  *
FROM
-- An entire sailboat
  products;

SQL:仅从表中获取一些

您可以 LIMIT 结果,如下所示

SELECT
  *
FROM
  products
LIMIT -- SQL reserved word
  3; -- Only get the first 3 rows

这将返回所有列(*),但仅返回 3 行。在可能的情况下,在开发查询时限制行数以加快加载时间。幸运的是,Metabase 会自动将结果限制在最初的 2,000 行,这样人们就不会使数据库崩溃。但这仍然是良好的实践。

LIMIT 仅影响返回的行数。如果您在聚合数据,例如计算行数和分组行数(我们稍后将介绍),数据库仍会计算和分组所有行,但仅返回 LIMIT 设置的结果行数。

SQL:仅获取一些

要返回特定列,例如仅 titlecategory

| title                     | category  |
| ------------------------- | --------- |
| Rustic Paper Wallet       | Gizmo     |
| Small Marble Shoes        | Doohickey |
| Synergistic Granite Chair | Doohickey |

按您希望列在结果中显示的顺序 SELECT 每个列。用逗号分隔列(但在列表末尾不要加逗号),如下所示

SELECT
  title, -- Names of each column must be exact
  category -- No comma at the end of list
FROM
  products;

事实上,许多人曾因漏掉逗号的错误而吃过亏,以至于有些人会像这样格式化他们的 SQL,只是为了让逗号更容易看到(但更多是为了让列更容易被注释掉,如需要)

SELECT
  title
  ,category -- Comma precedes each column except the first column
  ,vendor -- No comma at the end of list
FROM
  products;

SQL:对结果进行排序

您可以使用 ORDER BY 对结果行进行排序。例如,按价格从低到高对产品进行排序

SELECT
  title,
  price
FROM
  products
ORDER BY     -- Sorts results
  price ASC; -- By the price column in ascending order

它返回

| Title                    | Price |
| ------------------------ | ----- |
| Mediocre Paper Car       | 15.69 |
| Rustic Paper Car         | 19.87 |
| Heavy-Duty Copper Gloves | 20.41 |
| Enormous Marble Shoes    | 21.42 |

ASC 关键字有时是可选的(取决于数据库引擎),但包括 ASCORDER BY 子句中可以使代码更易读,并且它总是有效。

要按降序(从高到低)排序,请添加 DESC 关键字

SELECT
  title,
  price
FROM
  products
ORDER BY
  price DESC; -- Sorts in descending order

要按多个列排序,例如,首先按 category(按字母顺序)排序,然后在每个类别中按 price(从高到低)排序

SELECT
  title,
  category,
  price
FROM
  products
ORDER BY
  category ASC, -- Sorts categories alphabetically (note the comma)
  price DESC; -- Then sorts prices highest to lowest within each category

有时您会看到人们按数字排序,如下所示

SELECT
  title,
  category,
  price
FROM
  products
ORDER BY
  2 ASC, -- Sorts categories alphabetically (note the comma)
  3 DESC; -- Then sorts prices highest to lowest within each category

这里的数字对应于 SELECT 语句中列的序数位置。对于某些数据库,按位置排序是按别名列排序的唯一方法。但如果可能,最好包含列名或别名,这样人们在阅读代码时就不必在 SELECTORDER BY 部分之间来回跳转。

SQL:更改列的名称

假设您的表有 titlecategory 这样的列名,但您希望每个列标题都以“Product”开头,如下所示

| Product title             | Product category |
| ------------------------- | ---------------- |
| Rustic Paper Wallet       | Gizmo            |
| Small Marble Shoes        | Doohickey        |
| Synergistic Granite Chair | Doohickey        |

要更改列的名称(在结果中,而不是在表本身中),请使用 AS 为该列创建别名,如下所示

SELECT
  title AS "Product title", -- Note the double quotes, single quotes won't work
  category AS "Product category"
FROM
  products;

SQL 别名是查询中值的临时名称。别名不会影响底层数据库;别名仅存在于查询本身中。您通常使用别名来

  • 提高可读性。
  • 命名列表达式(例如 CONCAT(first_name, ' ', last_name) AS "Full name")。
  • 命名通用表表达式(请参阅 CTE)。
  • 自连接表。

SQL 的大小写通常无关紧要,别名除外

对 SQL 的保留字使用全大写是一种在语法高亮之前就存在的约定,但字母大小写对于保留字或列名无关紧要。此查询也可以正常工作

SeLeCt
  *
FrOM
  PROdUCTS;

但是,您知道:不要这样做。编写人们(包括六个月后的您)能够阅读的查询。所以,无论是全大写还是不(SELECTselect),请保持一致。

然而,大小写确实适用于别名,因此请确保别名的大小写完全匹配(对于别名,"Example""example" 不同)。

SQL:获取行样本

这仅在您的表具有随机分布的 ID 行时才有效。您可以使用 MOD 函数(modulo 的缩写)根据 ID 来采样数据

SELECT
  id,
  title,
  category
FROM
  products
WHERE
  -- For this to work, the table's ids must be sequential integers
  MOD(id, 10) = 3;

它返回

| id  | title                         | category   |
|-----|-------------------------------|------------|
| 3   | Synergistic Granite Chair     | Doohickey  |
| 13  | Synergistic Steel Chair       | Gizmo      |
| 23  | Fantastic Aluminum Bottle     | Widget     |

以及更多的行,其中每第十行都有一个以 3 结尾的 ID。其工作原理:例如,如果 ID 是 23,那么 MOD(23, 10) 将返回 3,因为 23 除以 10 余 3,所以第 23 行将被包含在结果中。这只是将结果除以 10,所以如果表有很多行,您会想增加除数的数量级:100、1000 等。

这个技巧更像是“激发您对 SQL 可能性的兴趣”。我们将在后面深入介绍 SQL 函数(如 MOD)。

这有帮助吗?

感谢您的反馈!
订阅新闻通讯
Metabase 的更新和新闻
© . This site is unofficial and not affiliated with Metabase, Inc.