一. 子查詢
子查詢就是在一個(gè)查詢語(yǔ)句內(nèi)部嵌套的查詢伪窖,因而子查詢語(yǔ)句也被稱為內(nèi)部查詢、包含子查詢語(yǔ)句的查詢稱為外部查詢居兆。這種查詢語(yǔ)句的查詢順序是從內(nèi)向外的覆山。
常見(jiàn)的使用子查詢的形式為:在WHERE
語(yǔ)句內(nèi)、在IN
或NOT IN
操作符后泥栖、在FROM
語(yǔ)句內(nèi)簇宽、在EXISTS
或NOT EXISTS
操作符后勋篓。
在WHERE語(yǔ)句中使用子查詢
可以在WHERE
語(yǔ)句中使用子查詢的結(jié)果對(duì)外部查詢的數(shù)據(jù)進(jìn)行過(guò)濾。
舉例如下:
學(xué)生基本信息表:
學(xué)生專業(yè)信息表:
查詢名字為“FF”的學(xué)生的專業(yè)名稱的操作為:
SELECT major FROM student_major WHERE id = (SELECT id FROM student_details WHERE name = 'FF');
查詢結(jié)果為:
在IN或NOT IN操作符后使用子查詢
IN
和NOT IN
語(yǔ)句用于過(guò)濾出存在/不存在于子查詢結(jié)果的數(shù)據(jù)魏割。
IN
:
查詢id為1001生巡, 1002,1003學(xué)生的專業(yè)信息:
SELECT major FROM student_major WHERE id IN (1001, 1002, 1003);
查詢結(jié)果為:
NOT IN
:
查詢除FF同學(xué)以外的其他學(xué)生的專業(yè)信息:
SELECT major FROM student_major WHERE id NOT IN (SELECT id FROM student_details WHERE name = 'FF');
查詢結(jié)果為:
在FROM語(yǔ)句內(nèi)使用子查詢
可以將子查詢結(jié)果作為一個(gè)臨時(shí)表用于FROM
語(yǔ)句中见妒。
查詢學(xué)生的最大年齡:
SELECT MAX(age) FROM (SELECT age FROM student_details AS student_age) AS max_age;
查詢結(jié)果為:
在EXISTS或NOT EXISTS操作符后使用子查詢
使用EXISTS
和NOT EXISTS
操作符可以過(guò)濾出滿足/不滿足于子查詢結(jié)果的數(shù)據(jù)孤荣。
查詢?cè)趯I(yè)信息表中存在的學(xué)生ID:
SELECT id FROM student_details WHERE EXISTS (SELECT * FROM student_major);
二. 聯(lián)結(jié)查詢
聯(lián)結(jié)查詢是將多個(gè)表的數(shù)據(jù)放在一起進(jìn)行查詢。
聯(lián)結(jié)查詢包含內(nèi)聯(lián)結(jié)须揣、外聯(lián)結(jié)盐股、交叉聯(lián)結(jié)、自聯(lián)結(jié)等耻卡,其中最常用的為內(nèi)聯(lián)結(jié)和外聯(lián)結(jié)疯汁。
內(nèi)聯(lián)結(jié)
內(nèi)聯(lián)結(jié)即查詢兩個(gè)表中數(shù)據(jù)的交集(如圖),查詢過(guò)程是將主表和副表的每一條數(shù)據(jù)都按照聯(lián)結(jié)條件來(lái)匹配卵酪,只有滿足聯(lián)結(jié)條件的數(shù)據(jù)才會(huì)被保留幌蚊。
內(nèi)聯(lián)結(jié)的語(yǔ)法:
-
FROM
后跟隨主表 -
INNER JOIN
后跟隨副表 -
ON
后跟隨聯(lián)結(jié)條件
內(nèi)聯(lián)結(jié)可以聯(lián)結(jié)多個(gè)表來(lái)查詢。
查詢學(xué)生的名字和專業(yè)信息:
DELETE FROM student_major WHERE id = 1003;
SELECT s1.name, s2.major FROM student_details AS s1
INNER JOIN
student_major AS s2 ON s1.id = s2.id;
查詢結(jié)果為:
外聯(lián)結(jié)
外聯(lián)結(jié)在查詢過(guò)程中會(huì)保留主表中的所有數(shù)據(jù)溃卡,并對(duì)每一行數(shù)據(jù)按照指定的聯(lián)結(jié)規(guī)則與附表匹配溢豆,若能匹配則取出副表中對(duì)應(yīng)的數(shù)據(jù),若不能匹配則該項(xiàng)以NULL填充瘸羡。左外聯(lián)結(jié)和右外聯(lián)結(jié)的效果如下面兩張圖所示:
外聯(lián)結(jié)的語(yǔ)法:
-
FROM
后跟隨主表 -
LEFT JOIN
或RIGEHT JOIN
后跟隨副表 -
ON
后跟隨聯(lián)結(jié)條件
查詢學(xué)生的名字和專業(yè)信息:
SELECT t1.name, t2.major FROM student_details AS t1 LEFT JOIN student_major AS t2 ON t1.id = t2.id;
查詢結(jié)果為:
可以看到由于student_major表中沒(méi)有ZZ的專業(yè)信息漩仙,因此ZZ的專業(yè)信息為NULL。
組合查詢
組合查詢是將多次查詢的結(jié)果顯示到一張表中犹赖,使用UNION
關(guān)鍵字實(shí)現(xiàn)队他。
其規(guī)則是:只有當(dāng)多次查詢的結(jié)果具有相似的結(jié)構(gòu)(即相同數(shù)量的列,且對(duì)應(yīng)列的類(lèi)型相同或可以相互轉(zhuǎn)換)時(shí)才能進(jìn)行組合查詢峻村。
查詢年齡小于19歲或者性別為女的學(xué)生:
SELECT * FROM student_details WHERE gender = 'female' UNION SELECT * FROM student_details WHERE age < 19;
查詢結(jié)果為:
總結(jié)
這三種方法的相同之處都是可以從多個(gè)相互關(guān)聯(lián)的表中查詢數(shù)據(jù)麸折,相比單一表的查詢更加使用。
不同之處在于:
- 子查詢是按照從內(nèi)向外的順序依次執(zhí)行查詢粘昨,主要用于使用子查詢的結(jié)果作為基礎(chǔ)進(jìn)一步進(jìn)行外層的查詢垢啼,更適用于二次檢索或過(guò)濾數(shù)據(jù)等操作。在嵌套曾經(jīng)較少的情況下代碼可讀性較高雾棺,但檢索效率較低膊夹。
- 聯(lián)結(jié)查詢是對(duì)不同表的數(shù)據(jù)進(jìn)行了組合,并按照一定條件過(guò)濾捌浩;更適用于查詢多表之間的共有數(shù)據(jù)(如內(nèi)聯(lián)結(jié))或表數(shù)據(jù)的擴(kuò)充(如外聯(lián)結(jié))等場(chǎng)景放刨。
- 組合查詢是將多次相似查詢的結(jié)合進(jìn)行合并展示的一種方式,主要用于對(duì)查詢結(jié)果的聚合尸饺。