對於資料!庫開發人員和資料庫管理員(DBA)來說,將查詢結果分到大小相等的儲存桶中是常見的需求。範例包括:
- 姓氏以 A-L 和 M-Z 開頭的客戶
- 產品價格在 1-10 元、11-20 元、21-20 元之間,等等。
- 季度銷售,即 1-3 月、4-6 月、7-9 月、10-12 月
標準 SQL 非常適合此工作。透過將 CASE 陳述式的功能與 GROUP BY 子句結合使用,可以將資料分為我們認為能最好解釋資料所需的任何範圍。在今天的文章中,我們將在 Navicat Premium 的查詢編輯器中撰寫幾個範圍查詢。
將成績等級以百分位數分割
我們的第一個範例將需要一個包含幾個學生的成績等級的資料表。這是建立 grade 資料表和填入資料的 SQL:
DROP TABLE IF EXISTS `grade`; CREATE TABLE `grade` ( `StuID` int(11) NULL DEFAULT NULL, `Semester` tinyint(4) NULL DEFAULT NULL, `YEAR` int(11) NULL DEFAULT NULL, `Marks` int(11) NULL DEFAULT NULL ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (110, 1, 2018, 66); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (110, 3, 2018, 77); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (110, 2, 2018, 86); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (110, 4, 2018, 69); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (100, 1, 2018, 20); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (100, 2, 2018, 39); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (100, 3, 2018, 65); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (100, 4, 2018, 70); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (99, 1, 2018, 50); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (99, 2, 2018, 45); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (99, 3, 2018, 90); INSERT INTO `grade`(`StuID`, `Semester`, `YEAR`, `Marks`) VALUES (99, 4, 2018, 96);
這是 Navicat 中的 grade 資料表:
假設我們要按相等的百分位數象限來計算學生的成績等級,如下所示:
- 0 至 25
- 26 至 50
- 51 至 75
- 76 至 100
這是執行的查詢以及產生的結果:
請留意 CASE 陳述式,你會注意到它使用 BETWEEN 運算子定義了每個範圍。它選取包含範圍內的數值,而外層的數值也包含在範圍內。BETWEEN 能處理多種類型的資料,包括數字、文字和日期。
處理日期
在許多情況下,可以使用 DATE 類型的多個日期部分函式將日期劃分為邏輯片段,例如 DAY()、DAYOFMONTH()、DAYOFWEEK()、DAYOFYEAR()、MONTH()、YEAR() 等。這些函式使你可以用直覺的單位分割範圍。
為了顯示,這是一個在 MySQL Sakila 範例資料庫執行的查詢,該查詢計算了每個客戶的平均租金,並細分為按年份和月份:
使用 DATE 函式的好處是我們可以省去 CASE 陳述式,因為可以使用 GROUP BY 按相同的函式分組。
總結
在今天的文章中,我們學習了如何使用 Navicat Premium 的查詢編輯器撰寫範圍查詢。如果你對 Navicat Premium 感興趣,可以免費試用 14 天!