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 |

您可以从表中 SELECT 列,如下所示

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 关键字有时是可选的(取决于数据库引擎),但在 ORDER BY 子句中包含 ASC 使代码更易读,并且它总是有效。

要按降序(从高到低)排序,请添加 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 函数(模的缩写)根据 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     |

以及更多的行,每第十行的 ID 以 3 结尾。工作原理:例如,如果 ID 为 23,MOD(23, 10) 将返回 3,因为 23 除以 10 余 3,所以第 23 行将包含在结果中。这只是将结果除以 10,所以如果表有很多行,您需要增加除数的大小:100、1000 等。

这个技巧更多的是一种激发您对 SQL 潜力的兴趣。我们将在稍后深入介绍 SQL 函数(如 MOD)。

这有帮助吗?

感谢您的反馈!
分析师每周技巧
获取可行的见解
关于 AI 和数据的资讯,直接发送到您的收件箱
© . This site is unofficial and not affiliated with Metabase, Inc.