
- MySQL 基礎
- MySQL - 首頁
- MySQL - 簡介
- MySQL - 特性
- MySQL - 版本
- MySQL - 變數
- MySQL - 安裝
- MySQL - 管理
- MySQL - PHP 語法
- MySQL - Node.js 語法
- MySQL - Java 語法
- MySQL - Python 語法
- MySQL - 連線
- MySQL - Workbench
- MySQL 資料庫
- MySQL - 建立資料庫
- MySQL - 刪除資料庫
- MySQL - 選擇資料庫
- MySQL - 顯示資料庫
- MySQL - 複製資料庫
- MySQL - 資料庫匯出
- MySQL - 資料庫匯入
- MySQL - 資料庫資訊
- MySQL 使用者
- MySQL - 建立使用者
- MySQL - 刪除使用者
- MySQL - 顯示使用者
- MySQL - 修改密碼
- MySQL - 授予許可權
- MySQL - 顯示許可權
- MySQL - 收回許可權
- MySQL - 鎖定使用者帳戶
- MySQL - 解鎖使用者帳戶
- MySQL 表
- MySQL - 建立表
- MySQL - 顯示錶
- MySQL - 修改表
- MySQL - 重命名錶
- MySQL - 克隆表
- MySQL - 清空表
- MySQL - 臨時表
- MySQL - 修復表
- MySQL - 描述表
- MySQL - 新增/刪除列
- MySQL - 顯示列
- MySQL - 重新命名列
- MySQL - 表鎖定
- MySQL - 刪除表
- MySQL - 派生表
- MySQL 查詢
- MySQL - 查詢
- MySQL - 約束
- MySQL - INSERT 查詢
- MySQL - SELECT 查詢
- MySQL - UPDATE 查詢
- MySQL - DELETE 查詢
- MySQL - REPLACE 查詢
- MySQL - INSERT IGNORE
- MySQL - INSERT ON DUPLICATE KEY UPDATE
- MySQL - INSERT INTO SELECT
- MySQL 運算子和子句
- MySQL - WHERE 子句
- MySQL - LIMIT 子句
- MySQL - DISTINCT 子句
- MySQL - ORDER BY 子句
- MySQL - GROUP BY 子句
- MySQL - HAVING 子句
- MySQL - AND 運算子
- MySQL - OR 運算子
- MySQL - LIKE 運算子
- MySQL - IN 運算子
- MySQL - ANY 運算子
- MySQL - EXISTS 運算子
- MySQL - NOT 運算子
- MySQL - NOT EQUAL 運算子
- MySQL - IS NULL 運算子
- MySQL - IS NOT NULL 運算子
- MySQL - BETWEEN 運算子
- MySQL - UNION 運算子
- MySQL - UNION vs UNION ALL
- MySQL - MINUS 運算子
- MySQL - INTERSECT 運算子
- MySQL - INTERVAL 運算子
- MySQL 連線
- MySQL - 使用連線
- MySQL - INNER JOIN
- MySQL - LEFT JOIN
- MySQL - RIGHT JOIN
- MySQL - CROSS JOIN
- MySQL - FULL JOIN
- MySQL - 自連線
- MySQL - DELETE JOIN
- MySQL - UPDATE JOIN
- MySQL - UNION vs JOIN
- MySQL 觸發器
- MySQL - 觸發器
- MySQL - 建立觸發器
- MySQL - 顯示觸發器
- MySQL - 刪除觸發器
- MySQL - BEFORE INSERT 觸發器
- MySQL - AFTER INSERT 觸發器
- MySQL - BEFORE UPDATE 觸發器
- MySQL - AFTER UPDATE 觸發器
- MySQL - BEFORE DELETE 觸發器
- MySQL - AFTER DELETE 觸發器
- MySQL 資料型別
- MySQL - 資料型別
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正則表示式
- MySQL - 正則表示式
- MySQL - RLIKE 運算子
- MySQL - NOT LIKE 運算子
- MySQL - NOT REGEXP 運算子
- MySQL - regexp_instr() 函式
- MySQL - regexp_like() 函式
- MySQL - regexp_replace() 函式
- MySQL - regexp_substr() 函式
- MySQL 函式和運算子
- MySQL - 日期和時間函式
- MySQL - 算術運算子
- MySQL - 數值函式
- MySQL - 字串函式
- MySQL - 聚合函式
- MySQL 其他概念
- MySQL - NULL 值
- MySQL - 事務
- MySQL - 使用序列
- MySQL - 處理重複項
- MySQL - SQL 注入
- MySQL - 子查詢
- MySQL - 註釋
- MySQL - 檢查約束
- MySQL - 儲存引擎
- MySQL - 將表匯出到 CSV 檔案
- MySQL - 將 CSV 檔案匯入資料庫
- MySQL - UUID
- MySQL - 通用表表達式
- MySQL - ON DELETE CASCADE
- MySQL - Upsert
- MySQL - 水平分割槽
- MySQL - 垂直分割槽
- MySQL - 遊標
- MySQL - 儲存函式
- MySQL - SIGNAL
- MySQL - RESIGNAL
- MySQL - 字元集
- MySQL - 排序規則
- MySQL - 萬用字元
- MySQL - 別名
- MySQL - ROLLUP
- MySQL - 今日日期
- MySQL - 字面量
- MySQL - 儲存過程
- MySQL - EXPLAIN
- MySQL - JSON
- MySQL - 標準差
- MySQL - 查詢重複記錄
- MySQL - 刪除重複記錄
- MySQL - 選擇隨機記錄
- MySQL - SHOW PROCESSLIST
- MySQL - 更改列型別
- MySQL - 重置自動遞增
- MySQL - COALESCE() 函式
- MySQL 有用資源
- MySQL - 有用函式
- MySQL - 語句參考
- MySQL - 快速指南
- MySQL - 有用資源
- MySQL - 討論
MySQL - ROLLUP
MySQL ROLLUP 子句
MySQL ROLLUP 子句是 GROUP BY 子句的擴充套件。它與 MySQL 中的聚合函式一起使用,用於在表中額外的一行中查詢列值的總計或彙總(也稱為列的超級聚合)。
考慮一個製造工廠,它在一個表中跟蹤每月的生產資料。為了確定年度產品產量,您可以使用 SUM() 聚合函式和 ROLLUP。但是,如果您需要找出生產低於特定閾值的月份數量,ROLLUP 將允許您使用 COUNT() 函式計算這些月份。
語法
以下是 MySQL 中 ROLLUP 子句的語法:
SELECT AggregateFunction(column_name(s)), column_name(s) FROM table_name GROUP BY column_name(s) WITH ROLLUP;
示例
首先,我們將建立一個名為“PRODUCT”的表,其中包含生產資訊,例如產品 ID、產品名稱、產品數量和組織內的生產月份:
CREATE TABLE PRODUCT ( PRODUCT_ID INT, PRODUCT_NAME VARCHAR(50), PRODUCT_COUNT INT, MONTH VARCHAR(20) );
現在,讓我們將一些資料插入到上面建立的表中:
INSERT INTO PRODUCT VALUES (101, 'Comb', 2345, 'January'), (102, 'Coffee Mugs', 1242, 'January'), (103, 'Cutlery', 124, 'January'), (101, 'Comb', 3263, 'February'), (102, 'Coffee Mugs', 10982, 'February'), (103, 'Cutlery', 435, 'February');
獲得的 PRODUCT 表如下:
PRODUCT_ID | PRODUCT_NAME | PRODUCT_COUNT | MONTH |
---|---|---|---|
101 | 梳子 | 2345 | 一月 |
102 | 咖啡杯 | 1242 | 一月 |
103 | 餐具 | 124 | 一月 |
101 | 梳子 | 3263 | 二月 |
102 | 咖啡杯 | 10982 | 二月 |
103 | 餐具 | 435 | 二月 |
現在,讓我們使用 ROLLUP 查詢每個月份生產的產品總和,如下所示:
SELECT SUM(PRODUCT_COUNT), MONTH FROM PRODUCT GROUP BY MONTH WITH ROLLUP;
輸出
您可以在下面的輸出中觀察到,計算了一月和二月的單個產品數量,並且使用 ROLLUP 在第三行顯示了總生產量的總計:
SUM(PRODUCT_COUNT) | MONTH |
---|---|
14680 | 二月 |
3711 | 一月 |
18391 | NULL |
多列 ROLLUP
您還可以透過使用 GROUP BY 子句將它們組合在一起,在多個列上使用 ROLLUP。
示例
在這裡,我們將 GROUP BY 子句應用於 PRODUCT 表的 'PRODUCT_ID' 和 'PRODUCT_NAME' 列:
SELECT PRODUCT_ID, COUNT(PRODUCT_ID) AS PROD_ID_COUNT, PRODUCT_NAME, COUNT(PRODUCT_NAME) AS PROD_ID_NAME FROM PRODUCT GROUP BY PRODUCT_ID, PRODUCT_NAME;
我們得到以下輸出:
PRODUCT_ID | PROD_ID_COUNT | PRODUCT_NAME | PROD_ID_NAME |
---|---|---|---|
101 | 2 | 梳子 | 2 |
102 | 2 | 咖啡杯 | 2 |
103 | 2 | 餐具 | 2 |
現在,讓我們使用 ROLLUP 計算這兩行的摘要,如下面的查詢所示:
SELECT PRODUCT_ID, COUNT(PRODUCT_ID) AS PROD_ID_COUNT, PRODUCT_NAME, COUNT(PRODUCT_NAME) AS PROD_ID_NAME FROM PRODUCT GROUP BY PRODUCT_ID, PRODUCT_NAME WITH ROLLUP;
您可以在下面的輸出中看到,不僅在最終級別計算了摘要,而且還在兩個級別上計算了摘要。為每個產品名稱顯示一個列摘要:
PRODUCT_ID | PROD_ID_COUNT | PRODUCT_NAME | PROD_ID_NAME |
---|---|---|---|
101 | 2 | 梳子 | 2 |
101 | 2 | NULL | 2 |
102 | 2 | 咖啡杯 | 2 |
102 | 2 | NULL | 2 |
103 | 2 | 餐具 | 2 |
103 | 2 | NULL | 2 |
NULL | 6 | NULL | 6 |
使用客戶端程式進行 Rollup
我們也可以使用客戶端程式執行 rollup。
語法
要透過 PHP 程式使用帶有聚合函式的 ROLLUP 計算列的總計,我們需要使用mysqli 函式query()執行“SELECT”語句,如下所示:
$sql = "SELECT SUM(PRODUCT_COUNT), MONTH FROM PRODUCT GROUP BY MONTH WITH ROLLUP"; $mysqli->query($sql);
要透過 JavaScript 程式使用帶有聚合函式的 ROLLUP 計算列的總計,我們需要使用mysql2 庫的query() 函式執行“SELECT”語句,如下所示:
sql = "SELECT SUM(PRODUCT_COUNT), MONTH FROM PRODUCT GROUP BY MONTH WITH ROLLUP"; con.query(sql);
要透過 Java 程式使用帶有聚合函式的 ROLLUP 計算列的總計,我們需要使用JDBC 函式executeQuery()執行“SELECT”語句,如下所示:
String sql = "SELECT SUM(PRODUCT_COUNT), MONTH FROM PRODUCT GROUP BY MONTH WITH ROLLUP"; statement.executeQuery(sql);
要透過 Python 程式使用帶有聚合函式的 ROLLUP 計算列的總計,我們需要使用MySQL Connector/Python 的execute() 函式執行“SELECT”語句,如下所示:
rollup_query = "SELECT SUM(PRODUCT_COUNT), MONTH FROM PRODUCT GROUP BY MONTH WITH ROLLUP" cursorObj.execute(rollup_query)
示例
以下是程式:
$dbhost = 'localhost'; $dbuser = 'root'; $dbpass = 'password'; $db = 'TUTORIALS'; $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db); if ($mysqli->connect_errno) { printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); $sql = "CREATE TABLE PRODUCT ( PRODUCT_ID INT, PRODUCT_NAME VARCHAR(50), PRODUCT_COUNT INT, MONTH VARCHAR(20) )"; if($mysqli->query($sql)){ printf("Product table created successfully....!"); } //now let's insert some records into the table $sql = "INSERT INTO PRODUCT VALUES(101, 'Comb', 2345, 'January')"; if($mysqli->query($sql)){ printf("First record inserted successfully...!\n"); } $sql = "INSERT INTO PRODUCT VALUES(102, 'Coffee Mugs', 1242, 'January')"; if($mysqli->query($sql)){ printf("Second record inserted successfully...!\n"); } $sql = "INSERT INTO PRODUCT VALUES(103, 'Cutlery', 124, 'January')"; if($mysqli->query($sql)){ printf("Third record inserted successfully...!\n"); } $sql = "INSERT INTO PRODUCT VALUES(101, 'Comb', 3263, 'February')"; if($mysqli->query($sql)){ printf("Fourth record inserted successfully...!\n"); } //display the table records $sql = "SELECT * FROM PRODUCT"; if($result = $mysqli->query($sql)){ printf("Table records: \n"); while($row = mysqli_fetch_array($result)){ printf("PRODUCT_ID: %d, PRODUCT_NAME: %s, PRODUCT_COUNT: %d, MONTH: %s", $row['PRODUCT_ID'], $row['PRODUCT_NAME'], $row['PRODUCT_COUNT'], $row['MONTH']); printf("\n"); }} //let's find the sum of product $sql = "SELECT SUM(PRODUCT_COUNT), MONTH FROM PRODUCT GROUP BY MONTH WITH ROLLUP"; if($result = $mysqli->query($sql)){ printf("Sum of product: \n"); while($row = mysqli_fetch_array($result)){ printf("Sum of product: %d, MONTH: %s", $row['SUM(PRODUCT_COUNT)'], $row['MONTH']); printf("\n"); } } if($mysqli->error){ printf("Error message: ", $mysqli->error); } $mysqli->close();
輸出
獲得的輸出如下所示:
Product table created successfully....! First record inserted successfully...! Second record inserted successfully...! Third record inserted successfully...! Fourth record inserted successfully...! Table records: PRODUCT_ID: 101, PRODUCT_NAME: Comb, PRODUCT_COUNT: 2345, MONTH: January PRODUCT_ID: 102, PRODUCT_NAME: Coffee Mugs, PRODUCT_COUNT: 1242, MONTH: January PRODUCT_ID: 103, PRODUCT_NAME: Cutlery, PRODUCT_COUNT: 124, MONTH: January PRODUCT_ID: 101, PRODUCT_NAME: Comb, PRODUCT_COUNT: 3263, MONTH: February Sum of product: Sum of product: 3263, MONTH: February Sum of product: 3711, MONTH: January Sum of product: 6974, MONTH:
var mysql = require('mysql2'); var con = mysql.createConnection({ host: "localhost", user: "root", password: "Nr5a0204@123" }); // Connecting to MySQL con.connect(function (err) { if (err) throw err; console.log("Connected!"); console.log("--------------------------"); // Create a new database sql = "Create Database TUTORIALS"; con.query(sql); sql = "USE TUTORIALS"; con.query(sql); sql = "CREATE TABLE PRODUCT (PRODUCT_ID INT,PRODUCT_NAME VARCHAR(50),PRODUCT_COUNT INT,MONTH VARCHAR(20));" con.query(sql); sql = "INSERT INTO PRODUCT VALUES(101, 'Comb', 2345, 'January'),(102, 'Coffee Mugs', 1242, 'January'),(103, 'Cutlery', 124, 'January'),(101, 'Comb', 3263, 'February'),(102, 'Coffee Mugs', 10982, 'February'),(103, 'Cutlery', 435, 'February');" con.query(sql); sql = "SELECT SUM(PRODUCT_COUNT), MONTH FROM PRODUCT GROUP BY MONTH WITH ROLLUP"; con.query(sql, function(err, result){ if (err) throw err console.log(result); }); });
輸出
獲得的輸出如下所示:
Connected! -------------------------- [ { 'SUM(PRODUCT_COUNT)': '14680', MONTH: 'February' }, { 'SUM(PRODUCT_COUNT)': '3711', MONTH: 'January' }, { 'SUM(PRODUCT_COUNT)': '18391', MONTH: null } ]
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class RollUp { public static void main(String[] args) { String url = "jdbc:mysql://:3306/TUTORIALS"; String user = "root"; String password = "password"; ResultSet rs; try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection(url, user, password); Statement st = con.createStatement(); //System.out.println("Database connected successfully...!"); //create a table with name Product String sql = "CREATE TABLE PRODUCT ( PRODUCT_ID INT, PRODUCT_NAME VARCHAR(50), PRODUCT_COUNT INT, MONTH VARCHAR(20) )"; st.execute(sql); System.out.println("Product table created successfully....!"); //let's insert some records into it... String sql1 = "INSERT INTO PRODUCT VALUES(101, 'Comb', 2345, 'January'), (102, 'Coffee Mugs', 1242, 'January'), (103, 'Cutlery', 124, 'January'), (101, 'Comb', 3263, 'February')"; st.execute(sql1); System.out.println("Records inserted successfully...!"); //print table records String sql2 = "SELECT * FROM PRODUCT"; rs = st.executeQuery(sql2); System.out.println("Table records: "); while(rs.next()) { String PRODUCT_ID = rs.getString("PRODUCT_ID"); String PRODUCT_NAME = rs.getString("PRODUCT_NAME"); String PRODUCT_COUNT = rs.getString("PRODUCT_COUNT"); String MONTH = rs.getString("MONTH"); System.out.println("PRODUCT_ID: " + PRODUCT_ID + ", PRODUCT_NAME: " + PRODUCT_NAME + ", PRODUCT_COUNT: " + PRODUCT_COUNT + ", MONTH: " + MONTH); } //let's calculate the sum of product with RollUp String sql3 = "SELECT SUM(PRODUCT_COUNT), MONTH FROM PRODUCT GROUP BY MONTH WITH ROLLUP"; rs = st.executeQuery(sql3); System.out.println("Sum of product: "); while(rs.next()) { String sum = rs.getString("SUM(PRODUCT_COUNT)"); String MONTH = rs.getString("MONTH"); System.out.println("Sum: " + sum + ", MONTH: " + MONTH); } }catch(Exception e) { e.printStackTrace(); } } }
輸出
獲得的輸出如下所示:
Product table created successfully....! Records inserted successfully...! Table records: PRODUCT_ID: 101, PRODUCT_NAME: Comb, PRODUCT_COUNT: 2345, MONTH: January PRODUCT_ID: 102, PRODUCT_NAME: Coffee Mugs, PRODUCT_COUNT: 1242, MONTH: January PRODUCT_ID: 103, PRODUCT_NAME: Cutlery, PRODUCT_COUNT: 124, MONTH: January PRODUCT_ID: 101, PRODUCT_NAME: Comb, PRODUCT_COUNT: 3263, MONTH: February Sum of product: Sum: 3263, MONTH: February Sum: 3711, MONTH: January Sum: 6974, MONTH: null
import mysql.connector # Establishing the connection connection = mysql.connector.connect( host='localhost', user='root', password='password', database='tut' ) # Creating a cursor object cursorObj = connection.cursor() # providing rollup query rollup_query = """SELECT SUM(PRODUCT_COUNT), MONTH FROM PRODUCT GROUP BY MONTH WITH ROLLUP""" cursorObj.execute(rollup_query) # Fetching and printing the results results = cursorObj.fetchall() print("Rollup Results:") for row in results: print(f"Product Count: {row[0]}, MONTH: {row[1]}") # Closing the cursor and connection cursorObj.close() connection.close()
輸出
獲得的輸出如下所示:
Rollup Results: Product Count: 14680, MONTH: February Product Count: 3711, MONTH: January Product Count: 18391, MONTH: None