程序員、測試、DB、MYSQL
面試官特別喜歡問SQL,寫的SQL不好性能影響也特別大
SQL基本功,頂起
一張學生表
Student(SID,Sname,Sage,Ssex) --SID 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別
一張學生成績表
成績表
score(SID,CID,score) --SID 學生編號,CID 課程編號,score 分數
學生表 9條記錄
成績表18條記錄
第一個問題兩表關聯查詢結果數量是多少
select count(*) from student a,score b
答案是 (學生表 9條*成績表18條)=162條
第二個問題兩表關聯查詢列名會怎麼
select * from student a,score b
答案是 相加
左連接
要查所有學生的考試情況,左連接很不錯
下圖空白部分的B就是上圖NULL
這個NULL什麼意思,就是沒參加考試的學生。
內容連接
如果要精確查詢某數據,內連接不錯
參加過考試的學生和成績就出來了
左不包括連接
很多參加是查詢不存在的數據,這個時候左不包括連接就有用了
例子,查沒參加考試的學生
這是剛剛左連接的SQL,那些NULL的學生其實就是沒參加考試的學生
因此把左連接SQL小調整下就滿足需求了
性能優化思路:
左不包括連接完勝嵌套子查詢
因為join會自動優化特別是關聯的ID是有索引的時候
group by
查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
直接關聯學生表和成績表會發現學生的所有成績記錄會平鋪
- group by 就是分組的意思,關鍵點要找重複出現的值把它合併成一組後方便統計
上圖重複的值當然是姓名
2 . group by 分組後,在加是統計函數AVG幫助就可以計算出學生的平均成績
- 在配合HAVING去過濾掉60以下的
在理解下group by的效果,重複的字段值合併,在配合統計函數來統計,
HAVING函數去過濾掉不滿足的 統計結果
join on後面的條件與where後面的條件的區別
這個很多人沒注意
例子來了第一個是where 後面條件,第二個是 on後面加條件
結果都是不一樣的 where查詢到12 條,on查詢到16條
原因:
- where 後面的條件是對連接後的數據進行篩選 ,即先連接再篩選
- on 條件是先過濾數據後,在於表join 即先篩選再連接
- 篩選的對象範圍不一樣,結果當然可能不一樣。
總結
- SQL裡還有非常多的函數,有空我在整理下加強下理解
- 平時大家多把運行結果在腦海裡多放放,加函數前和加函數後結果的變化規律
相關推薦
'SQL常用語句總結(面試很有用哦)'
"數據庫1. 查看現有數據庫 SHOW DATABASES;2. 新建數據庫 CREATE DATABASE <數據庫名>; 3. 選擇數據庫 USE <數據庫名>; 4. 從.sql文件引入SQL語句 SOURCE <.sql文件路徑>...
'阿里巴巴程序員推出了的一份Linux 學習清單,這一定是你最需要的'
"第一階段Linux+搜索+hadoop體系Linux基礎→shell編程→高併發架構→lucene,solr搜索→hadoop體系→HDFS→mapreduce→hbase→zookeeper→hive→flume→sqoop→項目實戰第二階段機器學習R語言→mahout...
'程序員避免面試時寫不出排序算法,提前準備一下,看這篇就足夠了'
"冒泡排序要點冒泡排序是一種交換排序。什麼是交換排序呢?交換排序:兩兩比較待排序的關鍵字,並交換不滿足次序要求的那對數,直到整個表都滿足次序要求為止。算法思想它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有...
推薦中...