Mysql的聯表查詢


一、關聯查詢

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匯總

 

 

 

  

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM