今天是開學(xué)前的最后一天啦~~ 感覺有點(diǎn)魔幻~總結(jié)一下這個(gè)寒假~去了長沙~生了一次病咙俩,喉嚨失聲講不出話壮锻,但很開心!因?yàn)槭歉類鄣娜艘黄鸨睹遥词股∫灿性谝黄穑_心~然后斷斷續(xù)續(xù)做了十天sql课舍,真的有進(jìn)步誒塌西!我感覺我從一個(gè)只知道最基礎(chǔ)語法的小小白,成長成對這些類型題目都有思路的小白了筝尾!但是還沒有到很棒的地步所以還要繼續(xù)刷題~ 接下來的目標(biāo)是學(xué)會如何使用變量捡需,老實(shí)說每次看到評論題解有變量的做法都被我跳過了,因?yàn)槲矣X得自己看不懂筹淫,但居然又沒有花時(shí)間去學(xué)站辉!這太可惡了,哈哈哈哈哈!饰剥!所以下一個(gè)階段要學(xué)習(xí)變量的用法殊霞,然后刷完所有題目之后,就是要整理一下經(jīng)典類型題和對應(yīng)思路汰蓉,當(dāng)然绷蹲,還有要整理出超難題的思路!好啦顾孽,小目標(biāo)碎碎念結(jié)束祝钢,希望這個(gè)當(dāng)事人可以說到做到awwwww!現(xiàn)在剛好耳機(jī)里是gala的《young for you》若厚,感覺自己好年輕拦英,哈哈哈哈哈~熊熊燃起的年輕奮斗魂~
廢話太多啦,一起來看看今天有什么題目吧~
闖關(guān)開始盹沈!
關(guān)卡1 -產(chǎn)品銷售分析 I
思路:
這道題比較基礎(chǔ)龄章,就是用inner join找出兩個(gè)表共有的,就可以啦~~~
select?p.product_name,?s.year, s.price?from?product?p
inner?join?sales?s
on?s.product_id?=?p.product_id
order?by?s.year
恭喜過關(guān)乞封!進(jìn)入下一關(guān)做裙!
關(guān)卡2 -產(chǎn)品銷售分析 II
思路:
這道題也比較基礎(chǔ)!肃晚!就是要group by product id 然后把同一個(gè)product id的quantity sum起來~~
select?product_id,?sum(quantity)?as?total_quantity?from?sales
group?by?product_id
恭喜過關(guān)锚贱!進(jìn)入下一關(guān)!
關(guān)卡3 -?產(chǎn)品銷售分析 III
思路:
這道題可以用窗口函數(shù)关串,思路是當(dāng)rank()?over?(partition?by?product_id )= 1 , 說明他們是第一次出現(xiàn)拧廊,那我們就篩選出這部分的年份,這樣就可以啦
select?distinct?product_id,?year?as?'first_year',?quantity,?price?
from?(select?*,rank()?over?(partition?by?product_id?order?by?year)as rk from?sales)as?a
where rk =?1
也可以通過group by product_id 然后選min(year)來篩選出第一次購買的年份晋修。
select?distinct?product_id,?year?as?'first_year',?quantity,?price?
from?sales
where(product_id,year)
in?
(select?product_id,min(year)?as?year?
from?sales?
group?by?product_id?)
恭喜過關(guān)吧碾!進(jìn)入下一關(guān)!
關(guān)卡4 -項(xiàng)目員工 I
思路:
這道題的思路是墓卦,group by project_id然后在最開始算avg倦春,記得要加一個(gè)round~
一開始我自作聰明用了round的窗口函數(shù),但是我錯(cuò)了落剪,因?yàn)槟菢拥脑捗恳桓鱡mployee都會有一個(gè)結(jié)果睁本,而不是每一個(gè)項(xiàng)目有一個(gè)結(jié)果,如下圖所示:
所以忠怖,直接用最普通的寫法就可以啦:
select?p.project_id,round(avg(e.experience_years),2)as?average_years?from?project?p
join?employee?e
where?p.employee_id?=?e.employee_id
group?by?project_id
恭喜過關(guān)呢堰!進(jìn)入下一關(guān)!
關(guān)卡5 -?項(xiàng)目員工II
思路:
這道題一開始我做的是直接group by, having, order by, limit凡泣, 但是發(fā)現(xiàn)是錯(cuò)的枉疼,因?yàn)橛胁⒘械那闆r出現(xiàn)皮假!
所以就要再做一個(gè)查詢,讓having?count(employee_id)?=最大值
下次遇到這種求最大的問題往衷,記得要這么做比較保險(xiǎn)噢钞翔!
select?project_id?from?project
group?by?project_id
having?count(employee_id)?= (select?count(employee_id)?from?project
group?by?project_id
order?by?count(employee_id)?desc?limit?1)
恭喜過關(guān)!進(jìn)入下一關(guān)席舍!
關(guān)卡6 -?項(xiàng)目員工 III
思路:
這道題跟上一道題一樣布轿,要考慮并列的情況出現(xiàn),所以我們要再做一層查詢~
我們的思路是来颤,當(dāng) (p.project_id,e.experience_years) 在(select?p.project_id,max(e.experience_years) group by project_id )里面汰扭,說明是我們想要的輸出
值得注意的是,這里不可以單獨(dú)寫 where (experience_year) in (select max(experience_year)) 因?yàn)楦GΓ覀兛吹氖歉鶕?jù)每個(gè)項(xiàng)目分別看的萝毛,所以如過單獨(dú)只有experience year ,就錯(cuò)了滑黔!
select?p.project_id,?e.employee_id
from?project?p?left?join?employee?e
on?p.employee_id?=?e.employee_id
where?(p.project_id,e.experience_years)?in
(select?p.project_id,max(e.experience_years)?from?employee?e
left?join?project?p?on?p.employee_id?=?e.employee_id
group?by?project_id)
恭喜過關(guān)笆包!進(jìn)入下一關(guān)!
關(guān)卡7 - 銷售分析 I
思路:
這道題尋找銷售量最高的消費(fèi)者略荡,思路可以是我們經(jīng)常做的那樣庵佣,先group by seller_id 然后 having sum(price) = (select sum(price) from sales group by seller_id order by sum(price) desc limit 1),?
但也可以用另外一種語句,也就是all 和 any 語句汛兜。
我們先來看看all 和 any的用法:
all:
select * from student where 班級=’01’ and age > all (select age from student where 班級=’02’);
就是說巴粪,查詢出01班中,年齡大于 02班所有人的同學(xué)
相當(dāng)于
select * from student where 班級=’01’ and age > (select max(age) from student where 班級=’02’);
而any:
select * from student where 班級=’01’ and age > any (select age from student where 班級=’02’);
就是說粥谬,查詢出01班中肛根,年齡大于 02班任意一個(gè) 的 同學(xué)
相當(dāng)于
select * from student where 班級=’01’ and age > (select min(age) from student where 班級=’02’);
另外,關(guān)于運(yùn)算符漏策,我們可以參考下面這張圖:
所以派哲,我們這道題要做的就是,用all語句掺喻,篩選出sum(price)? 等于集合中的最大值芭届,那根據(jù)上面這張圖,我們不可以直接 = all()巢寡,而是應(yīng)該>= 喉脖,因?yàn)檫@樣才是選出等于最大值的值~~~~(學(xué)到了R丁)
所以這道題我們就這么寫:
select?seller_id?from?sales?
group?by?seller_id
having?sum(price)?>=?all(select?sum(price)?from?sales?group?by?seller_id?)
恭喜過關(guān)抑月!進(jìn)入下一關(guān)!
關(guān)卡8 -銷售分析 II
思路:
這道題我們可以使用group_concat() 函數(shù)
首先看看group concat是什么:
group_concat()函數(shù)?功能:將group?by產(chǎn)生的同一個(gè)分組中的值連接起來,返回一個(gè)字符串結(jié)果舆蝴。
也就是說谦絮,如果一個(gè)顧客買了S8 和 iphone题诵, group_concat(product_id) 之后就會是“S8,iphone”
所以我們用這個(gè)函數(shù)层皱,先group by product name. 在having里面限制她有s8字段性锭,并且沒有iphone字段,就大功告成啦~
select?s.buyer_id?from?sales?s
join?product?p
on?s.product_id?=?p.product_id
group?by?s.buyer_id
having?group_concat(p.product_name)?like?'%S8%'?and?group_concat(p.product_name)?not?like?'%iPhone%'
恭喜過關(guān)叫胖!
今天學(xué)到的新知識:當(dāng)rank()?over?(partition?by?product_id )= 1 , 說明他們是第一次出現(xiàn)草冈;partition by 分組總行書不變;遇到求最大的問題瓮增,記得要做子查詢更保險(xiǎn)怎棱,因?yàn)橛兄睾系淖畲笾担粀here xxx in 的時(shí)候記得要想清楚xxx的組合绷跑;all 和 any運(yùn)算符拳恋,? >= 的時(shí)候就是求出大于或等于最大值的部分;group_concat()函數(shù)功能是將group?by產(chǎn)生的同一個(gè)分組中的值連接起來,返回一個(gè)字符串結(jié)果砸捏。
真的十天了誒~~谬运!開心~~當(dāng)然,還是要繼續(xù)努力滴垦藏!