帶你了解現行數據庫的高級特性和新方法

數據庫的高級特性和新方法

  • 數據庫的高級操作
    • 數據庫事務
    • 用戶權限控制
    • 數據的備份與還原
    • Binlog運行日志
    • 數據庫的新特性
      • 窗口函數的使用

閱讀指南:
本文探討了數據庫的高級特性和新方法,詳細介紹了這些高級特性及其操作方式,并涵蓋了一些最新的操作方法。如果讀者感興趣,我們將會在后續的數據庫教程合集里更新更多高級操作內容,歡迎大家與我們一起學習和討論。這篇文章是本系列的最后一篇,感謝大家的閱讀和支持。
合集鏈接:
數據庫詳細基礎教程

數據庫的高級操作

數據庫事務

數據庫事務概述:

  • 數據庫事務是一套操作數據命令的有序集合,一個不可分割的工作單位。

  • 事務中單個命令不會立刻改變數據庫數據,當內部全部的命令都生效且成功時,才算一次成功,如果有任一任務失敗,可以進行狀態回滾

  • 事務喲事務開始與事務結束之間執行的全部數據庫操作組成

事務的作用:

  • 為數據庫提供了一個從失敗中恢復到正常狀態的方法
  • 當對個應用程序在并發訪問數據庫時,可以有效避免彼此的操作互相干擾

??事務的ACID特性:

  1. 原子性(Automicity)

? 原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。

  1. 一致性(Consistency)

? 一致性是指事務內部的操作的狀態前后一致,即成功則都成功,失敗則都失敗。

  1. 隔離性(Isolation)

? 隔離性是指一個事物的執行不能被其他事物干擾,即一個事物內部的操作即使用的數據對并發的其他事務是隔離的,并發實現的各個事務之間都不能相互干擾。

  1. 持久性(Durability)

? 持久性是指一個事物一旦被提交,他對數據庫中數據的改變就是永久性的,后面的操作對其不成影響。

事務的開啟,提交,回滾:

前提:

? MySQL默認情況下是自動提交事務的。

? 默認每一條語句都是一個獨立的事務,一旦成功就提交了。語句失敗報錯就回滾。

? 那要將多條語句作為一個事物,有如下方法

方法一:手動提交模式

# 開啟手動提交模式,這個模式的生命周期只在一次服務時間內,也就是說,如果關閉了sql服務,則再次打開時需要再一次開啟,最好在終端進行操作
SET AUTOCOMMIT = FALSE;
或 
SET AUTOCOMMIT = 0;# 恢復自動提交
SET AUTOCOMMIT = TRUE; 
或 
SET AUTOCOMMIT = 1;# 查看是否自動提交
SHOW VARIABLES LIKE 'AUTOCOMMIT';# 成功 —> 提交,失敗 -> 回滾COMMIT;     ROLLBACK;

方法二: 自動提交模式下開啟獨立事務

START TRANSACTION;	# 開啟獨立事務..........	# 多個sql命令COMMIT;ROLLBACK;

注:
事務只支持在update,insert,delete這類對數據產生變化的方法中,不支持刪表,刪庫那種操作。

事務的隔離性:

? 一個書屋內部的操作即使用的數據對并發的其他事物是隔離的,并發執行的各事務之間不能相互干擾

隔離級別概述臟讀不可重復讀幻讀
read-uncommitted讀未提交事務數據
read-committed讀已提交事務數據(orcle默認)×
repeatable-read可重復度(MySQL默認)××√(小概率)
aseializable串行化和序列化×××

臟讀:一個事務讀取了另一個事務未提交的數據

不可重復讀取:一個事務讀取了另一個事務所提交的修改數據,不符合數據的一致性

幻讀:一個事務讀取了另一個事務新增,刪除的記錄情況,與實際情況不同。

# 改變隔離級別
SET TRANSACTION_ISOLATION = '隔離級別';# 查看隔離級別
SELEC T@@TRANSACTION_ISOLATION;

注:

隔離等級越高,越安全,但是性能越低。

用戶權限控制

? 授予的權限可分為三個級別:數據庫級別,表級別或特定操作上。

創建用戶語法:

CREATE USER 'username' @ '服務器ip地址(%代表所有ip)' IDENTIFIED BY 'password';
# username 表示要創建的用戶的用戶名
# password 表示創建的用戶的用戶名

賦予權限語法:

# 1. 賦予全部權限
GRANT ALL PRIVIEGES ON 庫名(*代表全部).表名(*代表全部) TO 'username' @ '服務器ip地址(%代表所有ip)';
# 2.指定庫和權限
GRANT SELECT, INSERT ON 庫名.表名 TO 'username' @ '服務器ip地址(%代表所有ip)';

回收權限語法:

# 撤銷全部權限
REMOVE ALL PRIVILEGES ON database_name.* FROM 'username' @ 'IP';
# 撤銷部分權限
REMOVE SELECT, INSERT,UPDATE ON database_name.table_name FROM 'username' @ 'IP';

查看權限語法:

# 查看權限
SHOW GRANTS FOR 'username' @ 'IP';# 查看有用戶列表
SELECT User, Host FROM mysql.user;

刪除用戶語法:

# 刪除用戶
DROP USER '用戶名';

數據的備份與還原

全量備份

# 備份單庫和單表的數據
mysqldump -u username -p database_name 表名>backup.sql# 備份單庫和多表
mysqldump -u username -p database_name 表名1 表名2...>backup.sql# 備份單庫的所有表
mysqldump -u username -p database_name > backup.sql#-p如果寫密碼,必須緊貼著
# 以上命令必須在未連mysql的狀態下執行(CMD執行)

全量恢復

# 還原數據
mysql -u username -p database_name < backup.sql# 需要提前準備數據庫,導入已存在的數據庫,同時,數據庫的MySQ版本要兼容

Binlog運行日志

? Binlog日志是一個MySQL的二進制的日志記錄,里面記錄了數據庫所有的增刪改查的操作,同時也包括了操作的執行時間,所以,我們可以通過該日志查詢誤刪除數據的恢復,增量復制,主從同步等。

Binlog配置文件的地址

? 默認在:MySQL服務/my.ini

? 其中有一部分是

[mysqld]
……
datadir = MySQL服務/Data    # 默認的存儲詳細Binlog的二進制文件地址
……
log-bin = Binlog的文件名	# 此處Binlog的文件名默認是以電腦名稱命名,可以修改

對日志的操作(以下操作在 SQLyog 中使用):

示例:

# 清空原有日志文件
RESET MASTER;# 準備數據,插入數據 --> 00000001日志文件
CREATE DATABASE text_binlog;
USE text_binlog;
CREATE TABLE table_binlog(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL
);
INSERT INTO table_binlog (NAME) VALUES ('二狗子'),('驢蛋蛋');# 重啟一個新的日志文件 --> 00000002日志文件
FLUSH LOGS;		# 創建一個新日志# 將刪除數據和插入數據植入到第二個日志文件中-->00000002日志文件
DELETE FROM table_binlog WHERE id = 2;	  # 刪除驢蛋蛋
INSERT INTO table_binlog(NAME) VALUES('狗剩子');
SELEC *FROM table_binlog;# 查看日志文件目錄
SHOW BINARY LOGS;# 查蘭某個日志的命令清單
# 語法:
SHOW BINARY EVENTS;		查看第一個日志的清單
SHOW BINARY EVENTS IN '清單名' [FROM pos(具體信息位置) LIMIT OFSET, NUMBER]0; 
# 實例:
SHOW BINARY EVENTS IN 'MY_LOGIN.00000002' FROM 391 LIMIT 1, 3;

CMD下的日志操作:

注:在binlog的文件目錄下進行cmd

# 跳過步驟找回數據
mysqlbinlog my-logbin.000001> d:/my_binlog.000001.sql # 將其他的日志完整導出
mysqlbinlog --stop-POSITION=刪除命令的開始的pos my-logbin.000002> d:/my_binlog.391.sql # 02日志刪除之前
mysqlbinlog --start-POSITION=刪除命令的下一個命令開始pos my-logbin.000002> d:/my_binlog.441.sql # 02日志刪除之后

數據庫的新特性

窗口函數的使用

窗口函數:

  • 序號函數: row_number()

  • 序號函數: rank()

  • 序號函數: dense_rank()

  • 分步函數: PERCENT_RANK()

    (rank - 1) 1 / (rows - 1)

  • 前后函數: LAG(expr,n)

    LAG(expr,n)函數返回當前行的前n行的expr的值。

  • 首尾函數: FIRST_VALUE(expr)

    FIRST_VALUE(expr)函數返回第一個expr的值。

示例:

數據的準備

CREATE TABLE goods(id INT PRIMARY KEY AUTO_INCREMENT,category_id INT,category VARCHAR(15),NAME VARCHAR(30),price DECIMAL(10,2),stock INT,upper_time DATETIME
);INSERT INTO goods(category_id,category,NAME,price,stock,upper_time)
VALUES
(1, '女裝/女士精品', 'T恤', 39.90, 1000, '2020-11-10 00:00:00'),
(1, '女裝/女士精品', '連衣裙', 79.90, 2500, '2020-11-10 00:00:00'),
(1, '女裝/女士精品', '衛衣', 89.90, 1500, '2020-11-10 00:00:00'),
(1, '女裝/女士精品', '牛仔褲', 89.90, 3500, '2020-11-10 00:00:00'),
(1, '女裝/女士精品', '百褶裙', 29.90, 500, '2020-11-10 00:00:00'),
(1, '女裝/女士精品', '呢絨外套', 399.90, 1200, '2020-11-10 00:00:00'),
(2, '戶外運動', '自行車', 399.90, 1000, '2020-11-10 00:00:00'),
(2, '戶外運動', '山地自行車', 1399.90, 2500, '2020-11-10 00:00:00'),
(2, '戶外運動', '登山杖', 59.90, 1500, '2020-11-10 00:00:00'),
(2, '戶外運動', '騎行裝備', 399.90, 3500, '2020-11-10 00:00:00'),
(2, '戶外運動', '運動外套', 799.90, 500, '2020-11-10 00:00:00'),
(2, '戶外運動', '滑板', 499.90, 1200, '2020-11-10 00:00:00');

使用聚合函數的方式

# 聚合函數也是窗口函數 [理解]
# 查詢所有的商品編號,價格,和類別名以及整體平均價格SELECT id , NAME ,price, category , AVG(price) OVER () FROM goods;SELECT id , NAME , price , category , AVG(price) OVER() FROM goods ;# 查詢所有的商品編號,價格,和類別名以及類別平均價格
SELECT id , NAME ,price, category , AVG(price) OVER (PARTITION BY category) FROM goods;SELECT id , NAME , price , category , AVG(price) OVER(PARTITION BY category_id) FROM goods ;

使用窗口函數:

# 查詢 goods 數據表中每個商品分類下價格降序排列的各個商品信息。
SELECT ROW_NUMBER() OVER(PARTITION BY category ORDER BY price DESC) AS num,id , category , NAME ,price FROM goods;SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num, id,category_id, category, NAME, price, stock FROM goods;
# 窗口函數 over (partition by 分組 order by 排序 )# 查詢 goods 數據表中每個商品分類下價格最高的3種商品信息。
SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num, 
id, category_id, category, NAME, price, stock FROM goods) tWHERE row_num <= 3;# 使用RANK()函數獲取 goods 數據表中各類別的價格從高到低排序的各商品信息。
SELECT RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,id, category_id, category, NAME, price, stockFROM goods;# 使用RANK()函數獲取 goods 數據表中類別為“女裝/女士精品”的價格最高的4款商品信息SELECT * FROM(SELECT RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,id, category_id, category, NAME, price, stockFROM goods) tWHERE category_id = 1 AND row_num <= 4;# 使用DENSE_RANK()函數獲取 goods 數據表中各類別的價格從高到低排序的各商品信息。
SELECT DENSE_RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num, id, category_id, category, NAME, price, stock  FROM goods;# 使用DENSE_RANK()函數獲取 goods 數據表中類別為“女裝/女士精品”的價格最高的4款商品信息。
SELECT * FROM( SELECT DENSE_RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,  id, category_id, category, NAME, price, stock FROM goods) t WHERE category_id = 1 AND row_num <= 3;# 計算 goods 數據表中名稱為“女裝/女士精品”的類別下的商品的PERCENT_RANK值。
# 寫法一:
SELECT RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS r,PERCENT_RANK() 
OVER (PARTITION BY category_id ORDER BY price DESC) AS pr,id, category_id, category, 
NAME, price, stock FROM goods WHERE category_id = 1;# 寫法二:
SELECT RANK() OVER w AS r,PERCENT_RANK() OVER w AS pr,id, category_id, category, NAME, price, stockFROM goodsWHERE category_id = 1 WINDOW w AS (PARTITION BY category_id ORDER BY price DESC);# 查詢goods數據表中前一個商品價格與當前商品價格的差值。
SELECT id, category, NAME, price, pre_price, price - pre_price AS diff_priceFROM (SELECT  id, category, NAME, price,LAG(price,1) OVER w AS pre_price FROM goodsWINDOW w AS (PARTITION BY category_id ORDER BY price)) t;# 按照價格排序,查詢第1個商品的價格信息。
SELECT id, category, NAME, price, stock,FIRST_VALUE(price) OVER w AS first_priceFROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36238.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36238.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

客戶案例|某 SaaS 企業租戶敏感數據保護實踐

近年來&#xff0c;隨著云計算技術的快速發展&#xff0c;軟件即服務&#xff08;SaaS&#xff09;在各行業的應用逐漸增多&#xff0c;SaaS 應用給企業數字化發展帶來了便捷性、成本效益與可訪問性&#xff0c;同時也帶來了一系列數據安全風險。作為 SaaS 產品運營服務商&…

韓國鋰電池工廠火災:行業安全警鐘再次敲響

三天前&#xff0c;6月24日上午&#xff0c;韓國京畿道華城市一電池廠突發火災&#xff0c;造成嚴重人員傷亡&#xff0c;其中包括多名中國籍員工。這一事件不僅令人痛心&#xff0c;更為全球鋰電池行業安全敲響了警鐘。 事發當天&#xff0c;電池廠內堆放鋰電池成品的區域突然…

TypeError: %c requires int or char

踩坑&#xff1a;在用python寫腳本查詢sql數據時&#xff0c;使用%s來替換sql語句里的變量&#xff0c;結果一直報&#xff0c;而其他sql使用同樣的方法正常&#xff0c;最后發現是因為sql語句里有模糊查詢 like "%測試%"&#xff0c;這里的%被誤以為%s&#xff0c;解…

Mendix 創客訪談錄|Mendix開發制造業客戶復雜應用的強大實力

本期創客 鄭立 Eviden中國低代碼服務團隊負責人 大家好&#xff0c;我是鄭立&#xff0c;目前擔任Eviden中國低代碼服務團隊的負責人&#xff0c;Mendix是Eviden中國在低代碼領域的最重要的合作伙伴&#xff0c;目前我們在多個制造業客戶中推廣和實施Mendix低代碼項目&#xff…

[MQTT]Mosquitto的權限管理_使用者/密碼(pwfile)和訪問控制清單(aclfile)

延續Mosquitto的內網連接(intranet)和使用者/密碼權限設置文章&#xff0c;經解讀mosquitto官網文檔&#xff0c;在權限管理部分&#xff0c;除了設置使用者/密碼(pwfile)之外&#xff0c;還有訪問控制清單(Access Control List, aclfile)可以設置。經過測試&#xff0c;同時設…

Linux 中變量的取用與設定

優質博文&#xff1a;IT-BLOG-CN Linux是一個多人多任務的環境&#xff0c;每個人登錄系統都能取得一個bash shell&#xff0c;每個人都能夠使用bash下達mail這個指令來接收自己的郵箱等等。問題是&#xff0c;bash如何得知你的郵箱是那個文件&#xff1f;這就需要『變量』的幫…

【ubuntu noble】docker 容器無法使用 nvidia gpu

運行ai模型的時候提示 no GPU available 執行 nvidia-smi 提示 Failed to initialize NVML: Unknown Error 解決方案 一. 宿主機執行sudo docker info&#xff0c;確保 runtime 字段中有 nvidia 字樣 Runtimes: nvidia runc io.containerd.runc.v2 Default Runtime: runc 注…

從0開始學習pyspark--pyspark的核心概念[第0節]

在學習 PySpark時會遇到很多新的關鍵詞,理解這些概念,對我們學習PySpark有極大的幫助,以下是一些PySpark的關鍵概念及其詳細解釋&#xff1a; 1. PySpark PySpark是Apache Spark的Python API。Spark是一個用于大規模數據處理的開源分布式計算系統&#xff0c;支持內存計算和基…

基于Java的寵物領養管理系統【附源碼】

摘 要 近些年來&#xff0c;隨著科技的飛速發展&#xff0c;互聯網的普及逐漸延伸到各行各業中&#xff0c;給人們生活帶來了十分的便利&#xff0c;寵物管理系統利用計算機網絡實現信息化管理&#xff0c;使整個寵物領養的發展和服務水平有顯著提升。 本文擬采用IDEA開發工具…

《分析模式》漫談07-怎樣把一張圖從不嚴謹改到嚴謹

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 下圖是《分析模式》原書第2章的圖2.10&#xff0c;里面有一些錯誤和考慮不周的地方&#xff1a; 2004中譯本和2020中譯本的翻譯如下&#xff1a; 基本上都是照搬&#xff0c;沒有改過…

【02-02】SpringMVC基于注解的應用

一、請求處理 1、常用注解 RequestMapping 作用&#xff1a;用來匹配客戶端發送的請求&#xff08;用來處理URL映射&#xff0c;將請求映射到處理方法中&#xff09;&#xff0c;可以在類或者方法上使用。 用在類上&#xff0c;可以將請求模塊化&#xff0c;避免請求方法中的…

【Java Web】三大域對象

目錄 一、域對象概述 二、三大域對象 三、域對象使用相關API 一、域對象概述 一些可用于存儲數據和傳遞數據的對象被稱為域對象&#xff0c;根據傳遞數據范圍的不同&#xff0c;我們稱之為不同的域&#xff0c;不同的域對象代表不同的域&#xff0c;共享數據的范圍也不同。 二、…

【小紅書標題打造】規則+底層邏輯解析|輔助工具|爆款必備

前言 大家好&#xff0c;我是一名自媒體工具人&#xff0c;今天不是教大家去自己寫標題&#xff08;現在這個時代自己寫真沒必要&#xff09;而是教大家了解爆款標題的相關知識以及辨別。后面會附贈 安裝此文規則生成標題的輸出工具。在這個工具發展龐大的時代&#xff0c;如果…

【知識圖譜系列】一步步指導:安裝與配置JDK和Neo4j的完美搭配

本文將提供詳細的步驟&#xff0c;介紹如何下載、安裝和配置Java開發工具包&#xff08;JDK&#xff09;以及流行的圖形數據庫Neo4j。將從選擇合適的JDK版本開始&#xff0c;然后是下載和配置環境變量&#xff0c;接著以同樣的方式處理Neo4j。最后&#xff0c;會通過一些檢查步…

Windows應急響應靶機 - Web3

一、靶機介紹 應急響應靶機訓練-Web3 前景需要&#xff1a;小苕在省護值守中&#xff0c;在靈機一動情況下把設備停掉了&#xff0c;甲方問&#xff1a;為什么要停設備&#xff1f;小苕說&#xff1a;我第六感告訴我&#xff0c;這機器可能被黑了。 這是他的服務器&#xff…

【CSS in Depth 2 精譯】1.6 本章小結

1.6 本章小結 瀏覽器遵循層疊規則來確定哪些樣式在哪些元素上生效&#xff1b;選擇器優先級由選擇器中的 id 數、class 類的個數以及標簽名的個數來共同確定。優先級更高的聲明將覆蓋較低聲明&#xff1b;當某些屬性沒有層疊值時&#xff0c;它們會從父元素繼承一個樣式值。這…

YouCompleteMe插件安裝方法簡述

一、前言 YouCompleteMe是VIM中進行C/C 開發的重要工具&#xff0c;可以極大提升linux下C/C開發效率。 YCM需要高版本的gcc (8.0以上版本&#xff0c;支持C17) 和 vim&#xff08;8.0以上&#xff0c;支持python3.6以上&#xff09; 二、編譯gcc_8.3 1. 獲取源碼 wget https:…

Shopee API接口——獲取商家店鋪商品列表

一、引言 在跨境電商領域&#xff0c;Shopee作為東南亞地區領先的電商平臺&#xff0c;為眾多商家提供了廣闊的市場和豐富的銷售機會。本文將詳細介紹如何通過Shopee API獲取商家店鋪商品列表&#xff0c;并探討其應用場景。 二、核心功能介紹 Shopee API獲取商家店鋪商品列…

HarmonyOS NEXT Developer Beta1中的Kit

從HarmonyOS NEXT Developer Preview1&#xff08;API 11&#xff09;版本開始&#xff0c;HarmonyOS SDK以Kit維度提供豐富、完備的開放能力&#xff0c;涵蓋應用框架、系統、媒體、圖形、應用服務、AI六大領域&#xff0c;例如&#xff1a; 應用框架相關Kit開放能力&#xff…

轉行大數據開發:知識、能力及學習路線詳解

引言 隨著數據量的爆炸性增長&#xff0c;大數據開發已經成為IT行業中的熱門職業。對于希望轉行進入大數據開發領域的專業人士來說&#xff0c;了解需要掌握的知識和技能&#xff0c;并制定清晰的學習路線至關重要。本文將詳細解析轉行大數據開發所需的知識體系、能力要求及學…