1. 程式人生 > 其它 >SQL的多表聯查

SQL的多表聯查

SQL的多表聯查

表關聯 association

概念

表table代表了生活中一個主體,如部門表dept,員工表emp。表關聯則代表了表之間的關係,如:部門和員工,商品和商品分類,老師和學生,教室和學生。

同時,也要知道,表並不都有關係,它們形成自己的小圈子。如商品和商品詳情一圈,部門和員工一圈,出圈就可能沒關係了,如商品和員工無關,商品和學生無關。

下面我們討論表的關係分為四種:

  • 一對一 one to one QQ和QQ郵箱,員工和員工編號
  • 一對多 one to many 最常見,部門和員工,使用者和訂單
  • 多對一 many to one 一對多反過來,員工和部門,訂單和使用者
  • 多對多 many to many 老師和學生,老師和課程

多表聯查

多表查詢是指基於兩個和兩個以上的表的查詢。在實際應用中,查詢單個表可能不能滿足你的需求,如顯示員工表emp中不只顯示deptno,還要顯示部門名稱,而部門名稱dname在dept表中。

笛卡爾積 Cartesian product

笛卡爾積(Cartesian product),又稱直積。一般笛卡爾積沒有實際的業務意義,但多表查詢都是先生成笛卡爾積,再進行資料的篩選過濾。

注意:實際開發中儘量少用多表聯查,其根本原因就在這裡,查詢過程中,現在記憶體中構建一個大大的結果集,然後再進行資料的過濾。那這個構建過程,和所使用的記憶體資源,包括過濾時的判斷,都是既耗費資源,又浪費時間。

SELECT * FROM students,scores  #查詢這兩張表
WHERE students.id = scores.sid #兩張表的關聯關係
AND students.name = '柒' #查詢條件

連線查詢join

  • 內連線 inner join
  • 左(外)連線 left join
  • 右(外)連線 right join
SELECT * FROM students 
#inner join scores #兩邊都滿足的交集
LEFT JOIN scores #左邊的所有和右邊滿足了的
#right JOIN scores #右邊的所有和左邊滿足了的
ON students.id = scores.sid #描述關聯關係
WHERE students.name = '柒' #具體過濾條件

子查詢 subquery

子查詢是指嵌入在其他select語句中的select語句,也叫巢狀查詢。子查詢執行效率低慎用。記錄少時效率影響不大、圖方便直接使用,記錄多時最好使用其它方式替代。

單行子查詢

  • 返回結果為一條
#查詢學生名字為柒的成績 名字為柒的只有一個返回的id只有一個值
select * from scores where id = (select id from students where name='柒');

多行子查詢

  • 返回結果為多條(使用in或者any)
#查詢7086班級的所有學生資訊
select * from students where id in (select id from classes where class=7086);
select * from students where id = any(select id from classes where class=7086);

常見報錯:https://www.cnblogs.com/fangweicheng666/p/15133256.html