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