子查询:出现在其他SQL语句内的SELECT子句
SELECT * FROM t1 WHERE col1=(SELECT COL2 FROM t2);
1、子查询必须出现在查询内部,并且必须始终出现在圆括号内部
2、子查询可以包括多个关键字或者条件,
DISTINCT , GROUP BY ,ORDER BY, LIMIT ,函数等。
3、子查询的外层查询可以是:SELECT ,INSERT ,UPDATE ,SET 和DO。
子查询可以返回标量,一行,一列或子查询。
由比较运算符引发的子查询
=、>、<、>=、<=、<>、!=、<=>
查找平均价格:
SELECT AVG(goods_price) FROM goods;
保留小数位的函数 ROUND
SELECT ROUND(AVG(goods_price),2) FROM goods; //保留两位小数
查询价格高于平均价格的所有信息
SELECT * FROM goods WHERE goods_price >(SELECT ROUND(AVG(goods_price),2) FROM goods);
用ANY,SOME,ALL修饰的比较运算符
查询所有超极本类型的电脑的价格
SELECT goods_price FROM goods where cate='超极本';//假设有3条信息,即有不同的三种价格
查询所有电脑中价格大于超极本价格的所有信息:
那么:
SELECT * FROM goods where price > (SELECT goods_price FROM goods where cate='超极本');
就是错误的,因为子查询返回了三条信息,所以引入ANY,SOME,和ALL
正确的代码是:
SELECT * FROM goods WHERE price> ANY (SELECT goods_price FROM goods where cate='超极本');
因为>ANY/SOME是大于最小值的数据,所以,这条语句就是查询价格大于超极本最低价格的电脑的所有信息
SELECT * FROM goods WHERE price> ALL (SELECT goods_price FROM goods where cate='超极本');
因为>ALL是大于最大值的数据,所以,这条语句就是查询价格大于超极本最高价格的电脑的所有信息,但是不能=ALL
由[NOT] IN/EXISTS引发的子查询
=ANY 与IN 等效 等于任何一个就是在范围内
!=ALL 或<>ALL 与NOT IN 等效 一个都不等于就是不在范围内
有[NOT]EXISTS引发的子查询
如果子查询返回任何行,EXISTS返回TRUE , 否则返回FALSE.