目錄
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