面試官讓你手寫SQL,然後程序員不會,結果涼涼了

SQL 程序員 Sage 教育 程序汪汪 2018-12-03

程序員、測試、DB、MYSQL

面試官特別喜歡問SQL,寫的SQL不好性能影響也特別大

SQL基本功,頂起

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

一張學生表

Student(SID,Sname,Sage,Ssex) --SID 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

一張學生成績表

成績表

score(SID,CID,score) --SID 學生編號,CID 課程編號,score 分數

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

學生表 9條記錄

成績表18條記錄

第一個問題兩表關聯查詢結果數量是多少

select count(*) from student a,score b

答案是 (學生表 9條*成績表18條)=162條

第二個問題兩表關聯查詢列名會怎麼

select * from student a,score b

答案是 相加

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

左連接

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

要查所有學生的考試情況,左連接很不錯

下圖空白部分的B就是上圖NULL

這個NULL什麼意思,就是沒參加考試的學生。

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

內容連接

如果要精確查詢某數據,內連接不錯

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

參加過考試的學生和成績就出來了

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

左不包括連接

很多參加是查詢不存在的數據,這個時候左不包括連接就有用了

例子,查沒參加考試的學生

這是剛剛左連接的SQL,那些NULL的學生其實就是沒參加考試的學生

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

因此把左連接SQL小調整下就滿足需求了

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

性能優化思路:

左不包括連接完勝嵌套子查詢

因為join會自動優化特別是關聯的ID是有索引的時候

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

group by

查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績

直接關聯學生表和成績表會發現學生的所有成績記錄會平鋪

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

  1. group by 就是分組的意思,關鍵點要找重複出現的值把它合併成一組後方便統計

上圖重複的值當然是姓名

2 . group by 分組後,在加是統計函數AVG幫助就可以計算出學生的平均成績

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

  1. 在配合HAVING去過濾掉60以下的
面試官讓你手寫SQL,然後程序員不會,結果涼涼了

在理解下group by的效果,重複的字段值合併,在配合統計函數來統計,

HAVING函數去過濾掉不滿足的 統計結果

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

join on後面的條件與where後面的條件的區別

這個很多人沒注意

例子來了第一個是where 後面條件,第二個是 on後面加條件

結果都是不一樣的 where查詢到12 條,on查詢到16條

面試官讓你手寫SQL,然後程序員不會,結果涼涼了

原因:

  1. where 後面的條件是對連接後的數據進行篩選 ,即先連接再篩選
  2. on 條件是先過濾數據後,在於表join 即先篩選再連接
  3. 篩選的對象範圍不一樣,結果當然可能不一樣。

總結

  • SQL裡還有非常多的函數,有空我在整理下加強下理解
  • 平時大家多把運行結果在腦海裡多放放,加函數前和加函數後結果的變化規律

相關推薦

推薦中...