MySQL操作進階

系列文章目錄

MySQL的基礎操作-CSDN博客


目錄

系列文章目錄

前言

一、數據庫的約束

1. 約束類型:not null

2. 約束類型:unique

3. 約束類型:default

4. 約束類型:primary key

5. 約束條件:foreign key

二、表的設計

1. 一對一

2. 一對多

3. 多對多

三、查詢操作進階

1. 插入搭配查詢

2. 聚合查詢

1. sql 中的聚合函數

2. group by

3. 聯合查詢

1. 內連接

2. 外連接

3. 自連接?

4. 子查詢

5. 合并查詢


前言

本文介紹了MySQL數據庫的基礎操作,主要包括三個方面內容:數據庫約束、表設計和查詢操作進階。數據庫約束部分詳細講解了NOT NULL、UNIQUE、DEFAULT、PRIMARY KEY和FOREIGN KEY五種約束類型的作用和使用方法。表設計部分闡述了如何根據需求場景設計表結構,重點分析了一對一、一對多和多對多三種關系的實現方式。查詢操作進階部分介紹了聚合查詢、分組查詢、聯合查詢(內連接、外連接、自連接)、子查詢和合并查詢等高級查詢技巧,特別強調了在數據量大時聯合查詢可能帶來的性能問題。全文通過大量SQL示例代碼,系統性地講解了MySQL數據庫的基礎操作知識。


一、數據庫的約束

數據庫的約束:數據庫自動對數據的合法性進行校驗檢查的一系列機制;

目的:保證數據庫中避免被插入或修改一些非法數據;

1. 約束類型:not null

?not null:指示某列不能存儲 null 值;

create table 表名 (列名 not null, 列名...);

2. 約束類型:unique

unique:保證某列的每行必須有唯一的值;

create table 表名 (列名 unique, 列名...);

unique 約束會讓后續插入數據,修改數據的時候都先觸發一次查詢操作,通過這個查詢操作來確認當前這個記錄是否已經存在;

3. 約束類型:default

?default:規定沒有給列賦值時的默認值;

create table 表名 (列名 default "默認值", 列名...);

?default 主要應用于指定列插入,未被指定的列會使用默認值;

4. 約束類型:primary key

primary key:not null 和 unique 的結合,確保某列有唯一標識,有助于快速查詢到表中的特定記錄;

create table 表名 (列名 primary key, 列名...);

primary key 最重要的約束,是一行數據記錄的身份標識;

一張表里面只能有一個 primary key;一張表里的記錄,只能有一個作為身份標識的數據;

對于帶有主鍵的表,每次插入修改數據也會涉及到進行先查詢的操作;

mysql 會把帶有 primary key 和 unique 的列自動生成索引,從而加快查詢速度;

保證主鍵唯一的方式:自增主鍵

不手動指定主鍵值,由數據庫和服務器自動分配,服務器會從 1 開始,依次遞增分配主鍵的值;

  • 插入數據時,可以將設置為自增主鍵的列設置為 null,表示由服務器自動分配;
  • 插入數據時,也可以手動指定主鍵的值;
  • 手動指定主鍵值插入后,再插入下一個數據,如果不手動指定,主鍵就從當前主鍵的最大值加 1 開始,向后分配;

如果是分布式系統,如何保證生成的主鍵唯一?

  • 1. 如果插入數據的速度比較慢,通常是通過時間戳,就能保證生成的主鍵唯一;
  • 2. 如果插入數據速度很塊,就需要時間戳拼接機房編號/主機編號,落在不同主機上的數據也能保證主鍵唯一;
  • 3. 如果數據是插入到同一臺機器上,還需要在上述基礎上拼接一個隨機因子,保證插入數據的主鍵唯一;

5. 約束條件:foreign key

foreign key:保證表中的數據匹配另一個表中的值的參照完整性;

create table 表名2(列名1,列名2..., foreign key (列名1) references 表名2(列名1));

描述了兩個表之間的關聯關系,用于約束的表叫做父表(表名2),被約束的表叫做子表(表名1);?

插入數據時,服務器會先觸發一次查詢操作,查看被外鍵約束的列的值是否在父表對應的列中存在;

父表對子表的約束要注意:

  • 1. 子表中插入或者修改數據時,被約束的列的值要在父表對應的列中存在;
  • 2. 父表中刪除數據時,要保證該數據沒有在子表中用到;
  • 3. 即使子表為空,也不能刪除父表,因為新插入數據時還需要參考父表;
  • 4. 指定外鍵約束的時候,要求父表被關聯的這一列得是主鍵或者 unique;

注意事項:

數據庫引入約束之后,執行效率就會受到影響,就可能會降低很多;

二、表的設計

表的設計思路:

根據實際的需求場景,明確當前要創建幾個表,每個表都有哪些列,這些表之間是否存在一定的聯系。

1. 梳理好需求中的實體;

2. 再確定好實體間的關系(一對一,一對多,多對多);

1. 一對一

例如:一用戶只能擁有一個賬號;一個賬號也只能被一個用戶擁有;

-- 一個用戶只能擁有一個賬號
user(userId, name, acountId);-- 一個賬戶也只能被一個用戶擁有
acount(acountId, username, password, userId);

2. 一對多

例如:一個用戶只能在一個地區;一個地區,可以包含多個用戶;

-- 一個用戶只能有一個地區
user(userId, username, address);-- 一個地區可以有多個用戶
address(addressId, addressName);

3. 多對多

?一個用戶可以選擇多個游戲,一個游戲可以有多個用戶;

-- 一個用戶可以參與多個游戲
user(userId, username);-- 一個游戲可以有多個用戶
game(gameId, gameName);-- 借助關聯表表示
user_game(userId, gameId);

三、查詢操作進階

1. 插入搭配查詢

把查詢語句的結果,作為插入的數值;

-- 插入搭配查詢
insert into 表1 select * from 表2;

要求查詢出來的結果集合,列數和類型要和要插入的表匹配;

2. 聚合查詢

表達式查詢是針對列和列之間運算;

聚合查詢是針對行和行之間運算;

1. sql 中的聚合函數

1. count:查詢出來的結果集的行數;

-- 查詢總的行數
select count(*) from 表名;-- 查詢有多少列不為空的行數
select count(列名) from 表名;-- 查詢列不重復的行數
select count(distinct 列名) from 表名;

count 里面填寫的是 *,表示查詢的是總的行數;

如果 count 里面填寫的是列名,遇到空行就不統計了;

同時 count 里面可以填寫 distinct 和列名,統計不重復的行數;??

count 在代碼中調用是非常有必要的;

2. sum:把某一列的若干行進行求和運算;

-- 針對某一列求和
select sum(列名) from 表名;-- 針對表達式求和
select sum(表達式) from 表名;

如果列的值為 null,就會被自動排除掉;

求和時 mysql 會嘗試把列轉換為 double,如果轉換成功,就可以進行運算,如果沒轉成就會報錯;

針對表達式求和時,會先求表達式的值,得到臨時表,再針對臨時表求和;

avg,max,min 用法和 sum 相同;

2. group by

使用 group by 分組,再針對每個組分別進行聚合查詢;

針對列進行分組,把這一列中值相同的行,分成到一組中,得到若干個組;

再針對這些組,分別使用聚合函數;

-- 分組聚合查詢
select 列名1, avg(列名2) from 表名 group by 列名1;

如果針對分組之后,不適用聚合函數,此時的結果就是查詢出每一組中的某個代表數據;

因此,分組通常時搭配聚合函數使用的;?

使用 group by 的時候,還可以搭配條件,但是需要區分清楚是分組之前的條件還是分組之后的條件;

分組之前:條件在 group by 前面,用 where

-- 聚合查詢搭配條件:分組之前
select 列名1, avg(列名2) from 表名 where 條件 group by 列名1;

分組之后:條件在 group by 后面,用 having

-- 聚合查詢搭配條件:分組之后
select 列名1, avg(列名2) from 表名 group by 列名1 having 條件; 

分組前后都有條件: 分組前使用 where,分組后使用 having

-- 分組前后都有條件,分組前條件用 where,分組后條件用 having
select 列名1, avg(列名2) from 表名 where 條件1 group by 列名1 having 條件2;

3. 聯合查詢

1. 內連接

笛卡爾積是將兩張表的行通過排列組合的方式,得到一個更大的表;

笛卡爾積的列數,是這兩個表的列數相加;

笛卡爾積的行數,是這兩個表的行數相乘;

-- 笛卡爾積
select * from 表1, 表2;

笛卡爾積的基礎上,加上連接條件:

-- 加上連接條件
select * from 表1, 表2 where 表1.列名 = 表2.列名;select * from 表1 join 表2 on 表1.列名 = 表2.列名;

?在上述基礎上,添加條件(聚合查詢等),對數據進行篩選:

-- 添加條件篩選數據
select * from 表1, 表2 where 表1.列名 = 表2.列名 and 條件;select * from 表1 join 表2 on 表1.列名 = 表2.列名 and 條件;-- 多張表聯合查詢
select 列名1, 列名2, 列名3... from 表1, 表2, 表3... where 連接條件1 and 連接條件2 and ... ;select 列名1, 列名2, 列名3... from 表1 join 表2 on 連接條件1 and 表2 join 表3 on 連接條件2...;

注意:如果實際情況中,數據量很大,多表聯合查詢會生成大量的臨時結果,這個過程非常消耗時間,給服務器的響應速度造成很大的影響;因此,聯合查詢之前要評估好數據量。

2. 外連接

如果兩張表,里面的記錄存在對應關系,內連接和外連接的結果是一致的;

如果存在不對應的記錄,內連接和外連接就會出現差別;

左外連接:以左側表為基準,保證左側表的每個數據都會出現在最終結果中;如果在右側表中不存在,對應列就會填成空;

右外連接:以右側表為基準,保證右側表的每個數據都會出現在最終結果中;如果在左側表中不存在,對應列就會填成空;

-- 左外連接
select * from 表1 left join 表2 on 表1.列名 = 表2.列名;-- 右外連接
select * from 表1 right join 表2 on 表1.列名 = 表2.列名;

3. 自連接?

進行行和行之間的比較;

SQL 不能進行行和行之間的比較,這時候需要用到自連接;

-- 進行行與行之間的比較,自連接
select 列名, 列名... from 表名 as 表1, 表名 as 表2 where 連接條件 and 條件...; 

4. 子查詢

?把多個簡單 sql 拼接成一個復雜 sql;

-- 單行子查詢
select 列名, 列名... from 表名 where 列名 = (select 列名 from 表名 where 列名 = ?) and 條件;-- 多行子查詢
select 列名, 列名... from 表名 where 列名 in (select 列名 from 表名 where 條件1 or 條件2);

5. 合并查詢

允許把兩個不同的表?sql 查詢的結果集合,合并到一起;

合并的兩個 sql 結果集的列需要匹配,列的個數和類型需要一致;

合并的時候會去重,如果不想去重,需要用 union all;

-- 合并查詢
select 列名 from 表1 union select 列名 from 表2;

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

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

相關文章

表征工程 中怎么 調整參數或比例

表征工程 中怎么 調整參數或比例 在表征工程(Representation Engineering)中,調整參數或比例的核心目標是平衡干預效果與模型基礎能力,避免過度干預導致語義失真或能力退化。以下是幾種常用的方法論及具體案例: 1. 系數縮放法(Scaling Coefficients):通過權重參數控制…

如何使用Anaconda(miniconda)和Pycharm

文章目錄前言具體操作Pycharm連接配置 Anaconda(miniconda)創建的虛擬環境PipAnacondaPyCharm三者關系一圖勝千言總結前言 本文介紹如何利用Anaconda和Pycharm這兩個強大的工具,實現Python項目的高效開發。通過構建虛擬環境、安裝依賴包及利…

【07】C#入門到精通——C# 生成dll庫 C#添加現有DLL C#調用自己生成的dll庫

文章目錄0 多個.cs文件源碼01 Hero.cs02 ShowInfo.cs03 Program.cs (相當于Main文件)04 運行效果1 生成dll庫1.1 創建類庫1.2 添加要生成 dll庫 的代碼文件1.2.1 添加 Hero類1.2.2 添加 ShowInfo類1.3 生成dll庫 及 查看3 添加自己生成的dll庫4 調用運行…

進程控制->進程替換(Linux)

在之前的博客中,我們已經探討了進程創建、終止和等待的相關知識。今天,我們將繼續深入學習進程控制中的另一個重要概念——進程替換。回顧之前的代碼示例,我們使用fork()創建子進程時,子進程會復制父進程的代碼和數據(…

認識泛型、泛型類和泛型接口

目錄泛型泛型類泛型接口泛型 定義類、接口、方法時&#xff0c;同時聲明了一個或者多個類型變量&#xff08;如&#xff1a;<E>&#xff09;&#xff0c;稱為泛型類、泛型接口、泛型方法、它們統稱為泛型 作用&#xff1a;泛型提供了在編譯階段約束所能操作的數據類型&…

如何排查并解決項目啟動時報錯Error encountered while processing: java.io.IOException: closed 的問題

如何排查并解決項目啟動時報錯Error encountered while processing: java.io.IOException: closed 的問題 摘要 本文針對Java項目啟動時出現的java.io.IOException: closed錯誤&#xff0c;提供系統性解決方案。該異常通常由流資源異常關閉或損壞引發&#xff0c;常見于Maven依…

Kafka——多線程開發消費者實例

引言在分布式系統領域&#xff0c;Kafka憑借高吞吐量、低延遲的特性成為消息隊列的事實標準。隨著硬件技術的飛速發展&#xff0c;服務器多核CPU已成常態——一臺普通的云服務器動輒配備16核、32核甚至更多核心。然而&#xff0c;Kafka Java Consumer的設計卻長期保持著"單…

PDF 轉 HTML5 —— HTML5 填充圖形不支持 Even-Odd 奇偶規則?(第二部分)

這是關于該主題的第二部分。如果你還沒有閱讀第一部分&#xff0c;請先閱讀&#xff0c;以便理解“繞組規則”的問題。 快速回顧一下&#xff1a;HTML5 只支持 Non-Zero&#xff08;非零&#xff09;繞組規則&#xff0c;而 PDF 同時支持 Non-Zero 和 Even-Odd&#xff08;奇偶…

機器學習 KNN 算法,鳶尾花案例

目錄 一.機器學習概述 二.人工智能的兩大方向 三.KNN算法介紹 1.核心思想&#xff1a;“物以類聚&#xff0c;人以群分” 2.算法步驟 四.KNN算法實現 1.安裝scikit-learn庫 2.導入knn用于分類的類KNeighborsClassifier 3.設置KNeighborsClassifier的相關參數 4.訓練模…

強化學習(第三課第三周)

文章目錄強化學習&#xff08;第三課第三周&#xff09;一、以火星探測器為例說明強化學習的形式化表示二、強化學習中的回報三、強化學習算法的目標&#xff08;一&#xff09;馬爾可夫決策過程&#xff08;二&#xff09;狀態動作價值函數&#xff08;四&#xff09;使用Bell…

星痕共鳴數據分析2

今天實驗內容是攻擊力部分 1.思路 由于昨天數據分析出了一個函數 這個函數可以把奇怪的字節變成正常的數字 int parse_varint(unsigned const char* data, int count) {int value 0;int shift 0;for (int i 0; i < count; i) {unsigned char byte data[i];value | ((byt…

強化學習新發現:僅需更新5%參數的稀疏子網絡可達到全模型更新效果

摘要&#xff1a;強化學習&#xff08;RL&#xff09;已成為大語言模型&#xff08;LLM&#xff09;在完成預訓練后與復雜任務及人類偏好對齊的關鍵步驟。人們通常認為&#xff0c;要通過 RL 微調獲得新的行為&#xff0c;就必須更新模型的大部分參數。本研究對這一假設提出了挑…

electron 使用記錄

目錄 代理設置以打包成功 參考文檔 代理設置以打包成功 參考文檔 使用 JavaScript、HTML 和 CSS 構建跨平臺桌面應用 |電子 --- Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron

Spring boot Grafana優秀的監控模板

JVM (Micrometer) | Grafana Labs 1 SLS JVM監控大盤 | Grafana Labs Spring Boot 2.1 Statistics | Grafana Labs springboot granfana 監控接口指定接口響應的 在Spring Boot應用中&#xff0c;使用Grafana進行監控通常涉及以下幾個步驟&#xff1a; 設置Prometheus作…

LeetCode11~30題解

LeetCode11.盛水最多的容器&#xff1a; 題目描述&#xff1a; 給定一個長度為 n 的整數數組 height 。有 n 條垂線&#xff0c;第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。 找出其中的兩條線&#xff0c;使得它們與 x 軸共同構成的容器可以容納最多的水。 返回容器…

計算機結構-邏輯門、存儲器、內存、加法器、鎖存器、程序計數器

邏輯門 邏輯門簡單地理解即通過特定的條件實現與、或、非、異或等相關邏輯二極管 這些最基礎的邏輯門都是通過電路元器件進行搭建的&#xff0c;即半導體材料搭建的二極管二極管有個特點&#xff0c;一定條件下才可以導通&#xff0c;即得接對正負極&#xff0c;具體的原理可以…

連鎖店鋪巡查二維碼的應用

在連鎖店鋪的運營管理中&#xff0c;巡查工作是保障各門店規范運作、提升服務質量的關鍵環節。巡查二維碼的出現&#xff0c;為這一環節帶來了高效、便捷且規范的解決方案&#xff0c;其應用場景廣泛&#xff0c;優勢顯著。在如今的繁雜且效果參差不齊電子二維碼市場中&#xf…

各種前端框架界面

前端技術更新迭代很快&#xff0c;已經有不少新的前端框架問世&#xff0c;而且像geeker-admin風格的界面設計也挺不錯的。 今天去面試了前端開發崗位&#xff0c;感覺希望不大。畢竟中間空了一段時間沒接觸&#xff0c;得趕緊把新的知識點補上&#xff0c;這樣哪怕是居家辦公也…

DApp 開發者 學習路線和規劃

目錄 ?? 一、學習路線圖 階段 1:基礎知識(1~2 周) 階段 2:智能合約開發(3~4 周) 階段 3:前端與區塊鏈交互(2~3 周) 階段 4:進階與生態系統(持續學習) ?? 二、學習規劃建議(3~4 個月) ?? 三、工具推薦 ?? 四、附加建議 ?? 一、學習路線圖 階段 …

數據結構 二叉樹(3)---層序遍歷二叉樹

在上篇文章中我們主要講了關于實現二叉樹的內容&#xff0c;包括遍歷二叉樹&#xff0c;以及統計二叉樹等內容。而在這篇文章中我們將詳細講解一下利用隊列的知識實現層序遍歷二叉樹。那么層序遍歷是什么&#xff1f;以及利用隊列遍歷二叉樹又是怎么遍歷的&#xff1f;下面讓我…