好用,但慎用,有性能坑、建议用关联查询代替。
本文参考3W学习方法来叙述内容。
一、What
1、什么是子查询?
子查询指将一个查询语句嵌套在另一个查询语句中。该特性从 MySQL 4.1 开始引入。
二、Why
1、子查询可以做什么?
通过子查询可以实现多表查询,可以在 SELECT、UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套,子查询经常出现在 WHERE 子句中。
三、How
1、子查询在WHERE子句中的语法格式?
WHERE <表达式> <操作符> (子查询)
例如: SELECT * FROM table1 WHERE key1 IN (SELECT key1 FROM table2 WHERE name = 'abc');
其中,操作符可以是 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。
- IN: 表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;
- NOT IN: 表达式与子查询返回的结果集中的某个值相等时,返回 FALSE,否则返回 TRUE;
- EXISTS: 子查询的结果集不为空,返回 TRUE,否则返回 FALSE;
- NOT EXISTS: 子查询的结果集为空,返回 TRUE,否则返回 FALSE;
另外,当子查询的返回结果只有一行一列数据时,操作符可以是比较运算符=, >, <, >=, <=, <>,例如:
select * from table1 where key1 = (select key1 from table2 where key2 = '001');
2、子查询在SELECT语句中的语法格式?
SELECT (子查询) FROM 表名;
子查询结果应该为单行单列,可以不指定列别名。
3、子查询在FROM语句中的语法格式?
SELECT * FROM (子查询) AS 表的别名;
必须为子查询结果指定别名,相当于临时表名。
4、mysql中子查询的性能问题?
据说,mysql处理子查询时、会先扫描外查询中的数据集,再处理子查询,外部查询执行一次,子查询就执行一次。所以当使用子查询作为where子句条件时,注意父查询表是否存有大量数据,如果超过百万级,则建议改为关联查询。