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
和之前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