項目代碼第8講【數據庫基礎知識】:SQL(DDL、DML、DQL、DCL);函數(聚合、字符串、數值、日期、流程);約束;多表查詢;事務

黑馬程序員 MySQL數據庫入門到精通,從mysql安裝到mysql高級、mysql優化全囊括_嗶哩嗶哩_bilibili

一、數據庫相關概念

1、主流的關系型數據庫都支持SQL語言——SQL語言可以操作所有的關系型數據庫

????????像MySQL、Oracle Database、Microsoft SQL Server、IBM Db2等主流的關系型數據庫系統都支持SQL,并將其作為主要的查詢和數據操作語言。這些系統實現了SQL標準的大部分功能,但也添加了各自的擴展和特性。

????????基礎的SELECT、INSERT、UPDATE、DELETE等操作在大多數情況下是兼容的,但在涉及更復雜的查詢或需要利用特定數據庫特性的場合時,就需要針對具體數據庫調整SQL代碼了。【比如二、3、6>分頁查詢,不同關系型數據庫用的不一樣】

2、什么是 關系型數據庫(RDBMS)?

反之,則稱之為“非關系型數據庫”。

二、SQL語句的分類——DDL、DML、DQL、DCL

下圖中,注意SQL語句不區分大小寫,關鍵字建議使用大寫

? ? ? ? 當使用引號時,使用單引號。

1、DDL

1>數據庫操作

?上圖中,“查詢當前數據庫”是結合“使用”的。“查詢當前數據庫”——就是看當前處于哪個數據庫。

2>表操作——針對表+字段(即列名)

下圖中,在對某個數據庫進行操作時,要先通過上圖的“使用”命令進入該數據庫。

?

1》數據類型【略】:數值類型、字符串類型、日期時間類型
2》針對表——添加&修改&刪除

下圖中,TRUNCATE是只留下了表的結構,里面的數據都沒有了

3》針對每個字段——添加&修改&刪除

2、DML:對表中內容的增(INSERT)刪(DELETE)改(UPDATE)

1>選擇MySQL圖形化界面

下載DataGrip,其功能比前兩種都要強大。

DataGrip的基本操作,見下述鏈接:

11. 基礎-SQL-圖形化界面工具DataGrip_嗶哩嗶哩_bilibili

2>增(INSERT)——插入指定字段/全部字段;批量添加數據

? ? ? ? 下圖中,引號是單引號。

3>改(UPDATE)

4>刪(DELETE)

3、DQL:查詢表中內容(SELECT);及其執行順序!

下圖中,講解分組查詢前需要先講聚合函數

驗證上圖右邊的執行順序:

先執行FROM:如下圖,在FROM后給表加別名,發現其它地方都可以用

WHERE在SELECT之前:如下圖,在SELECT后面給e.age取別名eage,想在WHERE后面使用eage卻報錯。證明WHERE的執行順序在SELECT之前!

SELECT在ORDER BY之前:如下圖,在SELECT后面給e.age取別名eage,可以在ORDER BY后面使用eage。

1>基本查詢

2>條件查詢(WHERE)

注意區別OR和IN,如下圖:

上圖中紅色字體部分“不能省略!”,解釋如下圖:

3>聚合函數【講“分組查詢”前得先講聚合函數】:是作用于某一列的,注意NULL值不參與所有聚合函數運算

比如select count(*) from emp; 答案=16,即一共有16行數據。

然而,如果select count(idcard) from emp; 如果idcard有一行的數據為null,那么答案=15。【NULL值不參與所有聚合函數運算】

4>分組查詢(GROUP BY)

上圖中,“分組之后,查詢的字段一般為聚合函數和分組字段,查詢其他字段無任何意義。”

? ? ? ? 比如下圖的1.,如果加個name字段,是沒有任何意義的。只是顯示了性別是"女"的第一行數據的女生姓名。如下下圖。

5>排序查詢(ORDER BY)

6>分頁查詢(數據庫方言,MySQL中是LIMIT)

下圖中,“查詢記錄數”就是“每頁顯示記錄數”

下圖中,起始索引=(2-1)*10=10;“查詢記錄數”就是“每頁顯示記錄數”=10.

????????emp表里一共16行數據,所以第二頁只顯示6行數據。

舉例:查詢前5個員工

4、DCL:管理數據庫 用戶、控制數據庫的訪問 權限

1>管理用戶

mysql數據庫如下,里面有個user表存儲著使用的用戶。

舉例:

2>權限控制

三、函數

1、聚合函數【見二、3、3>】

2、字符串函數

3、數值函數

4、日期函數

5、流程函數

四、約束:作用于表中字段上的規則,在創建/修改表的時候添加約束

1、概述

2、舉例

在上圖創建完表后,插入下圖的兩條數據,不用指定id字段

如下圖所示,id字段會自增

3、外鍵約束:外鍵用來讓兩張表的數據之間建立連接,從而保證數據的一致性和完整性

1>外鍵關聯到另一個表中的字段,被引用的列需要保證其值的 唯一性和非空性

這意味著,被引用的列是 主鍵(Primary Key)唯一約束(Unique Constraint)+ 非空

????????唯一約束允許列包含空值(除非在定義約束時明確指定了不允許空值)。因此,在確保非空性的前提下,具有唯一約束的列也可以被外鍵引用。

在上圖中,如果在父表dept中刪除了id=1的部門,對子表emp沒有任何影響。這違背了數據的一致性和完整性。

創建表后添加外鍵

現在如果要在父表dept中刪除了id=1的部門,那么會報錯

2>外鍵刪除更新行為【級聯操作等】

1》舉例CASCADE

2》舉例SET NULL

五、多表查詢

1、多表關系:一對多(多對一)、多對多、一對一

3>一對一:多用于單表拆分

拆分上圖中的表為兩張表,如下圖

增加外鍵,關聯兩張表。如下圖

? ? ? ? 注意要設置外鍵為唯一的。如下下圖。

2、多表查詢概述:需要消除掉無效的笛卡爾積【常為表取別名:在FROM后面取(因為執行DQL順序是先執行FROM)】

需要消除掉無效的笛卡爾積,只顯示有用的數據

3、多表查詢分類:連接查詢【內、外(左/右)、自連接】、子查詢

1>內連接(隱式、顯式):查詢兩張表交集的部分

2>外連接(左外、右外):誰取名就以誰為主

3>自連接:自己連接自己

舉例:

把上圖看作下圖兩張表

4、聯合查詢(union , union all):把多次查詢的結果合并起來,形成一個新的查詢結果集

5、子查詢(嵌套查詢):SQL語句中嵌套SELECT語句

1>標量子查詢

2>列子查詢

3>行子態詢

4>表子查詢

六、事務

1、事務:一組操作的集合,它是一個不可分割的工作單位(這些操作要么同時成功,要么同時失敗)

2、事務操作

下面左/右兩圖作用一樣的。

在左圖中,SELECT @@autocommit;

????????如果結果=1,則是自動提交事務;如果結果=0,則是手動提交事務,需要執行commit;

?

3、事務四大特性(ACID):原子性(A)、一致性(C)、隔離性(I)、持久性(D)

持久性:一旦事務提交,數據就會永久地存儲在磁盤中,如下圖

4、并發事務問題:臟讀、不可重復讀、幻讀

1>臟讀

在下圖中,事務A要執行3個操作。事務A在第二個操作時把id的值更新了,但是此時事務A還沒有提交。事務B卻拿到了更新后的id的值。這種情況稱為”臟讀“。

1》問題分析

這屬于典型的“臟讀”問題。

如果事務 A 后續回滾(Rollback),那么事務 B 讀取到的數據實際上是無效的,導致數據不一致。

2》如何避免

提高事務隔離級別到 READ COMMITTED(讀已提交)?或更高。

  • READ COMMITTED:確保事務只能讀取已提交的數據,避免臟讀。

2>不可重復讀

在下圖中,事務A要執行4個操作。事務A執行第一個操作時,沒有找到id=1。此后,事務B向數據庫提交了id=1的更新。然后,事務A的第三個操作就讀到了更新后的id數據。這種情況稱為”不可重復讀“。

1》問題分析

這屬于“不可重復讀”問題。

事務 A 在同一個事務中對同一條數據的兩次查詢結果不一致,可能導致業務邏輯錯誤

2》如何避免

提高事務隔離級別到 REPEATABLE READ(可重復讀) 或更高。

  • REPEATABLE READ:在同一事務中,多次讀取同一數據時,保證結果一致。即確保事務內多次讀取結果一致。
  • 不過,在某些數據庫(如 MySQL 的 InnoDB 引擎)中,即使在 REPEATABLE READ 隔離級別下,仍可能出現幻讀問題。

3>幻讀

在下圖中,事務A 執行 id=1(insert)時,由于事務B已經插入了id=1(id是主鍵),那么這句話就會報錯。此時在事務A中再次執行id=1(select),會發現id=1這個主鍵又在了。

1》問題分析

這屬于“幻讀”問題。

幻讀通常發生在范圍查詢中(例如 SELECT * FROM table WHERE id > 10),但由于主鍵沖突的存在,這種現象也可以被歸類為幻讀的一種表現形式。

2》如何避免

提高事務隔離級別到 SERIALIZABLE(串行化)。

  • SERIALIZABLE:最高隔離級別,完全避免臟讀、不可重復讀和幻讀。
  • 代價是性能下降,因為事務之間會被串行化執行。

5、事務隔離級別——分析原因見4、

下圖中,?代表允許。

????????SERIALIZABLE(串行化)隔離級別最高,性能卻最差。

舉例:

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

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

相關文章

如何在阿里云linux主機上部署Node.Js

在阿里云的Linux服務器上搭建Node.js編程環境可以通過以下步驟完成。這里以常見的 Ubuntu/CentOS 系統為例,提供兩種安裝方式(包管理器、NVM多版本管理): 一、通過包管理器安裝(適合快速安裝指定版本) 1. …

Python爬蟲:開啟數據抓取的奇幻之旅(一)

目錄 一、爬蟲初印象:揭開神秘面紗? 二、工欲善其事:前期準備? (一)Python 環境搭建? 1.下載 Python 安裝包:? 2.運行安裝程序:? 3.配置環境變量(若自動添加失敗)&#x…

機器學習——集成學習框架(GBDT、XGBoost、LightGBM、CatBoost)、調參方法

一、集成學習框架 對訓練樣本較少的結構化數據領域,Boosting算法仍然是常用項 XGBoost、CatBoost和LightGBM都是以決策樹為基礎的集成學習框架 三個學習框架的發展是:XGBoost是在GBDT的基礎上優化而來,CatBoost和LightGBM是在XGBoost的基礎上…

第十五章:Python的Pandas庫詳解及常見用法

在數據分析領域,Python的Pandas庫是一個不可或缺的工具。它提供了高效的數據結構和數據分析工具,使得數據處理變得簡單而直觀。本文將詳細介紹Pandas庫的基本功能、常見用法,并通過示例代碼演示如何使用Pandas進行數據處理。最后,…

【Python桌面應用】PySide6 界面開發完全指南

文章目錄 1. 引言2. PySide6 簡介與安裝2.1 什么是PySide62.2 PySide6 vs. PyQt62.3 安裝PySide62.4 開發環境配置建議 3. Qt 設計原理3.1 Qt對象模型3.2 信號與槽機制3.3 Qt坐標系統3.4 Qt樣式表(QSS) 4. 創建第一個應用4.1 基本應用結構4.2 主窗口與應用生命周期4.3 使用面向…

用 pytorch 從零開始創建大語言模型(三):編碼注意力機制

從零開始創建大語言模型(Python/pytorch )(三):編碼注意力機制 3 編碼注意力機制3.1 建模長序列的問題3.2 使用注意力機制捕捉數據依賴關系3.3 通過自注意力關注輸入的不同部分3.3.1 一個沒有可訓練權重的簡化自注意力…

Spring中的IOC及AOP概述

前言 Spring 框架的兩大核心設計思想是 IOC(控制反轉) 和 AOP(面向切面編程)。它們共同解決了代碼耦合度高、重復邏輯冗余等問題。 IOC(控制反轉) 1.核心概念 控制反轉(Inversion of Control…

STM32_HAL開發環境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安裝Keil(MDK-ARM)【集成開發環境IDE】 我們會在Keil(MDK-ARM)上去編寫代碼、編譯代碼、燒寫代碼、調試代碼。 Keil(MDK-ARM)的安裝方法: 教學視頻的第02分03秒開始看。 安裝過程中請修改一下下面兩個路徑,避免占用C盤空間。 Core就是Keil(MDK-ARM)的…

python 第三方庫 - dotenv讀取配置文件

.env 文件是一種用于存儲環境變量的配置文件,常用于項目的運行環境設置。環境變量是操作系統層面的一些變量,它們可以被應用程序訪問和使用,通常包含敏感信息或特定于環境的配置,如數據庫連接信息、API 密鑰、調試模式等。 安裝p…

用python壓縮圖片大小

下載庫 cmd開命令或者PyCharm執行都行 pip install pillow2. 然后就是代碼 from PIL import Imagedef compress_image(input_path, output_path, quality85, max_sizeNone):"""壓縮圖片大小。參數:- input_path: 輸入圖片路徑- output_path: 輸出圖片路徑- qu…

【自用記錄】本地關聯GitHub以及遇到的問題

最近終于又想起GitHub,想上傳代碼和項目到倉庫里。 由于很早之前有在本地連接過GitHub(但沒怎么用),現在需要重新搞起(操作忘得差不多)。 在看教程實操的過程中遇到了一些小問題,遂記錄一下。 前…

在一個scss文件中定義變量,在另一個scss文件中使用

_variables.scss文件 : $line-gradient-init-color: linear-gradient(90deg, #8057ff 0%, #936bff 50%, #b892ff 100%); $line-gradient-hover-color: linear-gradient(90deg, #936bff 0%, #b892ff 50%, #f781ce 100%); $line-gradient-active-color: linear-gradient(90deg, …

從零開始研發GPS接收機連載——19、自制GPS接收機的春運之旅

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 從零開始研發GPS接收機連載——19、自制GPS接收機的春運之旅 許久未曾更新這個系列,并非我平日里對這事兒沒了興致,不再愿意折騰。實則是受限于自身條…

智能駕駛功能LCC車道保持居中

畫龍現象就是LCC常見bug LDW車道偏離預警 LKA車道保持 聲音其實就是蜂鳴器 有些車是40 有些是60

Java全棧面試寶典:線程機制與Spring依賴注入深度解析

目錄 一、Java線程核心機制 🔥 問題3:start()與run()的底層執行差異 線程啟動流程圖解 核心差異對照表 代碼驗證示例 🔥 問題4:Thread與Runnable的六大維度對比 類關系UML圖 最佳實踐代碼 🔥 問題5&#xff1…

使用ANTLR4解析Yaml,JSON和Latex

文章目錄 ANTLR4基本使用**1. 安裝 Java 運行時(必需)****2. 安裝 ANTLR4 命令行工具****方法一:通過包管理器(推薦)****macOS/Linux (Homebrew)****Windows (Chocolatey)** **方法二:手動安裝(…

NixVis 開源輕量級 Nginx 日志分析工具

NixVis NixVis 是一款基于 Go 語言開發的、開源輕量級 Nginx 日志分析工具,專為自部署場景設計。它提供直觀的數據可視化和全面的統計分析功能,幫助您實時監控網站流量、訪問來源和地理分布等關鍵指標,無需復雜配置即可快速部署使用。 演示…

黑盒測試的等價類劃分法(輸入數據劃分為有效的等價類和無效的等價類)

重點: 有效等價和單個無效等價各取1個即可 1、正向用例:一條盡可能覆蓋多條2、逆向用例:每一條數據,都是一條單獨用例。 步驟: 1、明確需求 2、確定有效和無效等價 3、根據有效和無效造數據編寫用例 3、適用場景 針對:需要有大量數據測試輸入, …

Linux Mem -- 通過reserved-memory縮減內存

目錄 1. reserved-memory縮減內存 2. 為什么要通過2段512GB預留內存實現該縮減呢? 3. reserved-momery中的no-map屬性 4. 預留的的內存是否會被統計到系統MemTotal中? 本文是解決具體的一些思考總結,和Linux內核的reserved-memory機制相關…

多線程—synchronized原理

上篇文章: 多線程—鎖策略https://blog.csdn.net/sniper_fandc/article/details/146508232?fromshareblogdetail&sharetypeblogdetail&sharerId146508232&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目錄 1 synchronized的鎖…