在实际工作中,有时候业务问题很复杂,这时的SQL语句中会嵌套太多子查询,那么SQL语句的可读性就会变差,有没有好的办法解决这样的问题呢?
答案是用with...as语句。
with…as语句可以将SQL语句中的子查询定义为临时表,起到提高SQL语句可读性的作用,因此它也被归为子查询部分。
with...as语句定义临时表的语法如下:
可以看到,一个with...as语句中可以定义多个临时表,多个临时表用“,”分隔(注意:with...as语句定义临时表结束后,不能加语句结束符“;”)。
使用临时表时,可以用select语句查询临时表中的数据。
例如,4.1.1节面试题9的SQL语句如下:
里面有3个子查询,分别是:
我们用with...as语句将这3个子查询分别定义为临时表a、b、c。
SQL语句的书写方法如下:
使用with...as语句需要注意如下几点。
(1)用with...as语句定义的临时表,后面必须直接跟使用该临时表的SQL语句,否则临时表将失效,如图4.9所示。
图4.9 with...as语句定义的临时表注意事项一
(2)用with...as语句定义的临时表不需要删除,因为它在创建并使用后即释放,不会真实存放在数据库里。可以理解为,将一条SQL语句中的一部分片段封装起来,方便使用。因此,用with...as语句定义的临时表,属于后面直接使用该临时表的SQL语句的一部分,所以,在定义临时表后不能加语句结束符“;”。上面案例的with...as语句中我们就没有加分号“;”。
(3)如果with...as语句定义的临时表名称与某个数据表或视图重名,则紧跟在该with...as语句后面的SQL语句使用的仍然是临时表,而没有紧跟在with...as语句后面的SQL语句使用的是数据表或视图,如图4.10所示。
图4.10 with...as语句定义的临时表注意事项二