關(guān)于Mysql子查詢的三個(gè)應(yīng)用場(chǎng)景
應(yīng)用場(chǎng)景
一個(gè)select語句的查詢結(jié)果能夠作為另一個(gè)語句的輸入值,主要有三種情況,分別為:
1.子查詢可以出現(xiàn)在Where子句中,作為過濾條件
select 列名
from 表名
where 列 操作符 (select 列名 from 表名)
2.也可以出現(xiàn)在from子句中,作為一個(gè)臨時(shí)表使用
select 列名
from (select 列名 from 表名)
3.能夠出現(xiàn)在select list中,作為一個(gè)字段值來返回
select 列名,(select 列名 from 表名)
from 表名
where 列 操作符?????
注意事項(xiàng):
- 子查詢只能有一個(gè)字段的情況
- 子查詢?cè)趕elect上面,一定是只能一個(gè)字段;如果超過一個(gè)字段,代碼會(huì)報(bào)錯(cuò)
- 子查詢?cè)趙here后面,當(dāng)做一個(gè)過濾條件,這個(gè)字段也必須有且只有一個(gè)
- 可以有多個(gè)字段的情況
- 當(dāng)子查詢?cè)趂rom后面,是可以有多個(gè)字段的,因?yàn)樗褪且粡埍恚?/li>
- 注意:子查詢?cè)趂rom后面做臨時(shí)表來用,必須給子查詢生成的臨時(shí)表取別名,否則會(huì)報(bào)錯(cuò)
- 時(shí)間型字符,在 where 過濾如果是常量,需要用''; 數(shù)字則不需要
- 子查詢中,表是可以不一樣的
???????子查詢?cè)赪here中作過濾條件
2017年7月2號(hào)統(tǒng)計(jì)累計(jì)購買金額在100到200的會(huì)員,尋找這批會(huì)員的消費(fèi)記錄
- 先找出當(dāng)日累計(jì)購買金額在100-200之間的會(huì)員 用having來篩選
- 用查找出來的會(huì)員做過濾條件,查找消費(fèi)記錄
-- 先找出當(dāng)日累計(jì)購買金額在100-200之間的會(huì)員 SELECT dimMemberID ,SUM(AMT) as money FROM dw.fct_sales where dimDateID ='20170702' and dimMemberID <> 0 group by dimMemberID -- having sum(AMT)>100 and sum(AMT)<200; having money BETWEEN 100 and 200; -- 用查找出來的會(huì)員做過濾條件,查找消費(fèi)記錄 SELECT * FROM dw.fct_sales where dimDateID = '20170702' and dimMemberID <>0 and dimMemberID in ( SELECT dimMemberID -- ,SUM(AMT) as money 子查詢?cè)趙here后面,當(dāng)做一個(gè)過濾條件,這個(gè)字段也必須有且只有一個(gè),所以最后結(jié)果要返回過濾條件 FROM dw.fct_sales where dimDateID ='20170702' and dimMemberID <> 0 group by dimMemberID having sum(AMT)>100 and sum(AMT)<200); -- having money BETWEEN 100 and 200 ); 不能直接用命名的列名money,要寫全函數(shù),因?yàn)榍懊嬲Z句沒有出現(xiàn)money,所以為了避免報(bào)錯(cuò),之后盡量寫全函數(shù)
子查詢?cè)趂rom中做臨時(shí)表
2017年7月2日對(duì)每位會(huì)員累計(jì)購買金額進(jìn)行分段
- 統(tǒng)計(jì)2017年7月2日每位會(huì)員的累計(jì)購買金額
- 把第一步統(tǒng)計(jì)出來的數(shù)據(jù)作為臨時(shí)表,對(duì)統(tǒng)計(jì)出來的數(shù)據(jù)進(jìn)行分組
-- 1、統(tǒng)計(jì)2017年7月2日每位會(huì)員的累計(jì)購買金額 SELECT dimMemberID ,SUM(AMT) as money FROM dw.fct_sales where dimDateID = '20170702' and dimMemberID <> 0 group by dimMemberID ; -- 2、把第一步統(tǒng)計(jì)出來的數(shù)據(jù)作為臨時(shí)表,對(duì)統(tǒng)計(jì)出來的數(shù)據(jù)進(jìn)行分段 SELECT dimMemberID ,money ,case when money <100 then 'D' when money >=100 and money <500 then 'C' when money >=500 and money <1000 then 'B' when money >=1000 then 'A' else '其它' end as type1 FROM (SELECT dimMemberID /*臨時(shí)表可以生成多個(gè)字段,并不是每個(gè)字段都需要用也行*/ ,SUM(AMT) as money FROM dw.fct_sales where dimDateID = '20170702' and dimMemberID <> 0 group by dimMemberID) as sn; /*子查詢?cè)趂rom后面做臨時(shí)表來用,必須給這個(gè)子查詢生成的臨時(shí)表取一個(gè)表的別名,否則會(huì)報(bào)錯(cuò)*/
子查詢?cè)趕elect作為一個(gè)字段來返回
2017年7月2日計(jì)算每個(gè)會(huì)員購買金額,以及每個(gè)會(huì)員購買金額占總體金額的比
- 2017年7月2日每個(gè)會(huì)員購買金額
- 總體金額
- 合并兩個(gè)表
注意:在合并時(shí)where的條件要寫全,不要遺漏,不然容易出現(xiàn)邏輯錯(cuò)誤
-- 1、2017年7月2日每個(gè)會(huì)員購買金額 SELECT dimMemberID ,SUM(AMT) as money FROM dw.fct_sales where dimDateID = '20170702' and dimMemberID <>0 /*去除非會(huì)員,即 dimMemberID 為 0 的數(shù)據(jù)*/ group by dimMemberID ; -- 2、總體金額 SELECT SUM(AMT) FROM dw.fct_sales where dimDateID = '20170702'; -- 3、合并兩個(gè)表 注意在合并時(shí)where的條件要寫全,不要遺漏,不然容易出現(xiàn)邏輯錯(cuò)誤 SELECT dimMemberID ,SUM(AMT) as money ,(SELECT SUM(AMT) /*統(tǒng)計(jì)總金額*/ FROM dw.fct_sales where dimDateID = '20170702' and dimMemberID<>0) as total_money ,CONCAT( /*加上%號(hào)*/ ROUND( /*四舍五入保留4位小數(shù),帶%一定要思考保留小數(shù)位數(shù)*/ SUM(AMT)/(SELECT SUM(AMT) FROM dw.fct_sales where dimDateID = '20170702' and dimMemberID<>0),4)*100,'%') as member_rate /*合并表,統(tǒng)計(jì)占比*/ FROM dw.fct_sales where dimDateID = '20170702' and dimMemberID <>0 /*去除非會(huì)員,即 dimMemberID 為 0 的數(shù)據(jù)*/ group by dimMemberID ;
到此這篇關(guān)于關(guān)于Mysql子查詢的三個(gè)應(yīng)用場(chǎng)景的文章就介紹到這了,更多相關(guān)Mysql子查詢應(yīng)用場(chǎng)景內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sqoop export導(dǎo)出 map100% reduce0% 卡住的多種原因及解決
這篇文章主要介紹了sqoop export導(dǎo)出 map100% reduce0% 卡住的多種原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01MySQL數(shù)據(jù)庫遷移快速導(dǎo)出導(dǎo)入大量數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于MySQL數(shù)據(jù)庫遷移快速導(dǎo)出導(dǎo)入大量數(shù)據(jù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03詳解MySQL主從復(fù)制實(shí)戰(zhàn) - 基于GTID的復(fù)制
本篇文章主要介紹了MySQL主從復(fù)制實(shí)戰(zhàn) - 基于GTID的復(fù)制,基于GTID的復(fù)制是MySQL 5.6后新增的復(fù)制方式.有興趣的可以了解一下。2017-03-03MySQL 千萬級(jí)數(shù)據(jù)量如何快速分頁
這篇文章主要介紹了MySQL 千萬級(jí)數(shù)據(jù)量如何快速分頁,幫助大家提高M(jìn)ySQL數(shù)據(jù)庫的性能,感興趣的朋友可以了解下2020-09-09利用frm和ibd文件恢復(fù)mysql表數(shù)據(jù)的詳細(xì)過程
總是遇到mysql服務(wù)意外斷開之后導(dǎo)致mysql服務(wù)無法正常運(yùn)行的情況,使用Navicat工具查看能夠看到里面的庫和表,但是無法獲取數(shù)據(jù)記錄,提示數(shù)據(jù)表不存在,所以本文給大家介紹了利用frm和ibd文件恢復(fù)mysql表數(shù)據(jù)的詳細(xì)過程,需要的朋友可以參考下2024-04-04