SELECT * FROM (SELECT column1,column2,.., FROM table_name) AS v
SELECT * FROM table_A a
INNER JOIN (SELECT column1,column2,.. FROM table_b) b ON a.column1 = b.column1
SELECT * FROM table_A
WHERE column1 IN (SELECT column1 FROM table_B WHERE column2 IS NOT NULL)
SELECT * FROM table_A WHERE column1 IN ('A','B')
SELECT * FROM table_A
WHERE column1 =ANY (SELECT column1 FROM table_B WHERE column2 IS NOT NULL)
=ALL关键字很少使用,这个的效果在子查询中如果只有一个返回值,则和‘=’效果一样,而如果有多个返回值,结果为空
相关子查询和EXISTS关键字
上面所说的子查询都是无关子查询,子查询中还有一种很重要的查询是相关子查询,也叫重复子查询,比如,还是上面那个查询,用相关子查询来写:
SELECT * FROM table_A a
WHERE EXISTS (SELECT * FROM table_B b WHERE a.column1=b.column1 AND column2 IS NOT NULL)
查询的结果是和IN关键字的效果是一样的,那么如何区分相关子查询和无关子查询呢?最简单的方法就是直接看子查询本身是否可以执行,比如上面的子查询
SELECT * FROM table_B b WHERE a.column1=b.column1 AND column2 IS NOT NULL
高亮部分引用了外部查询的表,所以单独执行会报错
对于无关子查询来说,整个查询过程可分为,子查询只执行一次,然后交给外部查询
对于相关子查询来说,整个查询过程可分为,外部查询执行一次,内部查询就查询一次,依赖外部查询的次数,所以这也是被叫作重复子查询的原因,比如拿上面的相关子查询的例子来说:
SELECT * FROM table_A a
WHERE EXISTS (SELECT * FROM table_B b WHERE a.column1=b.column1 AND column2 IS NOT NULL)
step1:执行外部查询SELECT * FROM table_A a,此时查询了第1条数据,column为1(打比方)
step2:执行内部查询SELECT * FROM table_B b WHERE a.1 = b.column AND column2 IS NOT NULL,如果table_B中存在column1为1的数据,则返回true,否则false
step3:执行WHERE子句,返回结果为true的数据
step4:执行下一次循环,回到步骤1,此时查询了第2条数据,column2为2,重复以上步骤,直至结束
子查询作为计算列使用
当子查询作为计算列使用时,只返回单值,用在SELECT语句之后,同样也分为无关子查询与相关子查询
相关子查询的例子有:
SELECT column1,(SELECT column2 FROM table_B b where a.column1=b.column1) AS column2 FROM table_A a
当子查询作为计算列使用时,且为相关子查询时,会针对外部查询的每一行,返回唯一的值。
当子查询作为计算列使用时,且为无关子查询时,则只会一次性返回一个相同值