最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL進階查詢、聚合查詢和聯(lián)合查詢

 更新時間:2023年04月12日 08:57:15   作者:二月知野  
這篇文章主要介紹了MySQL數(shù)據(jù)庫的進階查詢,聚合查詢及聯(lián)合查詢,文中有詳細的代碼示例,需要的朋友可以參考閱讀

1. 前言

文章主要圍繞著以下三個問題:

  1. group by的作用
  2. where與having的區(qū)別
  3. 表的連接分為哪些,分別是什么作用

2. 表的設計

在創(chuàng)建數(shù)據(jù)表時,我們通常時根據(jù)需求找到"實體", 梳理"實體"之間的關系,從而進行創(chuàng)建.
"實體"之間可能會有以下幾種關系:1.沒關系 2.一對一 3.一對多 4.多對多.
沒關系應該是最好理解的,就是單獨的一張表,并不涉及到其它的表.

2.1 一對一

一對一的關系在生活中是很常見的,例如每個學生都有屬于自己的學號,每個學號就只對應一個學生. 類似于這樣的情況,就是一對一的關系.
此時就可以創(chuàng)建兩張表,一個是學生表,另一個是學號表. 學生表里的學號就可以和學號表中的學號關聯(lián)起來.

2.2 一對多

學生在學校上課時,會有一個班級. 但是一個班級可以有多個學生. 這就是一對多的關系.

2.3 多對多

舉個例子,我們在學習課程時,可以選擇多門課程進行學習,而課程也可以被多個學生進行選擇. 這就是多對多的關系.
多對多的關系,在創(chuàng)建表時,可以使用"關聯(lián)表" 將兩個實體聯(lián)系起來.

如果在設計數(shù)據(jù)庫表時,場景很復雜,可以使用ER圖幫助我們更好的創(chuàng)建數(shù)據(jù)庫表.

3.將查詢結果放到另一個表中

insert into 表2 select 字段 from 表1;
# 表2 是要存放查詢結果的表
# 表1 是要查詢的表
# 查詢結果的列要和表2的列相匹配!
# 也可以將查詢結果存放在表2的指定列中

示例:

下面這個"student1"這個表中,有三條數(shù)據(jù).

在這里插入圖片描述

接下來我們把查詢結果放到一張新的 "student2"這個表中

在這里插入圖片描述

4. 聚合查詢

聚合查詢可以進行"行"與"行"之間的運算

4.1 聚合函數(shù)

函數(shù)說明
COUNT([DISTINCT] expr)返回查詢到的數(shù)據(jù)的 數(shù)量
SUM([DISTINCT] expr)返回查詢到的數(shù)據(jù)的 總數(shù)
AVG([DISTINCT] expr)返回查詢到的數(shù)據(jù)的 平均值
MAX([DISTINCT] expr)返回查詢到的數(shù)據(jù)的 最大值
MIN([DISTINCT] expr)返回查詢到的數(shù)據(jù)的 最小值
  • count函數(shù) 可以對行進行計算,也可以對列進行計算.

示例:

在這里插入圖片描述

這里有一張學生表,里面有學生的id,姓名,語數(shù)英三科的成績.

在這里插入圖片描述

  • sum,avg,max和min 都是只對數(shù)字生效,如果不是數(shù)字則沒有意義

sum函數(shù)的用法和count函數(shù)類似. 不過只能計算"列",如果這一列存在"null",則不會參與運算
avg,max,min的用法 和 sum 類似,就不一一介紹了

4.2 GROUP BY

GROUP BY 語句用于結合合計函數(shù),根據(jù)一個或多個列對結果集進行分組。

例如:

在這里插入圖片描述

在我的學生表中有這樣一些數(shù)據(jù).現(xiàn)在我要對語文成績進行分組
使用group by之后,我們可以看到這已經(jīng)以語文成績進行分組了

在這里插入圖片描述

成績?yōu)?7的有一個,69的有兩個,82的有三個

需要注意的是:在進行查詢分組的時候,只有分組的這一列,可以查詢,其它列必須搭配聚合函數(shù)來進行查詢

4.3 HAVING

分組查詢還可以指定條件,這里的只當條件可以分組之前指定還可以分組之后指定 分組前進行篩選使用的是where 分組后進行篩選使用的則是having SQL 中增加 HAVING 子句原因就是因為WHERE 關鍵字無法與合計函數(shù)一起使用。

去除id=1的語文成績后進行分組

在這里插入圖片描述

分組之后篩選出語文成績>60分的學生數(shù)量

在這里插入圖片描述

where 關鍵字雖然無法與合計函數(shù)一起使用,但是可以和having一起使用

5. 聯(lián)合查詢(多表查詢)

聯(lián)合查詢一般是在多表之間建立連接后查詢的過程.其實就是計算"笛卡爾積"的過程
但是當表很大的時候,如果進行聯(lián)合查詢,效率就會特別低.因為"笛卡爾積"就是簡單的排列組合,有些數(shù)據(jù)是"合理"的,有些數(shù)據(jù)是"不合理"的.所以我們就要把"有效"的數(shù)據(jù)篩選出來.因此聯(lián)合查詢通常需要加連接條件和其它篩選條件

5.1 內連接

內連接得到的是兩張表中都存在的數(shù)據(jù)
兩種寫法:

select 字段 from 表1,表2;
select 字段 from 表1 join 表2 on 條件;

舉個例子:

學生表:

在這里插入圖片描述

班級表:

在這里插入圖片描述

要求查詢"王五"的班級的名字.
這就涉及到了兩張表,就需要使用聯(lián)合(多表)查詢.

1.首先進行笛卡爾積

在這里插入圖片描述

其實就是學生表和班級表進行排列組合,里面有很多無效的數(shù)據(jù).

2. 添加連接條件

在這里插入圖片描述

注意這里的條件寫法,應該是表名.字段名,因為涉及到多個表,多個表中的字段名可能相同,因此需要使用 表名.字段 表明是哪個表中的字段.當然如果這個列名是唯一的,也可以不加 表名.

在這里插入圖片描述

剛才的結果還是太多了,我們也可以加上指定列進行查詢,同樣需要使用表名.字段的形式進行查詢

使用join on也可以實現(xiàn)相同的效果,同樣是剛才的例子
使用join on的方式來完成

1.首先進行笛卡爾積

在這里插入圖片描述

2. 添加條件

在這里插入圖片描述

直接寫join或者inner join就是內連接
join on不僅可以實現(xiàn)內連接,還可以實現(xiàn)外連接

5.2 外連接

外連接分為左外連接(left join)和右外連接(right join)

還是剛才的學生表:

在這里插入圖片描述

但班級表中多有兩條數(shù)據(jù)

在這里插入圖片描述

進行笛卡爾積后得到的結果

在這里插入圖片描述

這是內連接得到的結果:

在這里插入圖片描述

這個是進行右連接得到的結果

在這里插入圖片描述

右連接會把右側表中的數(shù)據(jù)都獲取到,即使左邊的值是NULL,也會顯示出來
左連接也是類似,會把左側表中的數(shù)據(jù)都獲取到,即使右邊的值是NULL,也會顯示出來.

如果兩張表中的數(shù)據(jù),在對方表中都有,那么此時內外連接是沒有區(qū)別的,如果兩張表中的數(shù)據(jù)只有一部分在對方的表中,內連接就是獲取兩張表的"交集",如果是外連接,那么獲取到的值就是一側表的全部記錄.

還有一種連接是"全外連接",但是在MySQL中并不支持

5.3 自連接

自連接就是和自己進行笛卡爾積
在條件查詢中,只是"列"和"列"之間的比較,但是有的地方需要用的 "行"和"行"之間的比較,就需要使用自連接,將"行"轉為"列"再進行比較

例如這里有一張成績表

在這里插入圖片描述

如果要查詢數(shù)學成績比語文成績高的同學的名字,就需要使用自連接.因為如果進行比較,那么就是"行"和"行"進行的比較

在這里插入圖片描述

可以看到,如果是直接進行連接,那么是會報錯的.
Not unique table/alias: 'grades': 這句話告訴我們不是唯一的表,但是可以起別名

在這里插入圖片描述

通過起別名的方式,成功進行自連接
加上連接條件,先篩選出一部分記錄,此時我們可以看到語文成績和數(shù)學成績就在兩列了

在這里插入圖片描述

將條件補全,就可以得到我們想要的結果了

在這里插入圖片描述

5.4 子查詢

子查詢本質就是將多個查詢語組合成一個SQL語句,例如在查詢得到的臨時表上再次進行查詢

例如:在班級表中,找到與"張三"班級相同的同學

在這里插入圖片描述

查到"張三"的班級id這個想必大家都會

在這里插入圖片描述

我們要將得到的這個結果繼續(xù)參與查詢:

在這里插入圖片描述

此時就得到"李四"同學的這條記錄了,因為這里的班級id就只有一個,所以后面使用的是 = ,但是如果這個的臨時表數(shù)據(jù)有多條,就可以使用 in 來完成

5.5 合并查詢

合并查詢是把兩個查詢的結果集合合并到一起,使用的是union 和union all 這兩個關鍵字

union: 如果有重復的數(shù)據(jù),就會去重union all: 如果有重復的數(shù)據(jù),則不會去重

還是剛才的分數(shù)表

在這里插入圖片描述

如果我們要查詢數(shù)學成績>90和英語成績<60的人的姓名,就可以使用合并查詢

在這里插入圖片描述

6. 總結

在SQL語句中,查詢數(shù)據(jù)的操作與其它操作語句相比還是有一些難度的,主要涉及到一些多表查詢等操作.對于里面涉及到的一些關鍵字,連接類型要熟練掌握

以上就是MySQL進階查詢、聚合查詢和聯(lián)合查詢的詳細內容,更多關于MySQL進階、聚合、聯(lián)合查詢的資料請關注腳本之家其它相關文章!

相關文章

  • MySQL系列之七 MySQL存儲引擎

    MySQL系列之七 MySQL存儲引擎

    存儲引擎是數(shù)據(jù)庫的核心,對于mysql來說,存儲引擎是以插件的形式運行的。雖然mysql支持種類繁多的存儲引擎,但是常用的就那么幾種。這篇文章主要給大家介紹MySQL存儲引擎的相關知識,一起看看吧
    2021-07-07
  • MAC下MySQL忘記初始密碼怎么辦

    MAC下MySQL忘記初始密碼怎么辦

    MySQL初始密碼忘記怎么辦,這篇文章主要介紹了MAC下MySQL忘記初始密碼的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • MySQL存儲過程未執(zhí)行的問題排查過程

    MySQL存儲過程未執(zhí)行的問題排查過程

    文章講述了對 MySQL 存儲過程未執(zhí)行的問題排查過程,先后排查了數(shù)據(jù)庫版本升級、用戶權限不足,最終發(fā)現(xiàn)是存儲過程創(chuàng)建時的 SQL 模式導致,即使之后去掉該模式,存儲過程內部仍沿用舊模式,重新創(chuàng)建存儲過程后問題解決,需要的朋友可以參考下
    2025-02-02
  • mysql增加和刪除索引的相關操作

    mysql增加和刪除索引的相關操作

    下面小編就為大家?guī)硪黄猰ysql增加和刪除索引的相關操作。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Mysql出生日期轉換為年齡并分組統(tǒng)計人數(shù)的方法示例

    Mysql出生日期轉換為年齡并分組統(tǒng)計人數(shù)的方法示例

    這篇文章主要給大家介紹了關于Mysql出生日期轉換為年齡并分組統(tǒng)計人數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Mysql中TIMESTAMPDIFF函數(shù)的語法與練習案例

    Mysql中TIMESTAMPDIFF函數(shù)的語法與練習案例

    在應用時經(jīng)常要使用這兩個函數(shù)TIMESTAMPDIFF和TIMESTAMPADD,下面這篇文章主要給大家介紹了關于Mysql中TIMESTAMPDIFF函數(shù)的語法與練習案例的相關資料,需要的朋友可以參考下
    2022-09-09
  • MySQL常用分庫分表方案匯總

    MySQL常用分庫分表方案匯總

    本文主要介紹了MySQL常用分庫分表方案匯總,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 生產環(huán)境的MySQL事務隔離級別方式

    生產環(huán)境的MySQL事務隔離級別方式

    本文探討了MySQL數(shù)據(jù)庫在RR(可重復讀)和RC(讀已提交)隔離級別下的鎖機制,在RR級別下,UPDATE語句會鎖定所有符合條件的行,包括不符合條件的行,以防止幻讀,而在RC級別下,UPDATE語句僅鎖定符合條件的行,通過半一致性讀優(yōu)化,可以進一步提高并發(fā)度
    2025-02-02
  • mysql查找刪除表中重復數(shù)據(jù)方法總結

    mysql查找刪除表中重復數(shù)據(jù)方法總結

    在本篇文章中小編給大家整理了關于mysql查找刪除表中重復數(shù)據(jù)方法和相關知識點,需要的朋友們參考下。
    2019-05-05
  • mysql使用mysql.help_topic表實現(xiàn)一行轉多行的實現(xiàn)示例

    mysql使用mysql.help_topic表實現(xiàn)一行轉多行的實現(xiàn)示例

    本文主要介紹了mysql使用mysql.help_topic表實現(xiàn)一行轉多行的實現(xiàn)示例,通過使用SUBSTRING_INDEX函數(shù),可以將逗號分隔的字符串拆分成多行,感興趣的可以了解一下
    2025-02-02

最新評論

汾西县| 景宁| 渝中区| 凤台县| 普陀区| 伊吾县| 墨脱县| 桓台县| 集安市| 三门县| 迭部县| 尉氏县| 彰化县| 沈丘县| 南城县| 南华县| 乌鲁木齐县| 洪洞县| 余江县| 泸定县| 江北区| 永福县| 祁东县| 巴东县| 双峰县| 五大连池市| 忻城县| 肥西县| 沿河| 乡城县| 应城市| 红安县| 承德县| 巴青县| 凉城县| 台湾省| 四川省| 故城县| 漳州市| 淳化县| 三江|