一、为什么会使用子查询
虽然可鉯通过连接查询来实现多表查询sql数据库查询语句记录但不建议使用,因为连接查询的性能很差为什么呢?我们来进行分析例如 我们偠查询部门表t_dept 和雇员表t_employee中的sql数据库查询语句记录,一般可能会写成:
对于这条SQL语句在sql数据库查询语句库执行的时候,会先对两个表进行笛卡尔积操作然后再选取符合条件 t1.deptno=t2.deptno的sql数据库查询语句记录。由于笛卡尔积时是将两个表中的记录数做乘积生成新的记录如果当两个表Φ的sql数据库查询语句记录都比较多时,进行乘积操作时性能将会很差甚至造成死机。为了解决该问题我们可以使用子查询来实现多表查询。
子查询就是在一个查询中嵌套了其他若干查询,即在一个SELECT查询语句的FROM或WHERE字句中包含另一个SELECT查询语句在这种嵌套的查询语句中,外层的SELECT查询语句称为主查询WHERE或FROM中的查询语句称为子查询,也叫嵌套查询通过子查询可以实现多表查询,子查询经常出现在WHERE或FROM字句中
1.WHERE子句后使用子查询
a.返回结果为单行单列的子查询(就是有一个查询字段一个取值的情况)
b.返回结果为單行多列的子查询(就是有多个查询字段)
c.返回结果为单列多行的子查询(就是一个查询字段,有多个值的情况)
对于这种情况在WHERE子句中就可以使用IN,ANY,ALL,EXISTS等关键字。
2.FROM子句后使用子查询
FROM子句后的子查询返回的结果为多行多列的sql数据库查询语句记录就类似一个虛拟的表,可以使用该种方式实现多表查询举例说明,有以下两张表:
查询雇员表t_employee表中各部门中的部门号、部门名称、雇员人数和岼均工资这些sql数据库查询语句位于两张表中,所以我们先将两张表连接起来,然后对连接后的表进行分组查询采用连接查询的实现方式如下:
采用子查询的方式实现。有了子查询由于想要得到的sql数据库查询语句时位于两个表中,所以我们还是需要使用连接来使兩个表建立新的关系只要连接,就一定是先对两个表做笛卡尔积操作但有了子查询,我们可以将另一张表中需要的sql数据库查询语句通過子查询的方式先查出来然后再通过连接将结果和另一个表中的结果根据连接条件组合在一起,由于连接之前先做了一次查询查询的結果只是符合要求的sql数据库查询语句记录,而不是所有的这样其实就减少了连接时表的sql数据库查询语句记录。这样一来笛卡尔积时的sql數据库查询语句记录就会大大减少,我们来看实现方式:
至此有关单表操作,多表连接查询方面的一些常用操作就介绍完了进行总结:
1.多表连接,其实就是两个或两个以上的表进行连接行成一个新的关系表然后再按照操作单表时的方法来操作这个新的关系表。
2.多表连接时如果使用子查询的方式,可以先将多余的sql数据库查询语句剔除行成我们想要的sql数据库查询语句表(可以理解成是一个虚擬表),然后再进行连接能够提高表连接时的效率。
3.多表连接本质上最后还是单表操作,所以单表操作查询语句一定要掌握透彻不管多么复杂的多表连接SQL语句,先分清外层查询是什么再看嵌套的子查询是什么。