子查询

发表时间:2017-05-11 16:49:24 浏览量( 22 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

首先,我们先讲讲子查询的语法,在一条查询语句中可能会有两个select查询,其中内部查询也称为子查询,是在主查询之前执行一次的,子查询的结果被用于主查询(外部查询)。其常用个课时如下:

select * from 表 where (condition  包含另外一个查询也就是子查询。)

一、单行子查询

有的时候返回的结果只有一行数据,那么我们使用单行比较运算符,就是可以直接时候用

查询工资比奥巴马高的所有的员工,这个题目事实上需要做连个查询

1、查询奥巴马的工资。

select  salary from employee where employee_name='奥巴马'

得到一行查询结果如下:

attcontent/9783abf5-d55e-43a8-ab24-98cb6ffbf79e.png

select * from employee where salary>2000

2、根据奥巴马的工资作为比较条件,查询比它高的工资的员工信息

上面两条查询事实上可以使用子查询整合成为一条查询语句:

select * from employee where salary>(select  salary from employee where employee_name='奥巴马')

子查询会先执行。然后根据子查询的结果传入主查询。

类似例子还有:

--查询所有比平均工资高的员工
select * from employee where salary>(select avg(salary) from employee)
--查询部门1里面比平均工资高的员工
select * from employee where salary>(select avg(salary) from employee) and dep_id=1

二、多行子查询

上面的子查询的结果都只有一行语句返回,如果子查询有多行语句返回那么直接使用比较符合就会报错,我们需要结合下面几个关键字,更好表达出我们的查询要求:

  • IN:表示与列表中的任一成员相等(1,2,3 )

  • ANY:表示与子查询返回的每一个值比较,只要有一个满足条件即可。

  • ALL:表示与子查询返回的所有值比较,必须全部都符合条件才行。

如下面几个例子:

--查询部门1里面比部门2的所有人得工资都高员工
select * from employee where dep_id=1 and salary > all(select salary from employee where dep_id=2)
--查询部门1里面比部门2的其中一个人得工资高员工
select * from employee where dep_id=1 and salary > any(select salary from employee where dep_id=2)
--查询部门1和部门2工资有相同的员工
select * from employee where dep_id=1 and salary in(select salary from employee where dep_id=2)

三、相关子查询

子查询参考父查询表中的一列,子查询依靠外部查询获得值。这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。所以相关子查询的效率是比较低的。

如下面这个例子:

--查询所有工资超过他们本部门的平均工资的员工信息

select * from employee oe  where salary>(select avg(salary) from employee where dep_id=oe.dep_id)

每一次子查询都需要从主查询中获得当前员工的部门id,这里我们给主查询的表设置了一个别名,以在子查询中表区分开来。

四、使用EXISTS运算符

EXISTS运算符检测子查询的结果集中行的存在,他的执行过程是:如果一个子查询的行值被找到,内部查询中的搜索将不会继续,条件将会标记为TRUE。相反,如果一个子查询的行值没有被找到,条件将会标记为FALSE。

--查找有个工作职位变动的员工的姓名
select employee_name from employee e 
   where exists(select * from JOB_HISTORY where employee_id=e.employee_id)