数据库的子查询

在数据库中会遇到子查询也会遇到多表连接,但是有的时候多表查询和子连接可以相互的转换(主要还是看情况,有的时候转换容易,而有的时候转换是非常困难的。


###个人的理解是只用什么方便就用哪个查询,使用哪个顺手就用哪个查询。不要因为这两个方法可以相互转换写出来一个就要想破脑袋的将另一个方法也写出来,虽然可以转换,但有的时候真的可能转换不聊,尤其是对刚接触SQL子查询的新手,对什么都充满了好奇,想出一种方法就想用另一种方法将其求解出来。)
###首先先说一下使用这两个方法的条件(说错了,请大家指点) ###使用连接的时候。假设要显示两个列,其中一个列来至一张表,另一个列来至令一张表。需要将这两张表都显示出来的话,需要将这两张表进行关联之后再显示出来。例如:常用的有员工表和部门表 ![](http://images2017.cnblogs.com/blog/1017814/201708/1017814-20170809122753824-1448412182.png) 员工表 ![](http://images2017.cnblogs.com/blog/1017814/201708/1017814-20170809122850261-1315840118.png) 部门表 要将这从这两个部门中的分别抽取一个值(员工表中取一个:员工的姓名,部门表中从中抽取一个:部门的名称)写出的结果如下表: ``` SELECT a.last_name,b.department_name FROM HR.EMPLOYEES a JOIN HR.DEPARTMENTS b ON a.department_id = b.department_id; ``` ![](http://images2017.cnblogs.com/blog/1017814/201708/1017814-20170809123154183-468275339.png) ###使用子查询的时候。假如要显示一个表中的重要数据。需要跟另一个表中的数据进行对比之后才能显示出来(或者是与本表中的某个数据进行对比才能显示出来),但是不需要显示对比的表的内容。所以可以使用子查询的方式进行挑选。 ###使用的例子:假设要查询员工号等于某一个员工,工资比某一员工高的员工。如下: ``` //使用子查询的方式进行写 SELECT last_name, job_id, salary FROM HR.employees WHERE job_id = ( SELECT job_id FROM HR.employees WHERE last_name = 'Abel' ) AND salary > ( SELECT salary FROM HR.employees WHERE last_name = 'Abel' );
//使用多表连接
SELECT a.last_name
FROM HR.EMPLOYEES a
JOIN HR.EMPLOYEES b ON(a.job_id = b.job_id)                        //使用等值的方式进行连接
JOIN HR.EMPLOYEES c ON(a.salary > c.salary)                        //使用非等值的方式进行连接
WHERE B.LAST_NAME = 'Abel' AND c.last_name = 'Abel'        //个人的理解:将各各表中的内容进行筛选
![](http://images2017.cnblogs.com/blog/1017814/201708/1017814-20170809124617495-1786967866.png)
原文地址:https://www.cnblogs.com/gxcstyle/p/7324660.html