SQL語句的使用技巧--01(JOIN)

目錄

 

1.SQL語句分類

  2.如何正確使用JOIN

  3.與JOIN相關的技巧


1.SQL語句分類

    

  2.如何正確使用JOIN

 

   表:

  •  內連接:

  •   外連接之Left Outer Join:

  左外連接的兩種使用場景,注意地位中優化了 NOT IN,因爲他避免了使用它。

  

    例子:

 

  •  外連接之 Right Outer Join:

  

  •    外連接之全連接:

   

     mysql中如何使用full join呢?UNION ALL

   

   

   UNION 連接的兩個表,結構必須完全一樣,字段的順序也必須一樣,不然報錯

  •    交叉連接沒有連接關鍵詞

   

     

  3.與JOIN相關的技巧

  •   1.使用join來更新表

       

      最容易想到的是這種:

       

      這樣更新會拋出錯誤,因爲mysql不能更新在From從句中出現的表,解決辦法是使用join:

      

  •     2. 使用join來優化子查詢

       

       

  •      3. 使用join來優化聚合查詢

     

 

    這個問題是分組後統計每組的最大值的問題, 

    最容易想到的就是使用子查詢:

SELECT 
a.user_name,  
b.timestr,
b.kills  
FROM user1 a  
JOIN user_kills b ON a.id=b.user_id  
WHERE b.kills=(

        SELECT  MAX(c.kills)  FROM  user_kills  c WHERER b.user_id=c.user_id

)

   使用join優化:

 

   OK,現在我要查詢每門課程的最高成績


SELECT a.COURSE_NO, a.id ,a.CORE
FROM hand_student_core a 
JOIN hand_student_core b 
ON a.COURSE_NO =b.COURSE_NO
GROUP BY a.COURSE_NO, a.id
HAVING a.CORE = MAX(b.CORE)

 

  •    4.如何實現分組選擇

      場景:找出每個角色殺怪最多的前兩個日期

     

        場景:取出每門課程成績最高的兩名同學。

       思路:首先需要根據課程號進行分組,得到如下的表:

SELECT  a.* 
FROM hand_student_core a 
GROUP BY   
a.COURSE_NO

  

  group分組之後只會有一條數據,即該字段相同的記錄只會顯示一行,除非你後面跟的字段的值是唯一 ,纔會全部顯示,group by 通常會用於統計 如 count( ) sum() 等,計算 一組數據的情況。

那我們讓他全部顯示:

SELECT 
 a.* 
FROM hand_student_core a   
GROUP BY   
a.COURSE_NO,a.id

  

 剩下的事情就是排序,或者說找到每個分數在組裏面的排序

SELECT a.STUDENT_NO, a.COURSE_NO, CORE ,(SELECT 
                                                  COUNT(*) 
						   FROM hand_student_core b 
						   WHERE a.COURSE_NO=b.COURSE_NO 
						   AND a.CORE<=b.CORE) AS cnt
FROM hand_student_core a 

GROUP BY a.COURSE_NO,a.id

 

  接下來就可以任意取前幾名,然後連表查詢

SELECT STUDENT_NO, COURSE_NO, CORE FROM (
SELECT a.STUDENT_NO, a.COURSE_NO, CORE ,(SELECT 
                           COUNT(*) 
					FROM hand_student_core b 
					WHERE a.COURSE_NO=b.COURSE_NO 
				    AND a.CORE<=b.CORE) AS cnt
FROM hand_student_core a 

GROUP BY a.COURSE_NO,a.id) c
WHERE c.cnt<=2

  

 

     

 

    

 

 

 

 

 

  

    

 

  

 

 

 

 

 

 

 

 

 

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章