MySQL(二)-基礎操作

?一、約束

有時候,數據庫中數據是有約束的,比如 性別列,你不能填一些奇奇怪怪的數據~

如果靠人為的來對數據進行檢索約束的話,肯定是不行的,人肯定會犯錯~因此就需要讓計算機對插入的數據進行約束要求!

約束的使用語法

create 表名 (列名 類型 約束);
?
#在創建表的時候對某一列數據進行約束操作

在mysql中提供了如下約束

約束說明
not null某一列的數據不能為null值
unique某一列中的值唯一
default規定沒有給某列賦值時為默認值
primary keynot null 和 unique 的結合。記錄身份的標識,一般配合自增主鍵使用
foreign key保證一個表中的數據匹配另一個表中的值的參照完整性
check保證列中的值符合指定條件

注意:

使用約束的話,一定會數據庫的效率有影響

由于not null、 unique、default、check比較容易,這里就對主鍵(primary key)和外鍵(foreign key) 進行解釋。

主鍵primary key

主鍵可以理解為記錄的身份標識,就像身份證一樣是我們每個人的身份標識,既不能為空,又不能重復。

一張表里只能有一個主鍵,畢竟是身份標識嘛,存在多個了,以誰為準???

雖然主鍵只能有一個,但是主鍵不一定是一列,可以用多個列共同構成主鍵(聯合主鍵)。

由于主鍵具有unique屬性,因此我們一般配合mysql中 ”自增主鍵” 來使用,也就是會自動分配一個逐個增長的值~

語法

create table 表名 (列名 類型 primary key auto_increment);

如果手動插入一個數據,此時數據庫會與主鍵最高的值進行比較,如果高了就更新,此后自動分配的值也會從這個最高值進行增長

拓展

如果是分布式系統,在同一時間插入了一個數據,此時自增主鍵就會出錯,那么如何處理這種并發場景呢?

一般會使用一個公式來形成主鍵

分布式主鍵值 = 時間戳 + 機房編號/主機號 + 隨機因子 此處使用的是字符串拼接操作!!!

前面兩個可以防止在同一時間不同機器的的主鍵沖突,后面的隨機因子可以防止同一時間同一機器的主鍵沖突,但是理論上還是有可能存在沖突的~

外鍵foreign key

案例引入:

現在我們有兩張表,一張是學生表,里面有學號、姓名、班級號字段,另一張表示班級表,里面有班級號、班級名字段。

?

我們細細觀察,可以發現,肯定是先有班級表學生的班級號才能確定,但是現在突然冒出了一個classId 為 300的學生,但是在我們的班級表中不存在這個班級號,為了防止這種情況發生,我們可以使用外鍵約束~

語法

create table 表名 (列名 類型, 列名 類型, ......, foreign key (列名) references 主表名(列名));
?
#我們創建學生表的時候可以這樣寫:#create table student (id int, name varchar(20), classId int, foreign key (classId) references class(classId));#student表的classId 的所有數據都要出自于class表的classId這一列,
#也就是說如果class表中沒有這個班級號,那么我們插入的學生信息將會報錯~

使用外鍵之后,被約束的表就稱為子表另一張表相對的就是父表子表中的那一個字段的數據都要出自父表。當然,力的作用是相互的,約束也不例外,當我們想要刪除/修改父表的約束子表的那個字段,如果子表已經引用過了,那么我們將會刪除/修改失敗

注意

父表中約束子表的字段必須為主鍵或者unique!!!

二、表的設計

在實際的場景中,有大量的數據,我們需要明確當前要創建幾個表,每個表有什么字段,這些表中是否存在一定的聯系。

因此根據實際開發就整理出了三大范式~

一對一

例如:一個學生只有一個賬號,一個賬號只屬于一個學生

此時我們設計兩張表,讓其中的一張表存儲另一張表的唯一屬性,這樣我們可以通過這個屬性就能找到想要的值了。或者也可以將兩張表整合,成為一張表。
?


一對多

例如:一個學生只能屬于一個班級,一個班級可以擁有多個學生。

此時我們設計兩張表,將那個“一”的表中添加上“多”的表中的唯一的字段

補充

如果是redis這種能夠支持數組類型的數據庫,我們可以不這樣設計,可以使用一個數組類型,用來存儲多個學生。如下圖:


多對多

例如:一個學生可以選多門課程,一個課程可以被多名學生選擇。

此時我們需要再創建一張表來描述這兩張表之間的關系

三、查詢增強(進階)

查詢操作有很多的花樣,但一般實際開發中最最最常使用的還是前面基礎的crud操作。

0x 00 聚合查詢

之前的表達式查詢是對于一條記錄上的列與列之間進行運算的,如果要針對行與行之間進行運算呢?這時候就要用到聚合查詢了~

首先來了解一些聚合函數:

函數說明
count()返回查詢數據的個數
sum()返回查詢數據的總和,不是數字沒意義
avg()返回查詢數據的平均值,不是數字沒意義
max()返回查詢數據的最大值,不是數字沒意義
min()返回查詢數據的最小值,不是數字沒意義

語法:

select count([distinct]表達式) from 表名;
select sum([distinct]表達式) from 表名;
select avg([distinct]表達式) from 表名;
select max([distinct]表達式) from 表名;
select min([distinct]表達式) from 表名;
?
#注意:
#count(*) 和 count(列名)的區別,count(*)會把一條為null的數據也統計進去,而count(列名)則不會
#如果計算字符串的值,需要字符串合法,因為mysql會嘗試轉成double

0x 01 分組查詢

分組查詢一般會配合聚合查詢,因為分組查詢會把幾行數據看做是一行,如果不使用聚合查詢,那么顯示的結果為一組中某一個數據。

舉例:

求各班的平均成績:

?那么我們的代碼得這樣寫:

select class_id, avg(socre) from class group by class_id;

使用group by的時候,還可以搭配條件。此時我們需要區分該條件是分組前的,還是分組之后的?

如果是分組前,使用where條件查詢

如果是分組后,使用having條件查詢

舉例:

查詢各班平均分,但是學生成績不能超過100

select class_id, avg(socre) from class where socre <= 100 group by class_id;

?查詢平均分大于100分的班級

select class_id, avg(score) from class group by class_id having avg(score) > 100;

0x 02 聯合查詢

聯合查詢也就是多表查詢,就是在多張表上進行查詢。但是聯合查詢也會有一些問題......

聯合查詢會產生笛卡爾積,也就是說表A中的每一條數據都會與表B中每一條數據進行組合,如果A表中的數據個數為100,表B中的數據個數為100,那么最終會產生100*100條數據。但是仔細觀察,會發現有一些數據是“非法”的。笛卡爾積是簡單的排列組合,窮舉所有情況,因此你我們需要篩選數據~

如果要聯合n張表進行查詢,那么我們需要使用n-1個連接條件,才不會出現笛卡爾積的現象~

?此時就出現了笛卡爾積,但是仔細觀察,會發現class_id 不同的數據都組合到了一起,因此我們需要一個連接條件。

select student.class_id, student.name, class.socre from student, class where student.class_id = class.class_id;

由于多表查詢一般比較復雜,我們可以按照如下的步驟來寫:

1、先進行指定哪個幾個表,進行笛卡爾積

2、指定連接條件,去除笛卡爾積

3、精簡列數據

以上查詢都是基于“內連接“的操作,然而mysql還提供了”外連接“(左外連接,右外連接)


案例引入

現有如下表

此時student的每一條記錄都可以在score表中找到對應,每一個score中記錄也可以在student表中找到對應。

此時我們使用外內接或者內連接查詢的結果是一樣。

?但是如果不存在記錄,那么內連接與外連接就會天差地別~

外連接分為左外連接和右外連接。

左外連接:以左表為基準,保證左側表的每個數據都會出現在最終的結果集里,如果右表沒有與之對應的記錄則顯示null。

select 列名 from 表名1 left join 表2 on 連接條件
右外連接:以右表為基準,保證右側表的每個數據都會出現在最終的結果集里,如果左表沒有與之對應的記錄則顯示null。
select 列名 from 表名1 right join 表2 on 連接條件

我們還可以用集合圖來表示這些連接的關系:

補充

以上我們都是針對于兩個表進行聯合查詢的,但我們甚至還可以將一個表當做兩個表來進行聯合查詢,這樣我們就能在一張表中進行 行與行的比較~這種連接方式一般被稱為“內連接”

自連接的查詢跟上面的聯合查詢基本沒什么區別,需要注意將兩張表進行別名操作~

0x 03 子查詢

子查詢是將多個簡單的SQL語句拼成一個復雜的SQL, 也就是說將某一個查詢的結果看做是一張表,然后進行操作,但本質是在套娃。因此我們實際也是可以用簡單的查詢完成子查詢的操作的~ (合成2048?合成復雜SQL!)

語法形式:

select 列名 from 表名 where 列名 = (select 列名 from 表名 where 列名 = (套娃下去....));

0x 04 合并查詢

合并查詢就是將多個sql的查詢結果集 合并在一起。合并的兩個sql結果集的列,需要匹配,列的個數和類型得是一致的合并的時候是會進行去重的,如果不想要去重,得使用 union all

select 列名1 列名2 from 表1 union [all] select 列名3 列名4 from 表2;

最終結果

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

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

相關文章

混合模型方差分析

文章目錄 一、說明二、受試者“間”因素和受試者“內”因素的意思&#xff1f;三、混合模型方差分析回答 3 件事四、混合模型方差分析的假設 一、說明 在本文中&#xff0c;我將討論一種稱為混合模型方差分析的方差分析變體&#xff0c;也稱為具有重復測量的 2 因素方差分析。…

音視頻開發_SDL事件處理

今天我為大家介紹一下SDL的事件處理。這里所指的事件處理就是我們通常所說的&#xff0c;鍵盤事件&#xff0c;鼠標事件&#xff0c;窗口事件等。 SDL對這些事件都做了封裝&#xff0c;提供了統一的API&#xff0c;下面我們就來詳細的看一下。 SDL中的事件處理 要想了解 SDL…

VB.net進行CAD二次開發(四)

netload不能彈出對話框&#xff0c;參考文獻2 參考文獻1說明了自定義菜單的問題&#xff0c;用的是cad的系統命令 只要加載了dll&#xff0c;自定義的命令與cad的命令同等地位。 這時&#xff0c;可以將自定義菜單的系統命令替換為自定義命令。 <CommandMethod("Add…

STL-queue的使用及其模擬實現

在C標準庫中&#xff0c;隊列(queue)是一種容器適配器&#xff0c;它以先進先出的方式組織數據&#xff0c;其中從容器一端插入元素&#xff0c;另一端取出元素。 queue的使用 queue的構造函數 queue的成員函數 empty&#xff1a;檢測隊列是否為空size&#xff1a;返回隊列中有…

代碼隨想錄算法訓練營 day23| ● 669. 修剪二叉搜索樹 ● 108.將有序數組轉換為二叉搜索樹 ● 538.把二叉搜索樹轉換為累加樹

文章目錄 前言669. 修剪二叉搜索樹思路方法一 遞歸法方法二 迭代法 108.將有序數組轉換為二叉搜索樹思路方法一 遞歸法方法二 迭代法 538.把二叉搜索樹轉換為累加樹思路方法一方法二 總結 前言 迭代法都沒看主要是669和538【538很簡單】 669. 修剪二叉搜索樹 思路 不用看教程…

【C++刷題】優選算法——位運算

常見位運算操作總結&#xff1a; 基礎位運算 &&#xff1a;有0則為0 |&#xff1a;有1則為1 ^&#xff1a;相同為0&#xff0c;相異為1 / 無進位相加運算符的優先級 管它什么優先級&#xff0c;加括號就完事兒了給一個數 n&#xff0c;確定它的二進制表示中的第 i (默認是從…

【基本數據結構】平衡二叉樹

文章目錄 前言平衡二叉樹1 簡介2 旋轉2.1 左旋2.2 右旋2.3 何時旋轉 3 插入節點4 刪除節點5 代碼 參考資料寫在最后 前言 本系列專注更新基本數據結構&#xff0c;現有以下文章&#xff1a; 【算法與數據結構】數組. 【算法與數據結構】鏈表. 【算法與數據結構】哈希表. 【…

【斯坦福因果推斷課程全集】1_隨機對照試驗1

目錄 The average treatment effect Difference-in-means estimation IID Sampling and Population Asymptotics Example: The linear model Regression adjustments with a linear model 隨機對照試驗&#xff08;RCT&#xff09;是統計因果推論的基礎。如果有的話&#…

關于FPGA 使用SPI FLASH固化時如何配置固化參數

關于FPGA 使用SPI FLASH固化時如何配置固化參數 EDA工具&#xff1a;Vivado 關于FPGA 使用SPI FLASH固化時如何配置固化參數一、引言二、如何設置固化參數&#xff1a;使用50M的速度 &#xff0c;SPI為X4 &#xff0c;以及bit壓縮第一&#xff1a;點open implenment design第二…

Android之onMeasure的三種模式

Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}在 Android 中&#xff0c;onMeasure() 方法是 View 或 ViewGroup 中的一個重要方法&#xff0c;用于測量視圖的大小。在 onMeasure(…

安裝軟件缺少dll文件怎么辦,分享多種解決dll問題的方法

在計算機使用過程中&#xff0c;我們經常會遇到安裝軟件時提示缺少dll文件的問題。這種情況通常會導致軟件無法正常運行或啟動。為了解決這個問題&#xff0c;我總結了以下五種方法&#xff0c;希望對大家有所幫助。 一&#xff0c;了解DLL文件是什么 動態鏈接庫&#xff08;D…

簡單說說我對集成學習算法的一點理解

概要 集成學習&#xff08;Ensemble Learning&#xff09;是一種機器學習技術框架&#xff0c;它通過構建并結合多個學習器&#xff08;也稱為個體學習器或基學習器&#xff09;來完成學習任務。 集成學習旨在通過組合多個基學習器的預測結果來提高整體模型的性能。每個基學習…

常見儀表盤指示燈的含義,這次夠全了!

汽車是當前主要的交通工具之一&#xff0c;給人們的工作、生活提供了便利。大家在學會開車的同時&#xff0c;也得了解一些基本的汽車常識&#xff0c;可以及時的發現車輛的問題&#xff0c;并作出正確的判斷&#xff0c;以此降低車輛的損耗和維修成本。其中最基本的&#xff0…

房產證上加名?手把手教你操作,省錢又省心!

隨著《民法典》的實施&#xff0c;房產的權屬問題愈發受到重視。夫妻雙方及其親屬常希望能在房產證上增添自己的名字&#xff0c;以保障各自的權益。那么&#xff0c;房產證上到底能寫幾個名字呢&#xff1f;以下是對這一問題的詳細解答。 一、房產證命名無固定限制 在購房時&…

準確-K8s系列文章-修改containerd 默認數據目錄

修改 Kubernetes 集群中 containerd 默認數據目錄為 /data/containerd 前言 本文檔適用于 Kubernetes 1.24 及以上版本的集群,介紹如何將 containerd 默認的數據目錄從 /var/lib/containerd 修改為 /data/containerd。 步驟 1. 停止 containerd 服務(慎重!!!需評估風險!…

iOS中的UIScene和UISceneDelegate

目錄 ???????前言 一、AppDelegate和SceneDelegate的關系 1.AppDelegate 2.SceneDelegate 3.info.plist配置 4.生命周期方法對比 1.應用啟動 2.進入前臺 3.進入后臺 5.何時使用AppDelegate和SceneDelegate 1.AppDelegate 2.SceneDelegate 前言 在iOS 13及之…

Linux內核編程入門:深度探索與實戰挑戰

Linux內核編程入門&#xff1a;深度探索與實戰挑戰 在操作系統的心臟地帶&#xff0c;Linux內核以其強大、靈活和開源的特性吸引著眾多程序員。對于那些渴望深入了解系統底層機制并親手塑造操作系統的勇士們&#xff0c;Linux內核編程無疑是一個極具挑戰性和吸引力的領域。本文…

民國漫畫雜志《時代漫畫》第39期.PDF

時代漫畫39.PDF: https://url03.ctfile.com/f/1779803-1248636473-6bd732?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了&#xff0c;截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

Qt for Android : 使用libusb做CH340x串口傳輸的底層USB庫

簡介 Qt for Android自帶的串口方案并沒有適用在高的API版本中&#xff0c; 會出現permission denied的訪問問題&#xff0c; 所以就需要使用Android API&#xff0c; 也就是在CPP中使用JNI方式進行調用&#xff0c; 為了開發的方便&#xff0c; 使用libusb庫作為替代的底層usb…

SpringBoot注解--10--@Bean,對象注入的三種方法

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 Bean一、如何使用方法注解注意Bean 的命名規則&#xff0c;當沒有設置 name 屬性時&#xff0c;那么 bean 默認的名稱就是方法名&#xff0c;當設置了 name 屬性之后…