您好,登錄后才能下訂單哦!
這篇文章主要介紹“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)題。
函數(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的最低分)
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;
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í)行順序:
多表查詢(xún)是對(duì)多張表的數(shù)據(jù)取笛卡爾積,笛卡爾積是通過(guò)排列組合算出來(lái)的,因此包含了很多無(wú)效數(shù)據(jù),因此需要加上連接條件,用來(lái)篩選有效的數(shù)據(jù)。
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’)
語(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='張三';
外連接分為左外連接和右外連接。如果聯(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 連接條件;
自連接是指在同一張表中連接自身進(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;
子查詢(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)景。
合并查詢(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)。
免責(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)容。