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
,但在LIMIT
and之前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