主頁 > 資料庫 > SQL GROUPING 運算子

SQL GROUPING 運算子

2021-12-07 08:05:08 資料庫

目錄
  • 一、同時得到合計行
  • 二、ROLLUP——同時得出合計和小計
    • 2.1 ROLLUP 的使用方法
    • 2.2 將“登記日期”添加到聚合鍵當中
  • 三、GROUPING 函式——讓 NULL 更加容易分辨
  • 四、CUBE——用資料來搭積木
  • 五、GROUPING SETS——取得期望的積木
  • 請參閱

學習重點

  • 只使用 GROUP BY 子句和聚合函式是無法同時得出小計和合計的,如果想要同時得到,可以使用 GROUPING 運算子,

  • 理解 GROUPING 運算子中 CUBE 的關鍵在于形成“積木搭建出的立方體”的印象,

  • 雖然 GROUPING 運算子是標準 SQL 的功能,但還是有些 DBMS 尚未支持這一功能,

一、同時得到合計行

我們在 對表進行分組 中學習了 GROUP BY 子句和聚合函式的使用方法,可能有些讀者會想,是否有辦法能夠通過 GROUP BY 子句得到表 1 那樣的結果呢?

表 1 添加合計行

添加合計行

雖然這是按照商品種類計算銷售單價的總額時得到的結果,但問題在于最上面多出了 1 行合計行,使用代碼清單 10 中的 GROUP BY 子句的語法無法得到這一行,

代碼清單 10 使用 GROUP BY 無法得到合計行

SELECT product_type, SUM(sale_price)
  FROM Product
 GROUP BY product_type;

執行結果

 product_type |  sum
--------------+------
 衣服         |  5000
 辦公用品     |   600
 廚房用具     | 11180

因為 GROUP BY 子句是用來指定聚合鍵的場所,所以只會根據這里指定的鍵分割資料,當然不會出現合計行,而合計行是不指定聚合鍵時得到的匯總結果,因此與下面的 3 行通過聚合鍵得到的結果并不相同,按照通常的思路,想一次得到這兩種結果是不可能的,

如果想要獲得那樣的結果,通常的做法是分別計算出合計行和按照商品種類進行匯總的結果,然后通過 UNION ALL [1] 連接在一起(代碼清單 11),

KEYWORD

  • UNION ALL

代碼清單 11 分別計算出合計行和匯總結果再通過 UNION ALL 進行連接

SELECT '合計' AS product_type, SUM(sale_price)
  FROM Product
UNION ALL
SELECT product_type, SUM(sale_price)
  FROM Product
GROUP BY product_type;

執行結果

 product_type |  sum
--------------+------
 合計         | 16780
 衣服         |  5000
 辦公用品     |   600
 廚房用具     | 11180

這樣一來,為了得到想要的結果,需要執行兩次幾乎相同的 SELECT 陳述句,再將其結果進行連接,不但看上去十分繁瑣,而且 DBMS 內部的處理成本也非常高,難道沒有更合適的實作方法了嗎?

二、ROLLUP——同時得出合計和小計

為了滿足用戶的需求,標準 SQL 引入了 GROUPING 運算子,我們將在本節中著重介紹,使用該運算子就能通過非常簡單的 SQL 得到之前那樣的匯總單位不同的匯總結果了,

KEYWORD

  • GROUPING 運算子

GROUPING 運算子包含以下 3 種 [2]

  • ROLLUP

  • CUBE

  • GROUPING SETS

2.1 ROLLUP 的使用方法

我們先從 ROLLUP 開始學習吧,使用 ROLLUP 就可以通過非常簡單的 SELECT 陳述句同時計算出合計行了(代碼清單 12),

KEYWORD

  • ROLLUP 運算子

代碼清單 12 使用 ROLLUP 同時得出合計和小計

Oracle SQL Server DB2 PostgreSQL

SELECT product_type, SUM(sale_price) AS sum_price
  FROM Product
 GROUP BY ROLLUP(product_type);-----①

特定的 SQL

在 MySQL 中執行代碼清單 12 時,請將 ① 中的 GROUP BY 子句改寫為“GROUP BY product_type WITH ROLLUP;”,

執行結果(在 DB2 中執行)

 product_type    sum_price
--------------    ---------
                     16780
 廚房用具             11180
 辦公用品               600
 衣服                  5000

從語法上來說,就是將 GROUP BY 子句中的聚合鍵清單像 ROLLUP(<列 1>,<列 2>,...) 這樣使用,該運算子的作用,一言以蔽之,就是“一次計算出不同聚合鍵組合的結果”,例如,在本例中就是一次計算出了如下兩種組合的匯總結果,

GROUP BY ()

GROUP BY (product_type)

① 中的 GROUP BY () 表示沒有聚合鍵,也就相當于沒有 GROUP BY 子句(這時會得到全部資料的合計行的記錄),該合計行記錄稱為超級分組記錄(super group row),雖然名字聽上去很炫,但還是希望大家把它當作未使用 GROUP BY 的合計行來理解,超級分組記錄的 product_type 列的鍵值(對 DBMS 來說)并不明確,因此會默認使用 NULL,之后會為大家講解在此處插入恰當的字串的方法,

KEYWORD

  • 超級分組記錄

法則 6

超級分組記錄默認使用 NULL 作為聚合鍵,

2.2 將“登記日期”添加到聚合鍵當中

僅僅通過剛才一個例子大家的印象可能不夠深刻,下面讓我們再添加一個聚合鍵“登記日期(regist_date)”試試看吧,首先從不使用 ROLLUP 開始(代碼清單 13),

代碼清單 13 在 GROUP BY 中添加“登記日期”(不使用 ROLLUP

SELECT product_type, regist_date, SUM(sale_price) AS sum_price
  FROM Product
 GROUP BY product_type, regist_date;

執行結果(在 DB2 中執行)

 product_type   regist_date    sum_price
--------------  ------------   ----------
 廚房用具        2008-04-28           880
 廚房用具        2009-01-15          6800
 廚房用具        2009-09-20          3500
 辦公用品        2009-09-11           500
 辦公用品        2009-11-11           100
 衣服            2009-09-20          1000
 衣服                                4000

在上述 GROUP BY 子句中使用 ROLLUP 之后,結果會發生什么變化呢(代碼清單 14)?

代碼清單 14 在 GROUP BY 中添加“登記日期”(使用 ROLLUP

Oracle SQL Server DB2 PostgreSQL

SELECT product_type, regist_date, SUM(sale_price) AS sum_price
  FROM Product
 GROUP BY ROLLUP(product_type, regist_date); ------①

特定的 SQL

在 MySQL 中執行代碼清單 14 時,請將 ① 中的 GROUP BY 子句改寫為“GROUP BY product_type, regist_date WITH ROLLUP;

執行結果(在 DB2 中執行)

 product_type   regist_date    sum_price
--------------  ------------   ----------
                                   16780 ←合計
 廚房用具                          11180 ←小計(廚房用具)
 廚房用具       2008-04-28           880
 廚房用具       2009-01-15          6800
 廚房用具       2009-09-20          3500
 辦公用品                            600 ←小計(辦公用品)
 辦公用品       2009-09-11           500
 辦公用品       2009-11-11           100
 衣服                               5000 ←小計(衣服)
 衣服           2009-09-20          1000
 衣服                               4000

將上述兩個結果進行比較后我們發現,使用 ROLLUP 時多出了最上方的合計行以及 3 條不同商品種類的小計行(也就是未使用登記日期作為聚合鍵的記錄),這 4 行就是我們所說的超級分組記錄,也就是說,該 SELECT 陳述句的結果相當于使用 UNION 對如下 3 種模式的聚合級的不同結果進行連接(圖 5),

GROUP BY ()

GROUP BY (product_type)

GROUP BY (product_type, regist_date)

3 種模式的聚合級

圖 5 3 種模式的聚合級

如果大家覺得上述結果不容易理解的話,可以參考表 2 中按照聚合級添加縮進和說明后的內容,理解起來就很容易了,

表 2 根據聚合級添加縮進后的結果

合計 16780
廚房用具 小計 11180
廚房用具 2008-04-28 880
廚房用具 2009-01-15 6800
廚房用具 2009-09-20 3500
辦公用品 小計 600
辦公用品 2009-09-11 500
辦公用品 2009-11-11 100
衣服 小計 5000
衣服 2009-09-20 1000
衣服 4000

ROLLUP 是“卷起”的意思,比如卷起百葉窗、窗簾卷,等等,其名稱也形象地說明了該操作能夠得到像從小計到合計這樣,從最小的聚合級開始,聚合單位逐漸擴大的結果,

法則 7

ROLLUP 可以同時得出合計和小計,是非常方便的工具,

專欄

GROUPING 運算子的支持情況

本節介紹的 GROUPING 運算子與 視窗函式 中介紹的視窗函式都是為了實作 OLAP 用途而添加的功能,是比較新的功能(是 SQL:1999 的標準 SQL 中添加的新功能),因此,還有一些 DBMS 尚未支持這些功能,截止到 2016 年 5 月,Oracle、SQL Server、DB2、PostgreSQL 的最新版本都已經支持這些功能了,但 MySQL 的最新版本 5.7 還是不支持這些功能,

想要在不支持 GROUPING 運算子的 DBMS 中獲得包含合計和小計的結果時,只能像本文一開始介紹的那樣,使用 UNION 將多條 SELECT 陳述句連接起來,

此外,使用 MySQL 時的情況更加復雜一些,只有一個不合規則的 ROLLUP 能夠使用,這里所說的“不合規則”指的是需要使用特定的語法,

-- MySQL專用
SELECT product_type, regist_date, SUM(sale_price) AS sum_price
 FROM Product
GROUP BY product_type, regist_date WITH ROLLUP;

遺憾的是,MySQL 5.7 并不支持 CUBEGROUPING SETS,希望之后的版本能夠提供對它們的支持,

三、GROUPING 函式——讓 NULL 更加容易分辨

可能有些讀者會注意到,之前使用 ROLLUP 所得到的結果(代碼清單 14 的執行結果)有些蹊蹺,問題就出在“衣服”的分組之中,有兩條記錄的 regist_date 列為 NULL,但其原因卻并不相同,

sum_price 為 4000 日元的記錄,因為商品表中運動 T 恤的注冊日期為 NULL,所以就把 NULL 作為聚合鍵了,這在之前的示例中我們也曾見到過,

相反,sum_price 為 5000 日元的記錄,毫無疑問就是超級分組記錄的 NULL 了(具體為 1000 日元 + 4000 日元 = 5000 日元),但兩者看上去都是“NULL”,實在是難以分辨,

 product_type   regist_date    sum_price
--------------  ------------   ----------
 衣服                               5000  ←因為是超級分組記錄,所以登記日期為NULL
 衣服           2009-09-20          1000
 衣服                               4000  ←僅僅因為“運動T恤”的登記日期為NULL

為了避免混淆,SQL 提供了一個用來判斷超級分組記錄的 NULL 的特定函式 —— GROUPING 函式,該函式在其引數列的值為超級分組記錄所產生的 NULL 時回傳 1,其他情況回傳 0(代碼清單 15),

KEYWORD

  • GROUPING 函式

代碼清單 15 使用 GROUPING 函式來判斷 NULL

Oracle SQL Server DB2 PostgreSQL

SELECT GROUPING(product_type) AS product_type,
            GROUPING(regist_date) AS regist_date, SUM(sale_price) AS sum_price
  FROM Product
 GROUP BY ROLLUP(product_type, regist_date);

執行結果(在 DB2 中執行)

 product_type   regist_date    sum_price
--------------  ------------   ----------
 1              1                  16780
 0              1                  11180
 0              0                    880
 0              0                   6800
 0              0                   3500
 0              1                    600
 0              0                    500
 0              0                    100
 0              1                   5000  ←碰到超級分組記錄中的NULL時回傳1
 0              0                   1000
 0              0                   4000  ←原始資料為NULL時回傳0

這樣就能分辨超級分組記錄中的 NULL 和原始資料本身的 NULL 了,使用 GROUPING 函式還能在超級分組記錄的鍵值中插入字串,也就是說,當 GROUPING 函式的回傳值為 1 時,指定“合計”或者“小計”等字串,其他情況回傳通常的列的值(代碼清單 16),

代碼清單 16 在超級分組記錄的鍵值中插入恰當的字串

Oracle SQL Server DB2 PostgreSQL

SELECT CASE WHEN GROUPING(product_type) = 1
            THEN '商品種類 合計'
            ELSE product_type END AS product_type,
       CASE WHEN GROUPING(regist_date) = 1
            THEN '登記日期 合計'
            ELSE CAST(regist_date AS VARCHAR(16)) END AS regist_date,
       SUM(sale_price) AS sum_price
  FROM Product
 GROUP BY ROLLUP(product_type, regist_date);

執行結果(在 DB2 中執行)

 product_type    regist_date    sum_price
--------------   ------------   ----------
商品種類 合計     登記日期 合計       16780
廚房用具          登記日期 合計       11180
廚房用具          2008-04-28           880
廚房用具          2009-01-15          6800
廚房用具          2009-09-20          3500
辦公用品          登記日期 合計         600
辦公用品          2009-09-11           500
辦公用品          2009-11-11           100
衣服              登記日期 合計       5000    ←將超級分組記錄中的NULL替換為“登記日期 合計”
衣服              2009-09-20         1000
衣服                                 4000    ←原始資料中的NULL保持不變

在實際業務中需要獲取包含合計或者小計的匯總結果(這種情況是最多的)時,就可以使用 ROLLUPGROUPING 函式來實作了,

CAST(regist_date AS VARCHAR(16))

那為什么還要將 SELECT 子句中的 regist_date 列轉換為 CAST(regist_date AS VARCHAR)16)) 形式的字串呢?這是為了滿足 CASE 運算式所有分支的回傳值必須一致的條件,如果不這樣的話,那么各個分支會分別回傳日期型別和字串型別的值,執行時就會發生語法錯誤,

法則 8

使用 GROUPING 函式能夠簡單地分辨出原始資料中的 NULL 和超級分組記錄中的 NULL

四、CUBE——用資料來搭積木

ROLLUP 之后我們來介紹另一個常用的 GROUPING 運算子 —— CUBECUBE 是“立方體”的意思,這個名字和 ROLLUP 一樣,都能形象地說明函式的動作,那么究竟是什么樣的動作呢?還是讓我們通過一個列子來看一看吧,

KEYWORD

  • CUBE 運算子

CUBE 的語法和 ROLLUP 相同,只需要將 ROLLUP 替換為 CUBE 就可以了,下面我們就把代碼清單 16 中的 SELECT 陳述句替換為 CUBE 試試看吧(代碼清單 17),

代碼清單 17 使用 CUBE 取得全部組合的結果

Oracle SQL Server DB2 PostgreSQL

SELECT CASE WHEN GROUPING(product_type) = 1
            THEN '商品種類 合計'
            ELSE product_type END AS product_type,
       CASE WHEN GROUPING(regist_date) = 1
            THEN '登記日期 合計'
            ELSE CAST(regist_date AS VARCHAR(16)) END AS regist_date,
       SUM(sale_price) AS sum_price
  FROM Product
 GROUP BY CUBE(product_type, regist_date);

執行結果(在 DB2 中執行)

 product_type    regist_date    sum_price
--------------   ------------   ----------
 商品種類 合計    登記日期 合計       16780
 商品種類 合計    2008-04-28           880 ←追加
 商品種類 合計    2009-01-15          6800 ←追加
 商品種類 合計    2009-09-11           500 ←追加
 商品種類 合計    2009-09-20          4500 ←追加
 商品種類 合計    2009-11-11           100 ←追加
 商品種類 合計                        4000 ←追加
 廚房用具         登記日期 合計       11180
 廚房用具         2008-04-28           880
 廚房用具         2009-01-15          6800
 廚房用具         2009-09-20          3500
 辦公用品         登記日期 合計         600
 辦公用品         2009-09-11           500
 辦公用品         2009-11-11           100
 衣服             登記日期 合計        5000
 衣服             2009-09-20          1000
 衣服                                 4000

ROLLUP 的結果相比,CUBE 的結果中多出了幾行記錄,大家看一下應該就明白了,多出來的記錄就是只把 regist_date 作為聚合鍵所得到的匯總結果,

GROUP BY ()

GROUP BY (product_type)

GROUP BY (regist_date) ←添加的組合

GROUP BY (product_type, regist_date)

所謂 CUBE,就是將 GROUP BY 子句中聚合鍵的“所有可能的組合”的匯總結果集中到一個結果中,因此,組合的個數就是 2nn 是聚合鍵的個數),本例中聚合鍵有 2 個,所以 22 = 4,如果再添加 1 個變為 3 個聚合鍵的話,就是 23 = 8 [3]

讀到這里,可能很多讀者都會覺得奇怪,究竟 CUBE 運算子和立方體有什么關系呢?

眾所周知,立方體由長、寬、高 3 個軸構成,對于 CUBE 來說,一個聚合鍵就相當于其中的一個軸,而結果就是將資料像積木那樣堆積起來(圖 6),

CUBE 的執行圖示

圖 6 CUBE 的執行圖示

由于本例中只有商品種類(product_type)和登記日期(regist_date)2 個軸,所以我們看到的其實是一個正方形,請大家把它看作缺了 1 個軸的立方體,通過 CUBE 當然也可以指定 4 個以上的軸,但那已經屬于 4 維空間的范疇了,是無法用圖形來表示的,

法則 9

可以把 CUBE 理解為將使用聚合鍵進行切割的模塊堆積成一個立方體,

五、GROUPING SETS——取得期望的積木

最后要介紹給大家的 GROUPING 運算子是 GROUPING SETS,該運算子可以用于從 ROLLUP 或者 CUBE 的結果中取出部分記錄,

KEYWORD

  • GROUPING SETS 運算子

例如,之前的 CUBE 的結果就是根據聚合鍵的所有可能的組合計算而來的,如果希望從中選取出將“商品種類”和“登記日期”各自作為聚合鍵的結果,或者不想得到“合計記錄和使用 2 個聚合鍵的記錄”時,可以使用 GROUPING SETS(代碼清單 18),

代碼清單 18 使用 GROUPING SETS 取得部分組合的結果

Oracle SQL Server DB2 PostgreSQL

SELECT CASE WHEN GROUPING(product_type) = 1
            THEN '商品種類 合計'
            ELSE product_type END AS product_type,
       CASE WHEN GROUPING(regist_date) = 1
            THEN '登記日期 合計'
            ELSE CAST(regist_date AS VARCHAR(16)) END AS regist_date,
       SUM(sale_price) AS sum_price
  FROM Product
 GROUP BY GROUPING SETS (product_type, regist_date);

執行結果(在 DB2 中執行)

 product_type    regist_date    sum_price
--------------   ------------   ----------
 商品種類 合計    2008-04-28           880
 商品種類 合計    2009-01-15          6800
 商品種類 合計    2009-09-11           500
 商品種類 合計    2009-09-20          4500
 商品種類 合計    2009-11-11           100
 商品種類 合計                        4000
 廚房用具         登記日期 合計       11180
 辦公用品         登記日期 合計         600
 衣服             登記日期 合計        5000

上述結果中也沒有全體的合計行(16780 日元),與 ROLLUP 或者 CUBE 能夠得到規定的結果相對,GROUPING SETS 用于從中取出個別條件對應的不固定的結果,然而,由于期望獲得不固定結果的情況少之又少,因此與 ROLLUP 或者 CUBE 比起來,使用 GROUPING SETS 的機會也就很少了,

請參閱

  • 視窗函式
  • GROUPING 運算子

(完)


  1. 雖然也可以使用 UNION 來代替 UNION ALL,但由于兩條 SELECT 陳述句的聚合鍵不同,一定不會出現重復行,因此可以使用 UNION ALLUNION ALLUNION 的不同之處在于它不會對結果進行排序,因此比 UNION 的性能更好, ??

  2. 目前 PostgreSQL 和 MySQL 并不支持 GROUPING 運算子(MySQL 僅支持 ROLLUP),具體內容請參考專欄“GROUPING 運算子的支持狀況”, ??

  3. 使用 ROLLUP 時組合的個數是 n + 1,隨著組合個數的增加,結果的行數也會增加,因此如果使用 CUBE 時不加以注意的話,往往會得到意想不到的巨大結果,順帶說一下,ROLLUP 的結果一定包含在 CUBE 的結果之中, ??

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/374449.html

標籤:SQL Server

上一篇:SQL 視窗函式簡介

下一篇:SQL使用ROW_NUMBER() OVER函式自動生成序列號

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more