一、關聯查詢
1、最常用的聯表查詢有左關聯(left join)、右關聯(right join)、內關聯(inner join),但實際上關聯查詢一共有七種,另外四種是在這三種基礎上衍生出來的。如下圖所示。
2、關聯查詢一般的操作步驟
(1)分析需求,分析查詢的字段來自哪些表。
(2)確定使用哪種連接查詢方式。(七種任選)
(3)確定交叉點(即兩張表中,那個數據是相同的),即確定判斷條件
3、三種連接查詢示例
注:左表是result,右表是student。
(1)內連接。
任務:在students表和result表中studentNo相等的數據中,將student表中的studentNo、studentName、studentResult 和result表中的subjectNo返回。
因為studentNo在兩張表中都有數據,因此需要聲明這個字段來自於哪張表。
SELECT s.studentNo,studentName,subjectNo,studentResult FROM student AS s INNER JOIN result AS r ON s.studentNo = r.studentNo ----也可以使用where代替on,但是join后面一般用on
(2)右連接
任務:在student表中,查詢與result表中studentNo的相等的數據,並將student表中的studentNo、studentName、studentResult 和result表中的subjectNo返回。
SELECT s.studentNo,studentName,subjiectNo,studentResult FROM result AS r RIGHT JOIN student AS s ON s.studentNo = r.studentNo
(3)左連接
任務:在result表中,查詢與result表中studentNo的相等的數據,並將student表中的studentNo、studentName、studentResult 和result表中的subjectNo返回。
SELECT s.studentNo,studentName,subjiectNo,studentResult FROM result AS r LEFT JOIN student AS s ON s.studentNo = r.studentNo
左連接、右連接、內連接的區別
操作 | 描述 |
inner join | 如果兩張表中有一個滿足條件,就返回結果 |
left join | 會將右表中所有值返回,即使在右表中沒有匹配 |
right join | 會將左表中所有值返回,即使左表中沒有匹配 |
4、多表聯合查詢
多表聯合查詢的核心是將多張表兩兩進行聯合,並將每兩張表查詢的結果作為左表或者右表。
二、自連接查詢
1、 即在同一張表中查詢信息,但是將一張表當做兩張表使用。通常適用於表信息互相耦合、嵌套的情況。
三、分頁和排序
1、排序關鍵字
升序:asc
降序:desc
2、分頁關鍵字
limit a,b --a:起始行,b:頁面大小,a和b滿足:假如是顯示第n頁,則應為 limit (n-1)b, b;
四、子查詢
1、子查詢的本質:在where語句中嵌套一個子查詢語句
2、例子
任務:查詢 “數據庫結構-1”的所有考試結果(包括學號、科目編號、成績),降序排列
(1)如果使用連接查詢,SQL語句如下
SELECT studentNo,r.subjectNo,studentResult FROM `result` AS r INNER JOIN `subject` AS s ON r.subjectNo = s.subjectNo WHERE studentNme = '數據庫結構-1' ORDER BY studentRuslt DESC
(2)如果使用子查詢,SQL語句如下
SELECT studentNo,subjectNo,studentResult FROM result WHERE subjectNo = ( SELECT subjectNo FROM `subject` WHERE subjectName = '數據庫結構-1' )
子查詢執行的順序是:由內而外
3、子查詢一般效率較低,在使用的時候要考慮性能問題。
五、MySQL的函數
1、常用函數
可以參考官方文檔。此處只列舉常用函數。
(1)數學類&字符串類
略,可參考官方文檔。
(2)時間類
CURRENT_DATE() --獲取當前日期 NOW() --獲取當前時間 LOCALTIME() --獲取本地時間
2、聚合函數
(1)常用函數
1、統計函數
COUNT(列名) --統計函數,會過濾列中的空值
COUNT(1) --不會過濾空值
COUNT(*) --不會過濾空值
三者的區別:當列為主鍵時,COUNT(列名)的效率最高;當列不是主鍵主鍵時,OCUNT(1)效率最高;當表中只有一列時,COUNT(*)效率最高。
2、求平均、和、最高、最低
SUN()、AVG()、MAX()、MIN()
(2)分組函數
GROUP BY
表結構:學科表(subject),成績表(result),關聯的主鍵(subjectNo--學科編號)
任務:以學科為分組,將平均分大於80的學科的學科編號、平均分、最高分、最低分查出來。
SELECT subjectNo,AVG(studentRusult) as 平均分,MAX(studentResult) as 最高分,MIN(studentResult) as 最低分 FROM result as r INNER JOIN `subject` as sub ON r.`subejectNo`=sub.`subjectNo` GROUP BY r.subjectNo --通過這個字段來分組 HAVING 平均分>80
注意:where使用在GROUP BY之前,HAVING使用在GROUP BY之后,兩者都是實現過濾功能。
六、SELECT匯總