1. 程式人生 > >Mysql之DQL複雜查詢(連線查詢):

Mysql之DQL複雜查詢(連線查詢):

1、內連線查詢:inner join 表名2 別名2 on 別名2.有關係欄位名=別名1.有關係欄位名 有條件就用where

	例子1:把參加考試的同學資訊查出來
	
		select s.StudentName,r.StudentResult from student s inner join result r on r.StudentNo=s.StudentNo;

	例子2:查詢參加考試的同學資訊(學號、姓名、科目、分數),注意一般先找到中間表

		SELECT s.StudentNo,s.StudentName,sb.SubjectName,r.StudentResult FROM student s

			INNER JOIN result r ON r.StudentNo=s.StudentNo  	

				INNER JOIN `subject` sb ON r.SubjectNo=sb.SubjectNo;

		解讀:匹配原則,左表的每一行資料 與右表的每一行資料進行匹配,只要ON後面條件滿足就把資料拿出來。
	
2、左外連線查詢:left join 右表名 右別名 on 右別名.有關係欄位名=左別名.有關係欄位名 有條件加where		
	
	例子1:將所有同學全部查出來,不考試的也查出來
	
		select s.StudentName,r.StudentResult from student s left join result r on r.StudentNo=s.StudentNo;
	
	例子2:單獨把缺考的學生查出來,就是在最後面加一個條件 where StudentResult is null;	
	
		解讀:以左表為基準,右表的資料與左邊一一匹配,匹配上直接顯示,匹配不上的,左表有資料的欄位名依然顯示,右表的資料設定為null。
	
3、右外連線查詢:道理一樣,自己思考。

4、等值查詢:

		select s.StudentNo,s.StudentName,r.StudentNo,r.StudentResult from student s,result r where s.StudentNo=r.StudentNo;

		解讀:與上面內連線效果一樣的。
	
5、子查詢:一個完整的查詢巢狀另一個完整的查詢。

	例子:查詢課程為《高等數學-2》 且分數不小於80分的學生學號和姓名,注意思路是寫三個select語句,想辦法分級巢狀

		select s.StudentNo,s.StudentName FROM student s 

		WHERE s.StudentNo IN( SELECT r.StudentNo FROM result r WHERE r.SubjectNo IN (

		SELECT sb.SubjectNo FROM `subject` sb WHERE sb.SubjectName="高等數學-2"

		) AND r.studentResult>=80);