MySQL數(shù)據(jù)庫聚合查詢和聯(lián)合查詢詳解
聚合查詢:
下文中的所有聚合查詢的示例操作都是基于此表:
聚合函數(shù)
聚合函數(shù)都是行與行之間的運(yùn)算。
count()
select count(列名) from 表名;
統(tǒng)計(jì)該表中該列的行數(shù),但是 null 值不會統(tǒng)計(jì)在內(nèi),但是如果寫為 count(*) 那么 null 也會算進(jìn)去(就算一整行都是 null 也會算進(jìn)去)
例如我們暫時使用這個表進(jìn)行演示:
此表有一行全為空
sum()
select sum(列名) from 表名;
只能針對數(shù)字類型使用,也可以對多列進(jìn)行相加求一個總和;
對該表中的math列的值進(jìn)行求和。
注:會將 null 值排除在外,不予計(jì)算。
avg()
select avg(列名) from 表名;
對該表中的該列進(jìn)行求平均值。
只能針對數(shù)字類型使用
注:會將 null 值排除在外,不予計(jì)算。
max()
select max(列名) from 表名;
求出該表中該列的最大值。
只能針對數(shù)字類型使用
注:會將 null 值排除在外,不予計(jì)算。
min()
select min(列名) from 表名;
求出該表中該列的最小值。
只能針對數(shù)字類型使用
注:會將 null 值排除在外,不予計(jì)算。
group by
group by 可以實(shí)現(xiàn)對數(shù)據(jù)進(jìn)行分組。
一般的使用方法都是先用 group by 進(jìn)行分組,然后再利用聚合函數(shù)進(jìn)行聚合查詢。
select * from 表名 group by 列名;
group by 會將該列中值相同的分為一組。因?yàn)?strong>沒有使用order by 進(jìn)行排序操作所以MySQL并不會對查詢結(jié)果的順序做出保證。
此時我們在原有表的基礎(chǔ)上再加一行數(shù)據(jù)。
加入該條數(shù)據(jù)后該表變成了:
此時再進(jìn)行分組查詢操作:
此時因?yàn)闆]有使用聚合函數(shù)所以 張三這一行 只是在張三這一組中選了一個代表。
如果加入聚合函數(shù)就可以很清楚的看到,聚合函數(shù)會以每組為單位進(jìn)行操作。
此時如果我們不想讓某行(某幾行)參與分組就可以在 group by 之前加入 where 進(jìn)行條件篩選。
select * from 表名 where 條件 group by 列名;
例:此時我們不想讓 null 這個空值和 math=100 的行參與分組
注意:where 條件 必須在 group by 之前
在后面就會報(bào)錯。
having
having 其實(shí)和 where 差不多都是進(jìn)行條件篩選的語句。
group by 子句進(jìn)行分組以后,需要對分組結(jié)果再進(jìn)行條件過濾時,不能使用 where 語句,而需要用 having
having是對分組之后的數(shù)據(jù)進(jìn)行篩選的。
例:此時我們不想讓 null 這個空值和 成績=100 的行參與分組
此時的語句執(zhí)行順序?yàn)椋?/p>
所以 having 子句中的條件一定要和 select 中的對應(yīng)
注:having 必須寫在 group by 子句之后。
聯(lián)合查詢:
實(shí)際開發(fā)中往往數(shù)據(jù)來自不同的表,所以需要多表聯(lián)合查詢。
多表查詢的關(guān)鍵是對多張表的數(shù)據(jù)取笛卡爾積:
下面我先簡單介紹一下笛卡爾積,假設(shè)我們現(xiàn)在有如下的兩張表。而對他們的數(shù)據(jù)取笛卡爾積就是用第一個表的每行數(shù)據(jù)分別與第二張表的每行數(shù)據(jù)進(jìn)行組合。
這兩張表進(jìn)行笛卡爾積之后就變成了一個 9 行 4 列的新表,如圖所示
這就是對兩個表進(jìn)行去取笛卡爾積的結(jié)果。
但是,我們很容易就可以發(fā)現(xiàn)這里面有非常多的所謂的非法數(shù)據(jù),
從圖中我們可以看到只有三條數(shù)據(jù)是合法的,而我們再進(jìn)行數(shù)據(jù)庫操作的時候肯定不能允許有這么多的非法數(shù)據(jù)出現(xiàn)在查詢結(jié)果中,此時我們就可以通過尋找兩張表的關(guān)聯(lián)屬性來通過 where 條件來進(jìn)行篩選,比如上面的表就可以通過設(shè)置兩張表的班級相同來進(jìn)行篩選。
內(nèi)連接
內(nèi)連接其實(shí)就是在多張表中求交集(或者說就是最終查詢的結(jié)果中的每條數(shù)據(jù)的鏈接條件都存在于原本的多張表中)。
此處為了更好的演示,我先創(chuàng)建了三張表
內(nèi)連接的語句就這兩條:
select 字段 from 表1 [inner] join 表2 on 連接條件 and 其他條件;
select 字段 from 表1 ,表2 where 連接條件 and 其他條件;
上面這些格式看著很復(fù)雜其實(shí)完全沒有必要記這些。只要按照下面這些步驟一步一步的多練習(xí)幾次就能掌握。
內(nèi)連接本質(zhì)上分為以下幾步:
例:查詢凌華的各科成績。
第一步:先求出笛卡爾積
select * from 表一,表二,……
通過上述語句就可以求出多張表的笛卡爾積。
此時一共輸出了27條數(shù)據(jù)。
第二步:加上連接條件,篩選出合法信息
此處推薦再寫where中的條件時,使用 表名 點(diǎn) 列名 的寫法因?yàn)楸碇锌赡軙邢嗤牧忻?/p>
第三步:結(jié)合需求進(jìn)一步增加條件,對結(jié)果進(jìn)行篩選;
此處需要增加的條件就是名字是凌華。
第四步:對列進(jìn)行精簡,篩選出需要展示的列
此時你再對照開頭的表達(dá)式就會發(fā)現(xiàn)一摸一樣,基本上所有的內(nèi)連接都可以套用這四大步。
select 字段 from 表1 [inner] join 表2 on 連接條件 and 其他條件;
select 字段 from 表1 ,表2 where 連接條件 and 其他條件;
注:第一條語句中的 [inner] join 中的 inner 之所以用 [] 括起來是因?yàn)?/strong>可以省略不寫。
外連接
如果多張表中的信息都存在對應(yīng)關(guān)系那么內(nèi)連接和外連接的結(jié)果就都是一樣的,如果表中的數(shù)據(jù)不對應(yīng)內(nèi)外連接就會出現(xiàn)差別。
外連接分為左外連接和右外連接。
例:有如下兩張數(shù)據(jù)沒有完全對應(yīng)的表
左外連接
select 字段 from 表1 left join 表2 on 連接條件 and 其他條件;
這個表達(dá)式除了 left 之外和內(nèi)連接都是相同的。
左外連接就是以左表為基礎(chǔ),如果左表有右表沒有那么就用 null 代替。
右外連接
select 字段 from 表1 right join 表2 on 連接條件 and 其他條件;
這個表達(dá)式除了 right 之外和左外連接都是相同的。
右外連接就是以右表為基礎(chǔ),如果右表有左表沒有那么就用 null 代替。
自連接
自連接就是自己和自己取笛卡爾積,和內(nèi)連接的解題方法相同。
注:在自連接中必須要給表取別名否則會報(bào)錯。
自連接的優(yōu)點(diǎn):可以將行與行之間的關(guān)系轉(zhuǎn)換成列與列。
例:在上述表中查詢出 C++ 成績大于單片機(jī)成績的人。
子查詢
子查詢本質(zhì)上就是‘套娃’,就是將多個簡單的sql語句嵌套成一個復(fù)雜的sql語句。
例:查找出名為可莉的學(xué)生在幾年級。
1.先找出可莉的班級號
2.根據(jù)班級號在班級表中找到班級名
而子查詢就是將這兩句sql語句嵌套起來
合并查詢
合并查詢是通過 union 來實(shí)現(xiàn)的
在MySQl中可以通過 union 來將多個表的查詢結(jié)果合并成一張表。
注:合并的兩個結(jié)果的對應(yīng)列之間列數(shù)和數(shù)據(jù)類型必須相同(列名系統(tǒng)會自動按照第一個表的列名),union 會去掉結(jié)果中的重復(fù)項(xiàng)。
例如查詢這兩張表中的 id 和 name 結(jié)果返回一張表;
在這張結(jié)果中只有一個 id = 1 的學(xué)生。
如果你不想對結(jié)果進(jìn)行去重處理,就可以使用 union all
如果對同一張表使用 union 那么它的結(jié)果會和使用 or 相同。
總結(jié)
到此這篇關(guān)于MySQL數(shù)據(jù)庫聚合查詢和聯(lián)合查詢的文章就介紹到這了,更多相關(guān)MySQL聚合查詢和聯(lián)合查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql啟動提示:錯誤2系統(tǒng)找不到指定文件的解決方案
這篇文章主要給大家介紹了mysql啟動提示:錯誤2系統(tǒng)找不到指定文件的解決方案,文中通過圖文結(jié)合的方式給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02MySQL 重裝MySQL后, mysql服務(wù)無法啟動
把mysql程序卸載后, 重裝, 結(jié)果mysql服務(wù)啟動不了,碰到這個問題的朋友可以參考下。2011-08-08MySQL數(shù)據(jù)權(quán)限的實(shí)現(xiàn)詳情
這篇文章主要介紹了MySQL數(shù)據(jù)權(quán)限的實(shí)現(xiàn)詳情,文章通過實(shí)際案例,從代碼實(shí)戰(zhàn)的角度來實(shí)現(xiàn)這樣的一個數(shù)據(jù)權(quán)限。具體詳細(xì)介紹,具有一定的參考價值2022-08-08MySQL數(shù)據(jù)庫表被鎖、解鎖以及刪除事務(wù)詳解
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫表被鎖、解鎖以及刪除事務(wù)的相關(guān)資料,需要的朋友可以參考下2022-05-05