MySQL中的聚合查詢和聯(lián)合查詢操作代碼
一、聚合查詢(行與行之間的計(jì)算)
1.常見(jiàn)的聚合函數(shù)有:
函數(shù) | 說(shuō)明 |
count | 查詢到的數(shù)據(jù)的數(shù)量 |
sum | 查詢到的數(shù)據(jù)的總和(針對(duì)數(shù)值,否則無(wú)意義) |
avg | 查詢到的數(shù)據(jù)的平均值(針對(duì)數(shù)值,否則無(wú)意義) |
max | 查詢到的數(shù)據(jù)的最大值(針對(duì)數(shù)值,否則無(wú)意義) |
min | 查詢到的數(shù)據(jù)的最小值(針對(duì)數(shù)值,否則無(wú)意義) |
Select count(*) from student(統(tǒng)計(jì)行數(shù)) Select count(1) from student(統(tǒng)計(jì)第一列數(shù)據(jù)的行數(shù),如果有null則不算行數(shù)) Select sum(math) from student(數(shù)學(xué)成績(jī)總分) Select sum(math) from student where math > 60(數(shù)學(xué)大于60的總分) Select avg(math+chinese+english) from student(統(tǒng)計(jì)平均總分) Select max(math) from student(數(shù)學(xué)最高分) Select min(math) from student where math >60(數(shù)學(xué)大于60的最低分)
2.group by
select 中使用 group by 子句可以對(duì)指定列進(jìn)行分組查詢。使用 group by 進(jìn)行分組查詢時(shí),select 指定的字段必須是“分組依據(jù)字段”,其他字段若想出現(xiàn)在select 中則必須包含在聚合函數(shù)中。
select column1, sum(column2), .. from table group by column1,column3; //示例:查詢每個(gè)角色的最高工資、最低工資和平均工資 Select role,max(salary),min(salary),avg(salary) from emp group by role;
3.having
group by 子句進(jìn)行分組以后,需要對(duì)分組結(jié)果再進(jìn)行條件過(guò)濾時(shí),不能使用 WHERE 語(yǔ)句,而需要用Having
//示例:顯示平均工資低于1500的角色和它的平均工資 select role,avg(salary) from emp group by role having avg(salary)<1500;
關(guān)于分組查詢指定條件有三種情況:
1.分組之前,指定條件(先篩選,再分組)用where
2.分組之后,指定條件(先分組,再篩選)用having
3.分組之前和分組之后都指定條件(先where后having)
關(guān)于執(zhí)行順序:

二、聯(lián)合查詢(多表查詢)
多表查詢是對(duì)多張表的數(shù)據(jù)取笛卡爾積,笛卡爾積是通過(guò)排列組合算出來(lái)的,因此包含了很多無(wú)效數(shù)據(jù),因此需要加上連接條件,用來(lái)篩選有效的數(shù)據(jù)。
1.進(jìn)行聯(lián)合查詢的步驟:
1.首先計(jì)算笛卡爾積
2.引入連接條件(如:where student.id = score.student_id)
3.再根據(jù)需求,加入必要的條件(where where student.id = score.student_id and student.name=’xxx’)
4.去掉多余的列,只保留需要關(guān)注的列(select student.name,score.score from student,score where where student.id = score.student_id and student.name=’xxx’)
2.內(nèi)連接(from,join on)
語(yǔ)法:
select 字段 from 表1 (as)別名1 [inner] join 表2 (as)別名2 on 連接條件 and 其他條件;
select 字段 from 表1 (as)別名1,表2 (as)別名2 where 連接條件 and 其他條件;
示例:查詢“張三”同學(xué)的成績(jī)
select sco.score from student as stu inner join score as sco on stu.id=sco.student_id and stu.name='張三';
或者
select sco.score from student as stu, score as sco where stu.id=sco.student_id and stu.name='張三';
3.外連接(left/right join on)
外連接分為左外連接和右外連接。如果聯(lián)合查詢,左側(cè)的表完全顯示我們就說(shuō)是左外連接;右側(cè)的表完全顯示我們就說(shuō)是右外連接。
語(yǔ)法:
左外連接,表1完全顯示
select 字段名 from 表名1 left join 表名2 on 連接條件;
右外連接,表2完全顯示
select 字段 from 表名1 right join 表名2 on 連接條件;
4.自連接
自連接是指在同一張表中連接自身進(jìn)行查詢。
示例:顯示所有“數(shù)學(xué)”成績(jī)比“語(yǔ)文”成績(jī)高的學(xué)生成績(jī)信息
先查詢“數(shù)學(xué)”和“語(yǔ)文”課程的id
select id,name from course where name='數(shù)學(xué)' or name='語(yǔ)文';
數(shù)學(xué)id=1;
語(yǔ)文id=2;
再查詢成績(jī)表中,“數(shù)學(xué)”成績(jī)比“語(yǔ)文”成績(jī) 好的信息
select s1.* from score s1,score s2 where s1.student_id = s2.student_id and s1.score > s2.score and s1.course_id = 1 and s2.course_id = 2;
5.子查詢
子查詢是指嵌入在其他sql語(yǔ)句中的select語(yǔ)句,也叫嵌套查詢。
單行子查詢:返回一行記錄的子查詢
select * from student where classes_id=(select classes_id from student where name='張三');
多行子查詢:返回多行記錄的子查詢
1.使用(not) in 關(guān)鍵字
使用 in
select * from score where course_id in (select id from course where
name='語(yǔ)文' or name='英文');
使用not in
select * from score where course_id not in (select id from course where
name!='語(yǔ)文' and name!='英文');
1.使用(not) exists 關(guān)鍵字
使用 exists
select * from score sco where exists (select sco.id from course cou
where (name='語(yǔ)文' or name='英文') and cou.id = sco.course_id);
使用 not exists
select * from score sco where not exists (select sco.id from course cou
where (name!='語(yǔ)文' and name!='英文') and cou.id = sco.course_id);
在from子句中使用子查詢,把一個(gè)子查詢當(dāng)做一個(gè)臨時(shí)表使用。(not)in是放在內(nèi)存中的,如果查詢的數(shù)據(jù)太大,內(nèi)存中放不下,此時(shí)就需要使用(not)exists。exists本質(zhì)上就是讓數(shù)據(jù)庫(kù)執(zhí)行多個(gè)查詢操作,并把結(jié)果放在磁盤中,因此對(duì)于exists來(lái)說(shuō),執(zhí)行效率大大低于in,而且可讀性也不是很好,這種比較適合處理一些特殊的場(chǎng)景。
6.合并查詢
合并查詢本質(zhì)上就是把兩個(gè)查詢結(jié)果集合并成一個(gè),但是要求這兩個(gè)結(jié)果集的列一樣,才能合并。即:
為了合并多個(gè)select的執(zhí)行結(jié)果,可以使用集合操作符 union,union all。使用union和union all時(shí),前后查詢的結(jié)果集中,字段需要一致。
1.union關(guān)鍵字
用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),會(huì)自動(dòng)去掉結(jié)果集中的重復(fù)行。
示例:
select?* from?course where?id<3 union select?* from?course where?name='英文';
或者使用or來(lái)實(shí)現(xiàn)
select?* from?course where?id<3 or?name='英文';
2.union all關(guān)鍵字
用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),不會(huì)去掉結(jié)果集中的重復(fù)行。
示例:
可以看到結(jié)果集中出現(xiàn)重復(fù)數(shù)據(jù)
select?* from?course where?id<3 union?all select?* from?course where?name='英文';
到此這篇關(guān)于MySQL中的聚合查詢和聯(lián)合查詢的文章就介紹到這了,更多相關(guān)mysql聚合查詢和聯(lián)合查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
阿里云ECS centos6.8下安裝配置MySql5.7的教程
阿里云默認(rèn)yum命令下的MySQL是5.17****,安裝mysql5.7之前先卸載以前的版本。下面通過(guò)本文給大家介紹阿里云ECS centos6.8下安裝配置MySql5.7的教程,需要的的朋友參考下吧2017-07-07
MySQL中出現(xiàn)亂碼問(wèn)題的終極解決寶典
這篇文章主要介紹了MySQL中出現(xiàn)亂碼問(wèn)題的終極解決寶典,包括編碼轉(zhuǎn)換和SQL數(shù)據(jù)進(jìn)出等方面,無(wú)比給力,極力推薦這篇精華翻譯!需要的朋友可以參考下2015-08-08
mysql InnoDB建表時(shí)設(shè)定初始大小的方法
這篇文章主要介紹了mysql InnoDB建表時(shí)設(shè)定初始大小的方法,需要大家到MYSQL后臺(tái)實(shí)際操作方可以看到效果2013-11-11
配置Mysql主從服務(wù)實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了配置Mysql主從服務(wù)實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
mysql字符集和校對(duì)規(guī)則(Mysql校對(duì)集)
字符集的概念大家都清楚,校對(duì)規(guī)則很多人不了解,一般數(shù)據(jù)庫(kù)開(kāi)發(fā)中也用不到這個(gè)概念,mysql在這方便貌似很先進(jìn),大概介紹一下2012-07-07
windows下mysql 8.0.16 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了windows下mysql 8.0.16 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
mysql的limit用法及邏輯分頁(yè)和物理分頁(yè)
本文主要介紹了mysql的limit用法及邏輯分頁(yè)和物理分頁(yè),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000)的原因及解決方法
網(wǎng)上查到的grant方式大多會(huì)報(bào)錯(cuò),主要原因是MySQL版本8.0后不能再使用原來(lái)的方式,這篇文章主要介紹了MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000),需要的朋友可以參考下2022-08-08
SQL中current_date()函數(shù)的實(shí)現(xiàn)
日期時(shí)間類型的數(shù)據(jù)也是經(jīng)常要用到的,SQL中也提供了一些函數(shù)對(duì)這些數(shù)據(jù)進(jìn)行處理,本文主要介紹了SQL中current_date()函數(shù)的實(shí)現(xiàn),具有一定的參考價(jià)值2024-02-02
MySQL數(shù)據(jù)庫(kù)刪除數(shù)據(jù)后自增ID不連續(xù)的問(wèn)題及解決
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)刪除數(shù)據(jù)后自增ID不連續(xù)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

