在From子句中使用子查询

范例:查询出每个部门的编号、名称、位置、部门人数、平均工资

第一步:查询出部门编号,人数,平均工资。

select deptno,count(empno),avg(sal)

from emp

group by deptno;

第二步:以上返回的数据是多行多列,当做一张数据表来处理,只要在from之后出现,引入dept表

select d.deptno,d.dname,d.loc,temp.count,temp.avg

from dept d ,(select deptno dno,count(empno) count,avg(sal) avg

from emp

group by deptno) temp

where d.deptno = temp.dno(+);

主要目的:子查询的出现主要是为了解决多表查询之中的性能问题。

次要目的:很多时候在From子句里面使用子查询,是因为在外部查询中无法再继续使用统计函数操作的时候。

范例:要求查询出高于公司平均工资的雇员姓名、职位、工资、部门名称、领导姓名、领导职位、部门人数和部门平均工资、工资等级以及此等级的雇员人数。

确定要使用的数据表:

emp表:统计公司的平均工资

emp表:雇员姓名、职位、工资

emp表:自身关联,领导姓名、领导职位

dept表:部门名称

emp表:统计部门人数、部门平均工资

salgrade表:工资等级

emp表:统计一个工资等级的人数

确定已知的关联字段:

雇员和领导:emp.mgr=m.empno

雇员和部门:emp.deptno=dept.deptno

第一步:计算出公司的平均工资,返回单行单列

select avg(sal) from emp;

第二步:找到高于此平均工资的雇员姓名、职位、工资

select e.ename,e.job,e.sal

from emp e

where e.sal >(select avg(sal) from emp );

第三步:领导姓名、领导职位

select e.ename,e.job,e.sal,m.ename,m.job

from emp e,emp m

where e.sal >(select avg(sal) from emp )

and e.mgr = m.empno(+);

第四步:加入dept表,找到部门名称

select e.ename,e.job,e.sal,m.ename,m.job,d.dname

from emp e,emp m,dept d

where e.sal >(select avg(sal) from emp )

and e.mgr = m.empno(+)

and e.deptno = d.deptno;

第五步:部门人数

select deptno dno,count(empno) count

from emp

group by deptno;

select e.ename,e.job,e.sal,m.ename,m.job,d.dname,dtemp.count

from emp e,emp m,dept d,(select deptno dno,count(empno) count

from emp

group by deptno) dtemp

where e.sal >(select avg(sal) from emp )

and e.mgr = m.empno(+)

and e.deptno = d.deptno

and d.deptno (+)= dtemp.dno;

第六步:工资等级,加入salgrade表

select e.ename,e.job,e.sal,m.ename,m.job,d.dname,dtemp.count,s.grade

from emp e,emp m,dept d,(select deptno dno,count(empno) count

from emp

group by deptno) dtemp,salgrade s

where e.sal >(select avg(sal) from emp )

and e.mgr = m.empno(+)

and e.deptno = d.deptno

and d.deptno (+)= dtemp.dno

and e.sal between s.losal and s.hisal;

第七步:找出工资等级的雇员人数,依然需要编写子查询进行统计

select  s1.grade sg,count(e1.empno) count

from emp e1,salgrade s1

where e1.sal between s1.losal and s1.hisal

group by s1.grade;

select e.ename,e.job,e.sal,m.ename,m.job,d.dname,dtemp.count,s.grade,stemp.count

from emp e,emp m,dept d,(select deptno dno,count(empno) count

from emp

group by deptno) dtemp,salgrade s,(select  s1.grade sg,count(e1.empno) count

from emp e1,salgrade s1

where e1.sal between s1.losal and s1.hisal

group by s1.grade) stemp

where e.sal >(select avg(sal) from emp )

and e.mgr = m.empno(+)

and e.deptno = d.deptno

and d.deptno (+)= dtemp.dno

and e.sal between s.losal and s.hisal

and s.grade = stemp.sg;

时间: 2024-10-13 02:02:26

在From子句中使用子查询的相关文章

子查询三(在FROM子句中使用子查询)

FROM子句中使用子查询一般都是返回多行多列,可以将其当作一张数据表 示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc,temp.con,temp.avgsal FROM dept d,(SELECT deptno dno,COUNT(empno) con,ROUND (AVG(sal),2) avgsal FROM emp GROUP BY deptno) temp WHERE d.deptno=temp.dno; 示例二

子查询二(在HAVING子句中使用子查询)

HAVING子句的主要功能是对分组后的数据进行过滤,如果子查询在HAVING中表示要进行分组过滤,一般返回单行单列的数据 示例一.查询部门编号,人数,平均工资,并且要求这些部门的平均工资高于公司的平均工资 --查询部门编号,人数,平均工资,并且要求这些部门的平均工资高于公司的平均工资 SELECT e.deptno,COUNT(e.empno),ROUND(AVG(e.sal),2) FROM emp e GROUP BY e.deptno HAVING AVG(e.sal)>( SELECT

子查询四(在select子句中使用子查询)

示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc, (SELECT COUNT(empno) FROM emp WHERE emp.deptno=d.deptno GROUP BY deptno) con, (SELECT AVG(sal) FROM emp WHERE emp.deptno=d.deptno GROUP BY deptno) avgsal FROM dept d WITH 子句 示例二.使用with子句将e

子查询一(WHERE中的子查询)

子查询 子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,为了让读者更加清楚子查询的概念. 子查询返回结果子查询可以返回的数据类型一共分为四种: 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据: 单行多列:返回一行数据中多个列的内容: 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围: 多行多列:查询返回的结果是一张临时表: 在WHERE子句中使用子查询 在WHERE子句之中处理单行单列子查询.多行单列子查询.单行

详细讲述MySQL中的子查询操作 (来自脚本之家)

继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE table1 (   customer_id VARCHAR(10) NOT NULL,   city VARCHAR(10) NOT NULL,   PRIMARY KEY(customer_id) )ENGINE=INNODB DEFAULT CH

在update语句中使用子查询

在update 中的 where 子句中使用子查询: UPDATE mg_page_log as a  SET  page_num=1 WHERE id in( SELECT id  from mg_page_log WHERE id < 100 GROUP BY visit_id) 会报: You can't specify target table 'a' for update in FROM clause 错误 所以正确的是: UPDATE mg_page_log as a ,( SELE

SQL中的子查询

目录 WHERE子查询 HAVING子查询 FROM子查询 SELECT子查询 EXISIT子查询 查询薪资排名的员工信息(面试) z子查询就是将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件的查询.常见的子查询有WHERE子查询,HAVING子查询,FROM子查询,SELECT子查询,EXISTS子查询,子查询要使用小括号(): WHERE子查询 在WHERE子句中进行使用查询 SELECT * FROM EMP WHERE SAL < (SELECT AVG(SAL)

在 SQL Server 数据库的 WHERE 语句中使用子查询

这是关于子查询语句的一系列文章中的第三篇.在这篇文章中我们将讨论WHERE语句中的子查询语句.其他的文章讨论了其他语句中的子查询语句. 本次课程中的所有例子都是基于Microsoft SQL Server Management Studio和AdventureWorks2012数据库的.读者可以阅读我的SQL Server使用入门学习使用这些免费的工具. 在WHERE语句中使用子查询 在WHERE语句中使用子查询是非常常见的.常见的用法是用EXISTS或IN测试存在性.在某些情况下重新考虑查询语

MySQL中IN子查询会导致无法使用索引

原文:MySQL中IN子查询会导致无法使用索引 今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子查询做的不好,确实会导致无法使用索引的情况(IN子查询无法使用所以,场景是MySQL,截止的版本是5.7.18) MySQL的测试环境 测试表如下 create table test_table2 ( id int a