溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

MySQL中的聚合查詢(xún)和聯(lián)合查詢(xún)?cè)趺磳?shí)現(xiàn)

發(fā)布時(shí)間:2023-03-20 14:19:25 來(lái)源:億速云 閱讀:136 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“MySQL中的聚合查詢(xún)和聯(lián)合查詢(xún)?cè)趺磳?shí)現(xiàn)”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“MySQL中的聚合查詢(xún)和聯(lián)合查詢(xún)?cè)趺磳?shí)現(xiàn)”文章能幫助大家解決問(wèn)題。

一、聚合查詢(xún)(行與行之間的計(jì)算)

1.常見(jiàn)的聚合函數(shù)有:

函數(shù)

說(shuō)明

count

查詢(xún)到的數(shù)據(jù)的數(shù)量

sum

查詢(xún)到的數(shù)據(jù)的總和(針對(duì)數(shù)值,否則無(wú)意義)

avg

查詢(xún)到的數(shù)據(jù)的平均值(針對(duì)數(shù)值,否則無(wú)意義)

max

查詢(xún)到的數(shù)據(jù)的最大值(針對(duì)數(shù)值,否則無(wú)意義)

min

查詢(xún)到的數(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)行分組查詢(xún)。使用  group by 進(jìn)行分組查詢(xún)時(shí),select 指定的字段必須是“分組依據(jù)字段”,其他字段若想出現(xiàn)在select 中則必須包含在聚合函數(shù)中。

select column1, sum(column2), .. from table group by column1,column3;
//示例:查詢(xún)每個(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)于分組查詢(xún)指定條件有三種情況:

1.分組之前,指定條件(先篩選,再分組)用where

2.分組之后,指定條件(先分組,再篩選)用having

3.分組之前和分組之后都指定條件(先where后having)

關(guān)于執(zhí)行順序:

MySQL中的聚合查詢(xún)和聯(lián)合查詢(xún)?cè)趺磳?shí)現(xiàn)

二、聯(lián)合查詢(xún)(多表查詢(xún))

多表查詢(xún)是對(duì)多張表的數(shù)據(jù)取笛卡爾積,笛卡爾積是通過(guò)排列組合算出來(lái)的,因此包含了很多無(wú)效數(shù)據(jù),因此需要加上連接條件,用來(lái)篩選有效的數(shù)據(jù)。

1.進(jìn)行聯(lián)合查詢(xún)的步驟:

1.首先計(jì)算笛卡爾積

2.引入連接條件(如:where student.id = score.student_id)

3.再根據(jù)需求,加入必要的條件(where where student.id = score.student_id and student.name=&rsquo;xxx&rsquo;)

4.去掉多余的列,只保留需要關(guān)注的列(select student.name,score.score from student,score where where student.id = score.student_id and student.name=&rsquo;xxx&rsquo;)

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 其他條件;

示例:查詢(xún)“張三”同學(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)合查詢(xú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)行查詢(xún)。

示例:顯示所有“數(shù)學(xué)”成績(jī)比“語(yǔ)文”成績(jī)高的學(xué)生成績(jī)信息

先查詢(xún)“數(shù)學(xué)”和“語(yǔ)文”課程的id

select id,name from course where name='數(shù)學(xué)' or name='語(yǔ)文';

數(shù)學(xué)id=1;

語(yǔ)文id=2;

再查詢(xún)成績(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.子查詢(xún)

子查詢(xún)是指嵌入在其他sql語(yǔ)句中的select語(yǔ)句,也叫嵌套查詢(xún)。

單行子查詢(xún):返回一行記錄的子查詢(xún)

select * from student where classes_id=(select classes_id from student where name='張三');

多行子查詢(xún):返回多行記錄的子查詢(xún)

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子句中使用子查詢(xún),把一個(gè)子查詢(xún)當(dāng)做一個(gè)臨時(shí)表使用。(not)in是放在內(nèi)存中的,如果查詢(xún)的數(shù)據(jù)太大,內(nèi)存中放不下,此時(shí)就需要使用(not)exists。exists本質(zhì)上就是讓數(shù)據(jù)庫(kù)執(zhí)行多個(gè)查詢(xún)操作,并把結(jié)果放在磁盤(pán)中,因此對(duì)于exists來(lái)說(shuō),執(zhí)行效率大大低于in,而且可讀性也不是很好,這種比較適合處理一些特殊的場(chǎng)景。

6.合并查詢(xún)

合并查詢(xún)本質(zhì)上就是把兩個(gè)查詢(xún)結(jié)果集合并成一個(gè),但是要求這兩個(gè)結(jié)果集的列一樣,才能合并。即:

為了合并多個(gè)select的執(zhí)行結(jié)果,可以使用集合操作符 union,union all。使用union和union all時(shí),前后查詢(xún)的結(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中的聚合查詢(xún)和聯(lián)合查詢(xún)?cè)趺磳?shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI