4.1 限制
如果您希望您的 SQL 查询返回过多的数据,您可以提前限制最大数量。毕竟,表格可以包含数千甚至数百万行。
SQL 使得使用LIMIT. 此关键字用在 SQL 查询的最后,如下所示:
LIMIT quantity
让我们针对产品表编写一个查询,其中包含我们商店产品的列表。但是由于我们有一家非常成功的商店并且我们销售了很多产品,所以我们只想获得答案的前 10 行。该请求如下所示:
SELECT * FROM product
LIMIT 10
我们得到以下查询结果:
| ID | 姓名 | 品牌 | 价格 | 数数 |
|---|---|---|---|---|
| 1个 | 桌子 | 宜家 | 20.00 | 15 |
| 2个 | 椅子 | 宜家 | 5.00 | 45 |
| 3个 | 沙发 | 宜家 | 80.00 | 10 |
| 4个 | 床 | 宜家 | 75.00 | 10 |
| 5个 | 壁橱 | 博世 | 125.00 | 15 |
| 6个 | 架子 | 架子 | 25.00 | 114 |
| 7 | 电视 | LG | 350.00 | 4个 |
| 8个 | 灯 | LG | 15.00 | 100 |
| 9 | 梳妆台 | 宜家 | 99.00 | 10 |
| 10 | 盘子 | 博世 | 199.00 | 10 |
现在我们将只请求前 5 行。该请求如下所示:
SELECT * FROM product
LIMIT 5
我们得到如下查询结果:
| ID | 姓名 | 品牌 | 价格 | 数数 |
|---|---|---|---|---|
| 1个 | 桌子 | 宜家 | 20.00 | 15 |
| 2个 | 椅子 | 宜家 | 5.00 | 45 |
| 3个 | 沙发 | 宜家 | 80.00 | 10 |
| 4个 | 床 | 宜家 | 75.00 | 10 |
| 5个 | 壁橱 | 博世 | 125.00 | 15 |
4.2 偏移量
上次我们学习了如何限制服务器响应中的行数。现在,我们可以获取前 10 行并将它们显示给用户,而不是产品表中的数千行。这是完美的。但是我们如何显示后 10 行呢?第三个?
如果我们写LIMIT 20, or LIMIT 30,服务器不会分别返回 20 和 30 行吗?
对于这种情况,SQL 有一个特殊的关键字OFFSET,您可以使用该关键字要求服务器在其响应中跳过 N 行。此关键字用在 SQL 查询的最后(在 之后LIMIT),如下所示:
OFFSET quantity
让我们在产品表上写一个查询,并尝试获取记录 11 到 15。换句话说,我们要求服务器返回 5 行给我们,但先跳过响应的前 10 行。该请求如下所示:
SELECT * FROM product
LIMIT 5
OFFSET 10
我们得到如下查询结果:
| ID | 姓名 | 品牌 | 价格 | 数数 |
|---|---|---|---|---|
| 十一 | 扶手椅 | 博世 | 44.00 | 8个 |
| 12 | 花盆 | 聪明花 | 99.00 | 9 |
| 13 | 站立 | 宜家 | 100.00 | 10 |
服务器只返回了 3 行,这意味着我们的表中总共有 13 行。服务器跳过前 10 个并返回接下来的 5 个。
4.3 选择不同的
另一个有用的关键字是DISTINCT. 当表中有重复记录并且我们想要删除重复项时使用它。
我们表中的重复项来自哪里?表中可能没有重复项,但作为查询的结果,很容易。让我们编写一个查询,返回我们销售的所有产品的品牌。该请求如下所示:
SELECT brand FROM product
我们得到如下查询结果:
| 品牌 |
|---|
| 宜家 |
| 宜家 |
| 宜家 |
| 宜家 |
| 博世 |
| 博世 |
| LG |
| LG |
| 宜家 |
| 博世 |
| 博世 |
| 聪明花 |
| 宜家 |
很容易看出这张表中有重复的行。这是为了确保没有重复,你需要使用关键字DISTINCT。更正后的请求如下所示:
SELECT DISTINCT brand
FROM product
我们得到如下查询结果:
| 品牌 |
|---|
| 宜家 |
| 博世 |
| LG |
| 聪明花 |
好多了。是不是?;)
4.4 订购方式
最后我们要进行排序。要对查询结果进行排序,您需要使用关键字ORDER BY。从技术上讲,这是两个词,但本质并不重要。两个字,一个运营商。
它必须写在关键字之后WHERE,但在LIMITand之前OFFSET。ORDER BY如果你在 之后写LIMIT,那么 SQL 服务器将简单地返回一个错误给你。
通常,此运算符如下所示:
ORDER BY column order
其中 column 是表/排序结果中列的名称。而顺序就是排序顺序。
排序顺序可以是三种类型:
ASC(来自升序)- 升序;DESC(来自降序)-降序;- 未指定 - 将被使用
ASC
让我们编写一个查询,返回按价格升序排列的产品列表。该请求如下所示:
SELECT * FROM product
ORDER BY price ASC
LIMIT 10
我们得到如下查询结果:
| ID | 姓名 | 品牌 | 价格 | 数数 |
|---|---|---|---|---|
| 2个 | 椅子 | 宜家 | 5.00 | 45 |
| 8个 | 灯 | LG | 15.00 | 100 |
| 1个 | 桌子 | 宜家 | 20.00 | 15 |
| 6个 | 架子 | 博世 | 25.00 | 114 |
| 十一 | 扶手椅 | 博世 | 44.00 | 8个 |
| 4个 | 床 | 宜家 | 75.00 | 10 |
| 3个 | 沙发 | 宜家 | 80.00 | 10 |
| 12 | 花盆 | 聪明花 | 99.00 | 9 |
| 9 | 梳妆台 | 宜家 | 99.00 | 10 |
| 13 | 站立 | 宜家 | 100.00 | 10 |
如果我们不指定排序顺序,我们将得到相同的结果——我们将跳过单词ASC。
4.5 跨多列的ORDER BY
运算符ORDER BY允许您按多列对结果进行排序。当第一列有很多重复元素时,这会非常有用。该运算符的一般形式如下:
ORDER BY column 1 order 1, column 2 order 2, column 3 order 3
换句话说,如果按第一列排序后你附近有几个相同的值,那么它们按第二列排序,依此类推。
让我们编写一个查询,该查询将按品牌对我们的产品进行排序,对于具有相同品牌的产品 - 按其编号的降序排列。该请求如下所示:
SELECT * FROM product
ORDER BY brand ASC, count
DESC
我们得到如下查询结果:
| ID | 姓名 | 品牌 | 价格 | 数数 |
|---|---|---|---|---|
| 6个 | 架子 | 博世 | 25.00 | 114 |
| 5个 | 壁橱 | 博世 | 125.00 | 15 |
| 10 | 盘子 | 博世 | 199.00 | 10 |
| 十一 | 扶手椅 | 博世 | 44.00 | 8个 |
| 2个 | 椅子 | 宜家 | 5.00 | 45 |
| 1个 | 桌子 | 宜家 | 20.00 | 15 |
| 9 | 梳妆台 | 宜家 | 99.00 | 10 |
| 13 | 站立 | 宜家 | 100.00 | 10 |
| 4个 | 床 | 宜家 | 75.00 | 10 |
| 3个 | 沙发 | 宜家 | 80.00 | 10 |
| 8个 | 灯 | LG | 15.00 | 100 |
| 7 | 电视 | LG | 350.00 | 4个 |
| 12 | 花盆 | 聪明花 | 99.00 | 9 |
仔细查看表格 - 它的行按品牌名称排序(字母顺序),具有相同品牌名称的行按产品编号降序排序(最后一列)。
GO TO FULL VERSION