diff --git "a/27\345\217\267\350\265\265\346\265\251\346\225\217/\347\254\254\345\233\233\346\254\241\344\275\234\344\270\232\347\254\224\350\256\260/9-21\344\275\234\344\270\232/9\346\234\21021\345\217\267\344\275\234\344\270\232.sql" "b/27\345\217\267\350\265\265\346\265\251\346\225\217/\347\254\254\345\233\233\346\254\241\344\275\234\344\270\232\347\254\224\350\256\260/9-21\344\275\234\344\270\232/9\346\234\21021\345\217\267\344\275\234\344\270\232.sql" new file mode 100644 index 0000000000000000000000000000000000000000..b2fa393fbf16de374750db5552276e9b85a01815 --- /dev/null +++ "b/27\345\217\267\350\265\265\346\265\251\346\225\217/\347\254\254\345\233\233\346\254\241\344\275\234\344\270\232\347\254\224\350\256\260/9-21\344\275\234\344\270\232/9\346\234\21021\345\217\267\344\275\234\344\270\232.sql" @@ -0,0 +1,92 @@ +--13. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 +select * from Student; +select * from Course; +select * from Teacher; +select * from SC +select AVG(score) 平均成绩,SUM(score) 所有课程的成绩 from SC +GROUP BY SId +order by 平均成绩 desc + + + + +--14. 查询各科成绩最高分、最低分和平均分: + +select MAX(score) 最高分,MIN(score)最低分,AVG(score) 平均分,Course.Cname from SC +join Course on Course.CId=SC.CId +group by Course.Cname + + + +--以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 + +--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 +SELECT +cid AS 课程ID, +COUNT(sid) AS 课程人数, +MAX(score) AS 最高分, +MIN(score) AS 最低分, +AVG(score) AS 平均分, +SUM(及格)/COUNT(sid) 及格率, +SUM(中等) / COUNT(sid) AS 中等率, +SUM(优良) / COUNT(sid) AS 优良率, +SUM(优秀) / COUNT(sid) AS 优秀率 +FROM +(SELECT SC.*, +CASE WHEN score >= 60 THEN 1 ELSE 0 END AS 及格, +CASE WHEN score >= 70 AND score<80 THEN 1 ELSE 0 END AS 中等, +CASE WHEN score >= 80 AND score<90 THEN 1 ELSE 0 END AS 优良, +CASE WHEN score >= 90 THEN 1 ELSE 0 END AS 优秀 +FROM SC) a +GROUP BY cid +ORDER BY COUNT(sid) DESC,cid + + +--要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 + +--15. 按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 +select * from Student; +select * from Course; +select * from Teacher; + + +SELECT a.*, COUNT(a.score) AS 排名 FROM SC AS a +LEFT JOIN SC AS b ON a.cid = b.cid AND a.score < b.score +GROUP BY a.cid,a.sid,a.score +ORDER BY a.cid,排名 + +--15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次 + +select cid 学科,score 成绩 ,rank() over (partition by cid order by score desc ) as 排名 from SC + + +--16. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺 +select a.*, @rank :=@rank +1 as rank from ( + SELECT sid,SUM(score) FROM sc GROUP BY sid ORDER BY SUM(score) DESC +) a,(select :=0) b; + + + SELECT sid,SUM(score) FROM sc GROUP BY sid ORDER BY SUM(score) DESC +--16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺 + +https://zhuanlan.zhihu.com/p/86181585 + +SELECT + a.*, + CASE + WHEN @fscore = a.sumscore + THEN @rank + WHEN @fscore := a.sumscore + THEN @rank := @rank + 1 + END AS 排名 +FROM + (SELECT + sc.sid, + SUM(score) AS sumscore + FROM + sc + GROUP BY sid + ORDER BY SUM(score) DESC) AS a, + (SELECT + @rank := 0, + @fscore := NULL) AS t ; \ No newline at end of file diff --git "a/27\345\217\267\350\265\265\346\265\251\346\225\217/\347\254\254\345\233\233\346\254\241\344\275\234\344\270\232\347\254\224\350\256\260/9-21\347\254\224\350\256\260/9\346\234\21021\345\217\267\347\254\224\350\256\260.md" "b/27\345\217\267\350\265\265\346\265\251\346\225\217/\347\254\254\345\233\233\346\254\241\344\275\234\344\270\232\347\254\224\350\256\260/9-21\347\254\224\350\256\260/9\346\234\21021\345\217\267\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..cdef1069cf838299ad681680fe05ebae3d53310c --- /dev/null +++ "b/27\345\217\267\350\265\265\346\265\251\346\225\217/\347\254\254\345\233\233\346\254\241\344\275\234\344\270\232\347\254\224\350\256\260/9-21\347\254\224\350\256\260/9\346\234\21021\345\217\267\347\254\224\350\256\260.md" @@ -0,0 +1,318 @@ +# SQL涓湁涓夌鎺掑簭鍑芥暟 + +1銆乺ow_number() over(order by 鍒楀悕) +2銆乺ank() over(order by 鍒楀悕) +3銆乨ense_rank() over(order by 鍒楀悕) + +row_number():涓嶈冭檻鏁版嵁鐨勯噸澶嶆э紝鎸夌収椤哄簭涓娆℃墦涓婃爣鍙 +濡傦細1 2 3 4 +rank():鏄烦璺冩帓搴 +濡傦細1 2 2 4,浼氳烦杩3 +dense_rank():鏄繛缁帓搴忥紝鑰冭檻鏁版嵁鐨勯噸澶嶆 +濡傦細1 2 2 3 搴忓彿杩炵画 + +# 鍏宠仈鏌ヨ + +鏈変竴浜涙柟娉曞彲浠ュ皢澶栭儴鏌ヨ鐨勫煎悎骞跺埌瀛愭煡璇㈢殑瀛愬彞涓傝繖浜涚被鍨嬬殑鏌ヨ绉颁负鍏宠仈瀛愭煡璇紝鍥犱负瀛愭煡璇㈢殑缁撴灉浠ユ煇绉嶅舰寮忚繛鎺ュ埌澶栭儴鏌ヨ涓殑鍊笺傚畠浠湁鏃剁О涓哄悓姝ユ煡璇€ + +濡傛灉鎮ㄤ笉鐭ラ亾鐩稿叧鐨勫惈涔夛紝璇锋煡鐪婫oogle鐨勪互涓嬪畾涔夛細 + +鍏宠仈锛氣滃叿鏈夌浉浜掑叧绯绘垨鑱旂郴锛屽叾涓竴浠朵簨*褰卞搷鎴栦緷璧*浜庡彟涓浠朵簨銆傗 锛圼google](https://www.google.com/search?q=correlate&oq=correlate)锛 + +鍏宠仈瀛愭煡璇㈢殑鍏稿瀷鐢ㄦ硶鏄湪鍐呴儴鏌ヨ鐨刉HERE瀛愬彞涓娇鐢ㄥ閮ㄦ煡璇㈢殑鍒椾箣涓銆傚湪璁稿鎯呭喌涓嬶紝鎮ㄥ笇鏈涘皢鍐呴儴鏌ヨ闄愬埗涓烘暟鎹瓙闆嗭紝杩欐槸甯歌瘑銆 + +## 渚嬪瓙 + +鎴戜滑灏嗘彁渚涗竴涓浉鍏崇殑瀛愭煡璇㈢ず渚嬶紝閫氳繃鎶ュ憡姣忎釜瀛愭煡璇alesOrderDetail LineTotal锛岃孉verage LineTotal浠h〃鏁翠綋Sales Order銆 + +***\*姝よ姹備笌鎴戜滑涔嬪墠鐨勭ず渚嬫湁寰堝ぇ涓嶅悓锛屽洜涓烘垜浠绠楃殑骞冲潎鍊煎洜姣忎釜閿鍞鍗曡屽紓銆俓**** + +杩欏氨鏄叧鑱斿瓙鏌ヨ鍙戞尌浣滅敤鐨勫湴鏂广傛垜浠彲浠ヤ娇鐢ㄥ閮ㄦ煡璇腑鐨勫煎苟灏嗗叾鍚堝苟鍒板瓙鏌ヨ鐨勮繃婊ゆ潯浠朵腑銆 + +璁╂垜浠湅鐪嬫垜浠浣曡绠楀钩鍧囩嚎鎬绘暟銆備负姝わ紝鎴戞暣鐞嗕簡涓涓彃鍥撅紝鏄剧ず浜嗗甫鏈夊瓙鏌ヨ鐨凷ELECT璇彞銆 + +![img](https://img-blog.csdnimg.cn/0623aed59d4f4a359e766931921ba807.png) + +杩涗竴姝ラ槓杩板浘琛ㄣ傝SELECT璇彞鐢变袱閮ㄥ垎缁勬垚锛屽閮ㄦ煡璇㈠拰瀛愭煡璇€傚閮ㄦ煡璇㈢敤浜庢绱㈡墍鏈塖alesOrderDetail琛屻傚瓙鏌ヨ鐢ㄤ簬鏌ユ壘鍜屾眹鎬荤壒瀹歋alesOrderID鐨勯攢鍞鍗曡缁嗕俊鎭銆 + +![img](https://img-blog.csdnimg.cn/30cafb79507d4cae9a5907693fdd39df.png) + +濡傛灉鎴戣琛ㄨ揪鎴戜滑灏嗚閲囧彇鐨勬楠わ紝鎴戜細灏嗗畠浠荤粨涓猴細 + +1. 鑾峰彇SalesOrderID銆 +2. 杩斿洖鎵鏈塖alesOrderID鍖归厤SalesOrderDetail椤圭殑LineTotal骞冲潎鍊笺 +3. 缁х画鍒板閮ㄦ煡璇腑鐨勪笅涓涓猄alesOrderID骞堕噸澶嶆楠1鍜2銆 + +鎮ㄥ彲浠ュ湪鏁版嵁搴撲腑杩愯鐨凙dventureWork2012鏌ヨ鏄細 + +```sql +SELECT SalesOrderID, + + + + SalesOrderDetailID, + + + + LineTotal, + + + + (SELECT AVG(LineTotal) + + + + FROM Sales.SalesOrderDetail + + + + WHERE SalesOrderID = SOD.SalesOrderID) + + + + AS AverageLineTotal + + + +FROM Sales.SalesOrderDetail SOD +``` + +浠ヤ笅鏄煡璇㈢殑缁撴灉锛 + +![img](https://img-blog.csdnimg.cn/83be0768df0e4051946515b3c70aeb67.png) + +鏈夊嚑鐐归渶瑕佹寚鍑恒 + +1. 鎮ㄥ彲浠ョ湅鍒版垜浣跨敤鍒楀埆鍚嶆潵甯姪浣挎煡璇㈢粨鏋滄洿鏄撲簬闃呰銆 +2. 鎴戣繕涓哄閮ㄦ煡璇娇鐢ㄤ簡琛ㄥ埆鍚, SOD銆傝繖浣垮緱鍦ㄥ瓙鏌ヨ涓娇鐢ㄥ閮ㄦ煡璇㈢殑鍊兼垚涓哄彲鑳姐傚惁鍒欙紝鏌ヨ涓嶇浉鍏筹紒 +3. 浣跨敤琛ㄥ埆鍚嶅彲浠ユ槑纭瘡涓〃涓殑鍝簺鍒椼 + +## 鍒嗚В鐩稿叧鐨勫祵濂楁煡璇 + +鐜板湪璁╂垜浠皾璇曚娇鐢⊿QL灏嗗叾鍒嗚В銆 + +棣栧厛锛屽亣璁炬垜浠皢鑾峰緱鎴戜滑鐨勭ず渚婼alesOrderDetailID ***\*20\****銆傚搴旂殑SalesOrderID鏄***\*43661\****銆 + +瑕佽幏寰楄椤圭殑LineTotal骞冲潎鍊煎緢瀹规槗锛 + +```sql +SELECT AVG(LineTotal) + + + +FROM Sales.SalesOrderDetail + + + +WHERE SalesOrderID = 43661 +``` + +杩欏皢杩斿洖鍊2181.765240銆 + +鐜板湪鎴戜滑鏈変簡骞冲潎鍊硷紝鎴戜滑鍙互灏嗗畠鎻掑叆鍒版垜浠殑鏌ヨ涓細 + +```sql +SELECT SalesOrderID, + + + + SalesOrderDetailID, + + + + LineTotal, + + + + 2181.765240 AS AverageLineTotal + + + +FROM Sales.SalesOrderDetail + + + +WHERE SalesOrderDetailID = 20 +``` + +浣跨敤瀛愭煡璇紝杩欏彉鎴愶細 + +```sql +SELECT SalesOrderID, + + + + SalesOrderDetailID, + + + + LineTotal, + + + + (SELECT AVG(LineTotal) + + + + FROM Sales.SalesOrderDetail + + + + WHERE SalesOrderID = 43661) AS AverageLineTotal + + + +FROM Sales.SalesOrderDetail + + + +WHERE SalesOrderDetailID = 20 +``` + +鏈鍚庣殑鏌ヨ鏄細 + +```sql +SELECT SalesOrderID, + + + + SalesOrderDetailID, + + + + LineTotal, + + + + (SELECT AVG(LineTotal) + + + + FROM Sales.SalesOrderDetail + + + +WHERE SalesOrderID = SOD.SalesOrderID) AS AverageLineTotal + + + +FROM Sales.SalesOrderDetail AS SOD +``` + +## 涓庝笉鍚岀殑琛ㄤ竴璧蜂娇鐢 + +鍏宠仈瀛愭煡璇紝鎴栬呭氨姝よ岃█锛屼换浣曞瓙鏌ヨ锛屽彲浠ヤ娇鐢ㄤ笌澶栭儴鏌ヨ涓嶅悓鐨勮〃銆傚綋鎮ㄤ娇鐢ㄢ滅埗鈥濊〃鏃讹紝杩欏彲鑳戒細娲句笂鐢ㄥ満锛屼緥濡係alesOrderHeader锛屽苟涓旀偍甯屾湜鍦ㄧ粨鏋滀腑鍖呭惈瀛愯鐨勬憳瑕侊紝渚嬪鏉ヨ嚜SalesOrderDetail銆 + +璁╂垜浠繑鍥為攢鍞鍗曟槑缁嗚鐨凮rderDate銆乀otalDue鍜屾暟閲忋備负姝わ紝鎴戜滑鍙互浣跨敤涓嬪浘鏉ヤ簡瑙f垜浠殑鏂逛綅锛 + +![img](https://img-blog.csdnimg.cn/786e702762aa49e5a12675657e93ea8e.png) + +涓烘锛屾垜浠皢鍦⊿ELECT璇彞涓寘鍚竴涓叧鑱斿瓙鏌ヨ浠ヨ繑鍥濻alesOrderDetail琛屾暟鐨凜OUNT銆傛垜浠皢閫氳繃杩囨护澶栭儴鏌ヨ鐨凷alesOrderID鏉ョ‘淇濊绠楁纭殑SalesOrderDetail椤广 + +杩欐槸鏈鍚庣殑SELECT澹版槑锛 + +```sql +SELECT SalesOrderID, + + + + OrderDate, + + + + TotalDue, + + + + (SELECT COUNT(SalesOrderDetailID) + + + + FROM Sales.SalesOrderDetail + + + + WHERE SalesOrderID = SO.SalesOrderID) as LineCount + + + +FROM Sales.SalesOrderHeader SO +``` + +缁撴灉鏄細 + +![img](https://img-blog.csdnimg.cn/0fcf3bdf005c4737a0bade060dc8fb20.png) + +姝ょず渚嬮渶瑕佹敞鎰忕殑涓浜涗簨椤规槸锛 + +- 瀛愭煡璇粠涓庡閮ㄦ煡璇笉鍚岀殑琛ㄤ腑閫夋嫨鏁版嵁銆 +- 鎴戜娇鐢ㄨ〃鍜屽垪鍒悕鏉ユ洿瀹规槗闃呰SQL鍜岀粨鏋溿 +- 璇峰姟蹇呬粩缁嗘鏌ユ偍鐨剋here瀛愬彞锛佸鏋滄偍蹇樿鍦ㄥ瓙鏌ヨWHERE瀛愬彞涓寘鍚〃鍚嶆垨鍒悕锛屽垯涓嶄細鍏宠仈鏌ヨ銆 + +# 鍏宠仈瀛愭煡璇笌鍐呴儴鑱旀帴 + +閲嶈鐨勬槸瑕佷簡瑙f偍鍙互浣跨敤瀛愭煡璇㈡垨鑱旀帴鑾峰緱鐩稿悓鐨勭粨鏋溿傚敖绠′袱鑰呴兘杩斿洖鐩稿悓鐨勭粨鏋滐紝浣嗘瘡绉嶆柟娉曢兘鏈変紭鐐瑰拰缂虹偣锛 + +鑰冭檻鏈鍚庝竴涓緥瀛愶紝鎴戜滑涓篠alesHeader椤硅绠楅」鐨勮銆 + +```sql +SELECT SalesOrderID, + + + + OrderDate, + + + + TotalDue, + + + + (SELECT COUNT(SalesOrderDetailID) + + + + FROM Sales.SalesOrderDetail + + + +WHERE SalesOrderID = SO.SalesOrderID) as LineCount + + + +FROM Sales.SalesOrderHeader SO +``` + +鍙互浣跨敤INNER JOIN鍜孏ROUP BY鏉ュ畬鎴愮浉鍚岀殑鏌ヨ锛 + +```sql +SELECT SO.SalesOrderID, + + + + OrderDate, + + + + TotalDue, + + + + COUNT(SOD.SalesOrderDetailID) as LineCount + + + +FROM Sales.SalesOrderHeader SO + + + + INNER JOIN Sales.SalesOrderDetail SOD + + + + ON SOD.SalesOrderID = SO.SalesOrderID + + + +GROUP BY SO.SalesOrderID, OrderDate, TotalDue +``` \ No newline at end of file