因為一段時間不用mysql后有些東西會忘記,寫來
一來為提供給以后加速回憶起相關(guān)語句
二來博各位大佬一笑
sql語句萬能公式法
1 . sql語句三部分:what(要得到什么select后面的東西) from(從哪些表,最好直接join on )condition(where ,group by ,having,order by ,limit 這類十分easy 就沒必要單獨拿出來了)
舉個栗子
select a.id ,a.name (what部分)
from t_student a join t_course b on t_student.cid =t_course.id (from 部分 基本就是直接寫表名然后加上join ,再加你的條件)
where a.id>1 group by a.cid(一些條件語句)
2 .不行就用上面結(jié)果作為表再來一次select
ps:
- 基本上select 和from 好寫 ,難的是condition,也就是怎么把題意翻譯成sql語句
- 我的建議是先寫where(主要是效率問題,where是先做把臨時表篩選了),再寫group by (注意group by 只是分組,所以數(shù)據(jù)還是那么多,只是每組只能顯示該分組的第一條(畢竟數(shù)據(jù)庫記錄查出來是個二維結(jié)構(gòu),不能再立體了),所以聚合函數(shù)只能在group by 中用,因為where 根本就沒有分組,怎么聚合),之后寫分組后的having
- 關(guān)于多表join 我建議甭管多少表,一次先join兩個再來,把問題簡單化(不知道這么做算不算最優(yōu)解,暫時不考慮吧,但是一定是多表的萬能解)
相關(guān)概念的解釋,重要的例子
- join on 和where
直接貼個大佬寫的吧,他寫的還不錯
https://www.cnblogs.com/Jessy/p/3525419.html - where 和group by
可見其實看過以上后,where的語句其實相當(dāng)好寫,問題再于group by 后面的聚合函數(shù)的應(yīng)用,常見的聚合函數(shù)有哪些
簡單來說就五個,avg,count ,min,max,sum
具體見這位大佬博客,介紹的很詳細
https://www.cnblogs.com/geaozhang/p/6745147.html - 集合中的交并補等,或者說是兩個結(jié)果之間的運算
這類問題也比較常見,單獨整理下
主要就是畫下韋恩圖,用左右連接,where 中寫某些字段是不是null之類的條件
這位大佬寫的還行,就是沒有具體的韋恩圖,看著不是很形象,你們先看他的吧,我到時候自己寫個更容易理解的,更方便的(要面試了,沒時間)
https://blog.csdn.net/sanzhongguren/article/details/76615464 - 一道由于group by 只能查詢聚合函數(shù)中的字段導(dǎo)致的問題
三個字段,sid(學(xué)生id),cid(課程id) ,score(分數(shù))
在student_course表查詢各科成績最高的學(xué)生,結(jié)果列出學(xué)生id、課程id和對應(yīng)的成績 你可能會這樣寫:
select sid,cid,max(score) from student_course group by cid;
然而上面是不對的,因為 使用了group by的查詢字段只能是group by中的字段或者聚集函數(shù)或者是每個分組內(nèi)均相同的字段。 雖然不會報錯,但是sid是無效的,如果去掉sid的話只能查出沒門課程的最高分,不包含學(xué)生id。 本題的正確解法是使用相關(guān)嵌套查詢:
select * from student_course as x where score>=
(select max(score) from student_course as y where cid=x.cid);
相關(guān)子查詢也就是在進行內(nèi)層查詢的時候需要用到外層查詢,有一些注意事項:
子查詢一定要有括號
as可以省略
使用相關(guān)查詢;>=max等價于>=all,但是聚合函數(shù)比使用any或all效率高
相關(guān)子查詢和嵌套查詢見這位大佬的解釋
https://www.cnblogs.com/Ryan_j/archive/2010/10/20/1857026.html
相當(dāng)于()中的先在類中進行比較,再從外面的表拿數(shù)據(jù)