一、定义
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