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