1. 程式人生 > 其它 >連線查詢和子查詢小結

連線查詢和子查詢小結

1、什麼是子查詢?舉個簡單的例子,那麼子查詢有什麼優劣呢?

子查詢 (內查詢) 在主查詢之前一次執行完成。
子查詢的結果被主查詢(外查詢)使用 。
可以用一個子查詢替代上邊的的表名。
子查詢,將查詢操作巢狀在另一個查詢操作中。先執行子查詢,再執行外查詢

注:在查詢時基於未知的值時,應使用子查詢 子查詢可以返回多個結果/單個結果,結果個數不同應該使用不同的操作符

通過子查詢不難看出,可以根據employee_id查到department_id,然後根據deparment_id查到location_id然後查city欄位就行了(參見上圖)

//根據上述表查詢emloyee_id的所在城市是長沙的(相當於就是無限套娃)
SELECT employee_id FROM employees WHERE department_id IN ( SELECT department_id FROM departments WHERE location_id IN( SELECT location_id FROM location WHERE city='長沙'))

2、什麼是連線查詢呢?又有多少中連線查詢?其中又各有什麼優劣呢?連線查詢主要分為三種:內連線、外連線、交叉連線。

內連線 INNER JOIN

內連線(INNER JOIN),返回連線表中符合連線條件和查詢條件的資料行。(所謂的連結表就是資料庫在做查詢形成的中間表)。

SELECT a.*, b.* FROM employees a INNER JOIN departments b ON a.department_id=b.department_id

外連線(外連線分為左外連線、右外連結、全外連線

​ 外連線分為左外連線、右外連結、全外連線三種。從保證某個表的資料的完整性來說的話,LEFT JOIN 左外連線,保證左表的完整性,RIGHT JOIN 右外連線,保證右表的完整性

(1)左外連線LEFT JOIN或LEFT OUTER JOIN

左外聯接的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。

SELECT a.* FROM employees a LEFT JOIN departments b ON b.department_id=a.department_id

注:查詢結果,會將左表全部查詢出來,如果未匹配到連線(b表中未找到和a表中的department_id相等的欄位),則右表為null。

(2)右外連結RIGHT JOIN 或 RIGHT OUTER JOIN

右外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

SELECT a.* FROM employees a RIGHT JOIN departments b ON b.department_id=a.department_id

注:查詢結果,會將左表全部查詢出來,如果未匹配到連線(a表中未找到和b表中的department_id相等的欄位),則左表為null。

(3)全外連線(全連線)FULL JOIN 或 FULL OUTER JOIN

完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。

FULL JOIN的基本語法如下:

oracle裡面有full join,但是在mysql中沒有full join。我們可以使用union來達到目的。

//oracle寫法
SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;
//mysql寫法
SELECT a.* FROM employees  a LEFT JOIN departments b ON a.department_id = b.department_id UNION 
 SELECT a.* FROM employees  a RIGHT JOIN departments b ON a.department_id = b.department_id

等值連線和自然連線

1.等值連線(相等連線)

使用”=”關係將表連線起來的查詢,其查詢結果中列出被連線表中的所有列,包括其中的重複列。

2.自然連線:

等值連線中去掉重複的列,形成的連線。說真的,這種連線查詢沒有存在的價值,既然是SQL2標準中定義的。自然連線無需指定連線列,SQL會檢查兩個表中是否相同名稱的列,且假設他們在連線條件中使用,並且在連線條件中僅包含一個連線列。不允許使用ON語句,不允許指定顯示列,顯示列只能用*表示(ORACLE環境下測試的)。對於每種連線型別(除了交叉連線外),均可指定NATURAL。

資料庫應用中最常用的是“自然連線”,它在目標列中去除相同的欄位名。進行自然連線運算要求兩個表有共同屬性(列),自然連線運算的結果表是在參與操作的兩個表的共同屬性上進行等值連線後,再去除重複的屬性後所得的新表

等值連線和自然連線的區別

1)等值連線中不要求相等屬性值的屬性名相同,而自然連線要求相等屬性值的屬性名必須相同,即兩關係只有在同名屬性才能進行自然連線。

2)等值連線不將重複屬性去掉,而自然連線去掉重複屬性,也可以說,自然連線是去掉重複列的等值連線。

3、連線查詢和子查詢哪個效率高呢?
​ 首先兩者不存在誰優於誰的說法,只是那種更適應某種環境。一般要看你是什麼用途,如果資料量少的話可以子查詢,或者經常用的資料就使用子查詢,不經常用的就連線查詢,適習慣而定,當然是指資料量少的情況下。

​ 一般來講連線查詢效率更高,因為子查詢會多次遍歷資料,而連線查詢只遍歷一次,但是如果資料量較少的話子查詢更加容易控制。但如果資料量大的話兩者的區別就會很明顯,對於資料量多的肯定是用連線查詢快些,原因:因為子查詢會多次遍歷所有的資料(視你的子查詢的層次而定),如果你的子查詢是在無限套娃,且每張表資料量不大,使用子查詢效率高。

​ 連線查詢只會遍歷一次,但是資料量少的話也就無所謂是連線查詢還是子查詢,多表資料量大建議採用連線查詢

注:連線查詢是SQL查詢的核心,連線查詢的連線型別選擇依據實際需求。如果選擇不當,非但不能提高查詢效率,反而會帶來一些邏輯錯誤或者效能低下。下面總結一下兩表連線查詢選擇方式的依據:

1、 查兩表關聯列相等的資料用內連線。

2、 左表是右表的子集時用右外連線。

3、 右表是左表的子集時用左外連線。

4、 左表和右表彼此有交集但彼此互不為子集時候用全外連線(全連線)。

5、 求差操作的時候用聯合查詢。

————————————————
版權宣告:本文為CSDN博主「zhsh666y」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/weixin_44041590/article/details/114343328