一、定義
1. 子查詢(subquery):是被另一個查詢包圍的查詢,也可稱為內層查詢(INNER query),另一個查詢可稱為外層查詢(OUTER query)
① 非關聯子查詢:即子查詢可以獨立運行且不會引用外層查詢的任何結果;
② 關聯子查詢:子查詢依賴外層查詢,它需要來自外層的查詢結果
備注:
外層查詢+內層查詢=以子查詢進行查詢
子查詢的查詢速度低于連接
二、非關聯子查詢
1.代碼
SELECT tb1.column_name1,tb1.column_name2,tb2.column_name3 FROM
table_name1 AS tb1 NATURAL JOIN ?table_name2 AS tb2
WHERE?
tb2.column_name3 IN(SELECT column_name3 FROM table_name3)
也可使用 'NOT IN' 查找不符合的結果
3、注意事項
① WHERE后可以使用比較運算符;但是大部分時間里需返回單一值,'IN'除外;
② 使用‘=’比較運算符時,內層查詢返回的結果是一個單一值(SQL稱為標量值),例如:
SELECT name FROM table_name?
WHERE
zip_code=(SELECT zip_code FROM table_name1 WHERE province='sichuan' AND city='guangan')
③ 子查詢在SELECT的列名中
SELECT name,
(SELECT province FROM table_name2 WHERE tb1.zip_code=zip_code) ?AS province?
FROM table_name1 tb1
子查詢每次返回一個值,整個查詢跟著返回一行,逐次循環返回結果。
三、關聯子查詢
1.NOT EXISTS 和 EXISTS
常用于找出外層查詢結果不存在于關聯表里的記錄
SELECT name tb1.email email FROM table_name1?
WHERE NOT EXISTS
(SELECT * FROM table_name2 WHERE tb1.id=tb2.id)
2.EXISTS
同理,也可找出外層查詢結果存在于關聯表里的記錄
即把NOT EXISTS 改成?EXISTS