Navicat 部落格

將查詢結果分為多個範圍 2020 年 8 月 4 日,由 Robert Gravelle 撰寫

對於資料!庫開發人員和資料庫管理員(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 資料表:

grade_table (89K)

假設我們要按相等的百分位數象限來計算學生的成績等級,如下所示:

  • 0 至 25
  • 26 至 50
  • 51 至 75
  • 76 至 100

這是執行的查詢以及產生的結果:

student_marks (60K)

請留意 CASE 陳述式,你會注意到它使用 BETWEEN 運算子定義了每個範圍。它選取包含範圍內的數值,而外層的數值也包含在範圍內。BETWEEN 能處理多種類型的資料,包括數字、文字和日期。

處理日期

在許多情況下,可以使用 DATE 類型的多個日期部分函式將日期劃分為邏輯片段,例如 DAY()、DAYOFMONTH()、DAYOFWEEK()、DAYOFYEAR()、MONTH()、YEAR() 等。這些函式使你可以用直覺的單位分割範圍。

為了顯示,這是一個在 MySQL Sakila 範例資料庫執行的查詢,該查詢計算了每個客戶的平均租金,並細分為按年份和月份:

average_rental_cost (163K)

使用 DATE 函式的好處是我們可以省去 CASE 陳述式,因為可以使用 GROUP BY 按相同的函式分組。

總結

在今天的文章中,我們學習了如何使用 Navicat Premium 的查詢編輯器撰寫範圍查詢。如果你對 Navicat Premium 感興趣,可以免費試用 14 天!

Navicat 文章
頻道記錄
分享
部落格封存檔