mysql的增刪查改(進階)

目錄

一.? 更復雜的新增

?二. 查詢

2.1 聚合查詢

COUNT

SUM

AVG

MAX

?MIN

2.1.2?分組查詢? group by 子句

?2.1.3?HAVING

?2.2?聯合查詢/多表查詢

?2.2.1 內連接

2.2.2 外連接

2.2.3 全外連接

2.2.4 自連接

?2.2.5 子查詢

2.2.6 合并查詢


一.? 更復雜的新增

將從表名查詢到的結果插入到表名2中

insert into 表名2 select .. from 表名1 ...;

創建一個學生表:

創建一個學生表2, 將學生表中的數據加到學生表2中:

?注意: 列的類型可以匹配即可插入, 列名和列的類型不一定要完全一致

?二. 查詢

2.1 聚合查詢

前面談到的"表達式查詢", 是針對列和列之間的運算, 聚合查詢, 就是針對行和行之間的運算

對于行之間的運算, sql中提供了"聚合函數" 來完成這里的運算, 相當于是"庫函數"

COUNT

存在這樣的表:

此時, 得到了表的全部行的數量

當前這個寫法, 就相當于先執行了select * from exam_result, 再對結果進行count聚合

如果寫具體的列, 就是針對這一列的結果進行聚合:

?發現結果不同, 因為chinese有個空行

結論: 針對某一列進行聚合的時候, 只關注這一列有多少非NULL的結果 而針對*進行聚合時, 則不再是否非NULL, 全部都記錄

如果在count和( )之間加個空格, 就會報錯

SQL語言大部分情況下對于空格和換行都是很有好的, 但是聚合函數的函數名和括號之間, 不能有空格

SUM

相當于先執行了select chinese?from exam_result, 再對結果進行sum聚合

括號中寫表達式也可以:

?相當于先執行了select chinese+math+english?from exam_result, 再對結果進行sum聚合

也可以進行帶有別名:

但不能把別名寫在括號中:

能用sum(*) 嗎?

顯然不可以

聚合函數中count(*) 其實是一種特殊情況, 只是單純的統計行數

sum和其他的聚合函數, 涉及到相加或其他計算, 語義上沒有明確定義, 不能用sum(*)

針對非數值的列, 進行加和, 雖然不會報錯, 但是結果是不正確的, 會報警告:

使用show warnings;? 可以查看警告

數據庫試圖將name轉換成double類型(因為SQL是弱類型語言), 但是失敗了

但是如果雖然是varchar類型, 但是你賦值為'1''2''3', 那也是可以相加的, 因為可以進行類型轉換

AVG

MAX

?MIN

2.1.2?分組查詢? group by 子句

指定某個列, 針對這個列, 把值相同的行, 分到同一個組中, 在針對每個組, 分別進行聚合查詢?

添加一個表:

查詢每個角色下有幾個人:

?執行順序:

  1. ?先執行 select role,id from emp
  2. ?再根據group by role 設定, 按照role這一列的值, 針對上述查詢結果, 進行分組
    分成服務員一組, 游戲陪玩一組, 游戲角色一組, 董事長一組
  3. ?針對上面的組, 分別執行count聚合操作
  4. ?將上面的結果整理成臨時表, 返回給客戶端即可

最終結果的臨時表, 這幾個分組的順序誰先誰后可不一定!!

可以針對聚合后的結果進行排序, 而不是干預每個分組中數據的先后順序:

注意:?使用 GROUP BY 進行分組查詢時,SELECT 指定的字段必須是分組依據字段,即group by 后面的列, 其他字段若想出現在SELECT 中則必須包含在聚合函數中。

如果這么寫:

每個顯示的結果, 都是每個分組中的其中一條記錄, 但是由于分組之后, 順序是不確定的, 當前你這里顯示的是哪行, 是不確定的, 存在一定的"隨機性", 因此就沒有意義

?2.1.3?HAVING

給聚合查詢指定條件:

1) 聚合之前的條件

查詢每個崗位的平均工資, 但是刨除"馬云"

where寫在group by 前面

2) 聚合之后的條件

查詢每個崗位的平均工資, 但刨除平均工資超過10000的數據

此時, 篩選聚合之后的條件, 就不能用where, 需要用having:

此時having放在group by 后面?

當然, 一個sql中, 上述兩種條件, 都可以存在:

計算每個崗位的平均工資, 刨除"馬云", 也刨除平均工資超過10000的:

?2.2?聯合查詢/多表查詢

上面介紹的都是單表查詢

想要學習多表查詢, 我們先要了解一下"笛卡爾積"的概念

笛卡爾積, 就是得到了一個更大的表, 列數, 是原來兩個表列數的和, 行數, 是原來兩個表列數的積

在sql中, 我們很方便通過select 完成笛卡爾積:

先創建兩個表student 和 class

笛卡爾積:

但是, 笛卡爾積是全排列的過程, 窮舉出了所有的可能性, 自然就會產生以下不符合實際的情況的數據, 例如上述笛卡爾積中, classId只有一個, 只有相同的才是有效數據

那么我們可以加上條件:?

這樣寫, 會產生二義性, 因為兩個列名是相等的, 那么我們可以通過?表名. 列名?的方式訪問各自的列

?這個就是多表查詢/聯合查詢的sql

像?where student.classId = class.classId 這種專門用來篩選出有效數據的條件, 也稱為"連接條件", 上述多表查詢的操作, 也可以稱為"連接操作".

創建四張表:

1) 查詢'許仙'同學的成績

第一步: 先確定要查詢的信息來自哪些表

許仙同學的名字在學生表中, 成績在分數表中, 所以要針對學生表和分數表進行聯合查詢

第二步: 針對這兩個表進行笛卡爾積

學生表是8條記錄, 分數表是20條記錄, 笛卡爾積應該有160條記錄

第三步: 加上連接條件, 去掉無效數據

第四步: 再根據題目, 補充其他的條件

第五步: 去掉不必要的列

因為題目要求只要許仙的成績

2) 使用join ... on? 多表查詢的另一種寫法

第一步: 確認信息來自學生表和分數表

第二步: 笛卡爾積(用join實現笛卡爾積)

第三步: 指定連接條件(用on 代替where)

?第四步: 補充其他條件

第五步: 保留必要列, 去掉其他列

3) 查詢所有同學的總成績

第一步: 信息出自學生表 分數表

第二步: 學生表和分數表進行笛卡爾積

第三步: 指定連接條件

第四步: 添加其他條件, 此處需要添加聚合操作, 按照學生的姓名進行分組

?4) 列出同學的成績, 課程的名字, 課程的成績

第一步: 信息來自三個表, 學生表, 課程表, 分數表

第二步: 笛卡爾積

第三步: 指定連接條件

第四步: 對列進行精簡

針對多張表查詢, 使用join on 可讀性更好

?2.2.1 內連接

上述我們所有的鏈接都是內連接?

select * from 表1,表2 where 連接條件

select * from 表1 (inner) join 表2 on 連接條件

2.2.2 外連接

select * from 表1 left/right join 表2 on 條件....;

注意: 只能使用join ..on.., 在join的前面加上left / right 關鍵字, 表示"左外連接" 和 "右外連接"

?外連接和內連接一樣, 也是基于笛卡爾積的方式來計算的, 但是對于空值/不存在的值, 處理方式是存在區別的

1)對于數據"一一對應"的情況

對于學生表和分數表,
任何一個學生數據, 都能在分數表中找到分數結果
任何一個分數結果, 也能在學生表中找到名字信息

此時, 進行內連接和外連接, 效果是一樣的

??簡單創建兩張表:

內連接:

外連接:

2)對于數據"非一一對應"的情況?

?如果我們對上述數據進行調整:

此時, wangwu的分數信息, 在分數表中不存在了
分數表中, id為4的信息, 在學生表中也不存在

內連接:

此時, 得到的結果, 是包含在兩個表中都有的數據

左外連接:

對于左外連接, 以左側的表為基準, (寫作student left join score, 此時student就是左側表, score就是右側表), 保證左側表中的每一個數據, 都會存在, 左側表數據在右側表不存在的列, 會用null填充

右外連接:

右外連接與左外連接類似, 以右側表為基準, 使右表中的每個數據都存在, 對應坐標中不存在的數據都用null填充

2.2.3 全外連接

結合左連接和右連接

站在集合的角度看待上述幾種鏈接:

2.2.4 自連接

同一個表, 自己和自己計算笛卡爾積

例:
還是使用上面的表

顯示所有"計算機原理"成績比"java"成績高的成績信息


我們想要比較的是同一個學生的3號課程比1號課程成績高的數據, 發現我們要比較的score在不同的行中, 之前我們進行的各種條件查詢, 都是基于列和列之間的比較, 聚合函數時行和行之間的運算, 沒法進行行和行之間的比較, 這時我們就要想辦法將行和行之間的關系, 轉化成列和列之間的關系, 此時, 自連接就出現了

當我們直接進行自連接時, 發現會報錯:

此時我們要給表起個別名:

繼續添加條件:

?2.2.5 子查詢

把多個sql嵌套成了一個sql

1) 單行子查詢: 返回一行記錄的查詢

查詢"不想畢業"同學的同班同學:

先知道"不想畢業"同學的班級, 再去找同班同學

子查詢:

將得出的單條記錄直接用sql語句代替

2)多行子查詢: 返回多條記錄的子查詢 用in關鍵字

查詢"語文"或"英文"課程的成績信息:

先知道"語文"或"英文"的課程id, 再去找成績:
?

子查詢:


用in()來圈定范圍

2.2.6 合并查詢

把多個查詢結果合并到一起, 使用union關鍵字

查詢id<3,或者名字為"英文"的課程

?另外, union允許從不同的表分別查詢, 只要每個表查詢的結果集合列的類型和列的個數匹配, 都能合并, 列的名字無所謂, 但是or只能針對一個表

union在合并是會自動去重, 如果不想要去重操作, 可以使用union all

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

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

相關文章

自動化辦公01 smtplib 郵件?動發送

目錄 一、準備需要發送郵件的郵箱賬號 二、發送郵箱的基本步驟 1. 登錄郵箱 2. 準備數據 3. 發送郵件 三、特殊內容的發送 1. 發送附件 2. 發送圖片 3. 發送超文本內容 4.郵件模板內容 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即簡單郵件傳輸協議…

霍夫曼樹教程(個人總結版)

背景 霍夫曼樹&#xff08;Huffman Tree&#xff09;是一種在1952年由戴維霍夫曼&#xff08;David A. Huffman&#xff09;提出的數據壓縮算法。其主要目的是為了一種高效的數據編碼方法&#xff0c;以便在最小化總編碼長度的情況下對數據進行編碼。霍夫曼樹通過利用出現頻率…

【Qt秘籍】[009]-自定義槽函數/信號

自定義槽函數 在Qt中自定義槽函數是一個直接的過程&#xff0c;槽函數本質上是類的一個成員函數&#xff0c;它可以響應信號。所謂的自定義槽函數&#xff0c;實際上操作過程和定義普通的成員函數相似。以下是如何在Qt中定義一個自定義槽函數的步驟&#xff1a; 步驟 1: 定義槽…

<jsp:setProperty>設置有參構造函數創建的自定義對象的屬性

假設某一個類&#xff08;如TextConverter類&#xff09;有一個無參構造函數和一個有參構造函數&#xff0c;我們可以在Servlet里面先用有參構造函數自己new一個對象出來&#xff0c;存到request.setAttribute里面去。 Servlet轉發到jsp頁面后&#xff0c;再在jsp頁面上用<j…

django基于大數據+Spring的新冠肺炎疫情實時監控系統設計和實現

設計一個基于Django(后端)和Spring(可能的中間件或服務集成)的新冠肺炎疫情實時監控系統涉及多個方面,包括數據收集、數據處理、數據存儲、前端展示以及可能的中間件服務(如Spring Boot服務)。以下是一個大致的設計和實現步驟: 1. 系統架構 前端:使用Web框架(如Reac…

三種字符串的管理方式

NSString的三種實現方式 OC這個語言在不停的升級自己的內存管理&#xff0c;盡量的讓自己的 OC的字符串 問題引入 在學習字符串的過程中間會遇到一個因為OC語言更新造成的問題 例如&#xff1a; int main(int argc, const char * argv[]) {autoreleasepool {NSString* str1 …

C++核心編程類的總結封裝案例

C類的總結封裝案例 文章目錄 C類的總結封裝案例1.立方體類的封裝2.點與圓的關系的封裝3.總結 1.立方體類的封裝 在C中&#xff0c;我們可以定義一個立方體&#xff08;Cube&#xff09;類來封裝立方體的屬性和方法。立方體的屬性可能包括邊長&#xff08;side length&#xff…

【redis】set和zset常用命令

set 無序集合類型 sadd 和 smembers SADD&#xff1a;將一個或者多個元素添加到set中。注意,重復的元素無法添加到set中。 語法&#xff1a;SADD key member [member] 把集合中的元素,叫做member,就像hash類型中,叫做field類似. 返回值表示本次操作,添加成功了幾個元素. 時間復…

網絡原理——http/https ---http(1)

T04BF &#x1f44b;專欄: 算法|JAVA|MySQL|C語言 &#x1faf5; 今天你敲代碼了嗎 網絡原理 HTTP/HTTPS HTTP,全稱為"超文本傳輸協議" HTTP 誕?與1991年. ?前已經發展為最主流使?的?種應?層協議. 實際上,HTTP最新已經發展到 3.0 但是當前行業中主要使用的HT…

概念解析 | 為什么SAR中的天線間隔需要是四分之一波長?

注1:本文系“概念解析”系列之一,致力于簡潔清晰地解釋、辨析復雜而專業的概念。本次辨析的概念是:為什么SAR中的天線間隔需要是四分之一波長 概念解析 | 為什么SAR中的天線間隔需要是四分之一波長? 在這篇文章中,我們將深入探討**合成孔徑雷達(SAR)**系統中,為什么天…

明日周刊-第12期

以前小時候最期待六一兒童節了&#xff0c;父母總會給你滿足一個愿望&#xff0c;也許是一件禮物也許是一次陪伴。然而這個世界上其實還有很多兒童過不上兒童節&#xff0c;比如某些地區的小孩子&#xff0c;他們更擔心的是能不能見到明天的太陽。 文章目錄 一周熱點航天探索火…

LeetCode-77. 組合【回溯】

LeetCode-77. 組合【回溯】 題目描述&#xff1a;解題思路一&#xff1a;回溯背誦版解題思路三&#xff1a;0 題目描述&#xff1a; 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 示例 1&#xff1a; 輸入&a…

Python怎么使用 SQLAlchemy 和model 查詢數據呢?

SQLAlchemy是一個流行的Python SQL工具包和對象關系映射器&#xff08;ORM&#xff09;。 假設正在使用 SQLAlchemy 并有一個模型 MyModel&#xff0c;使用這個模型以及 query 方法來查詢數據庫。 這里有一個基本的例子&#xff0c;說明如何使用 SQLAlchemy 的 query 方法和 wi…

算法-對列表元素劃分成兩個和值最大且相等的子列表

現有私募基金發行一支特殊基金產品&#xff0c;該基金認購人數上限不超過 30 人&#xff0c; 募集總金額不超過 3000W&#xff0c;每個投資人認購金額不定。該基金只能將募集到的錢用于投資兩支股票&#xff0c;且要求兩支股票投資金額必須相同&#xff0c;且每位投資人的錢只能…

0X JavaSE-- 集合框架【Collection(List、Set、Queue)、Map】

每一個集合類底層采用的數據結構不同&#xff0c;例如ArrayList集合底層采用了數組&#xff0c;LinkedList集合底層采用了雙向鏈表&#xff0c;HashMap集合底層采用了哈希表&#xff0c;TreeMap集合底層采用了紅黑樹。**集合中存儲的是引用。**即。集合中存放的是對象的地址&am…

springboot報錯:Failed to start bean ‘documentationPluginsBootstrapper‘

項目場景&#xff1a; springboot項目啟動時報錯 問題描述 具體報錯信息&#xff1a; 可能原因分析&#xff1a; 1、SpringFox的版本與Spring Boot的版本不兼容。解決這個問題&#xff0c;你可能需要檢查你正在使用的SpringFox和Spring Boot的版本&#xff0c;確保它們是兼容…

一千題,No.0037(組個最小數)

給定數字 0-9 各若干個。你可以以任意順序排列這些數字&#xff0c;但必須全部使用。目標是使得最后得到的數盡可能小&#xff08;注意 0 不能做首位&#xff09;。例如&#xff1a;給定兩個 0&#xff0c;兩個 1&#xff0c;三個 5&#xff0c;一個 8&#xff0c;我們得到的最…

[AIGC] 使用Flink SQL統計用戶年齡和興趣愛好

Apache Flink是一個具有強大計算能力、高吞吐量、低延遲的分布式計算框架&#xff0c;它支持批計算和流計算。Flink SQL是Flink ecosystem的一部分&#xff0c;是一種對結構化數據進行批和流處理的聲明式語言。本文以一個簡單的實例講解如何使用Flink SQL來統計用戶年齡和興趣愛…

C# 面向對象編程(一)——類 第三篇

總目錄 C# 語法總目錄 系列鏈接 C# 面向對象編程(一) 類 第一篇 C# 面向對象編程(一) 類 第二篇 C# 面向對象編程(一) 類 第三篇 C# 面向對象編程 一 ——類 第三篇 簡介面向對象編程類 第三篇9. 重載運算符10. 分部方法** nameof方法 **** GetType 方法和 typeof方…

【Intro】Heterogeneous Graph Attention Network(HAN)

論文鏈接&#xff1a;https://arxiv.org/pdf/1903.07293 Abstract 異構性和豐富的語義信息給面向異構圖的圖形神經網絡設計帶來了巨大的挑戰。 -> 一種基于分層注意的異構圖神經網絡&#xff0c;包括節點級注意和語義級注意。具體來說&#xff0c;節點級關注旨在學習節點…