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 只获取*部分*列
要返回特定列,例如只返回 title
和 category
列
| 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
语句中的序数位置。在某些数据库中,按位置排序是唯一可以按别名列排序的方式。但如果可能,最好包含列名或别名,这样人们在阅读代码时就不必在 SELECT
和 ORDER BY
部分之间来回切换。
SQL 更改列的名称
假设您的表有像 title
和 category
这样的列名,但您希望每个列标题都以“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;
但是,你知道:不要这样做。编写人们(包括六个月后的你)都能阅读的查询。所以,无论全大写与否(SELECT
或 select
),都要保持一致。
但是,大小写*确实*适用于别名,因此请确保别名的大小写字母完全匹配(对于别名,"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
)。