SQL语句复习【专题五】
SQL语句复习【专题五】
单行子查询:只会得到一个结果的子查询【子查询的内容必须放在小括号中。在查询语句中的查询语句 】
--查询所有比 CLARK 员工 工资高的员工
--1.先查询 CLARK 员工的工资
select sal from emp where ename='CLARK'--2450
--2.然后拿着CLARK的工资去比较
select * from emp where sal > 2450 order by sal
--3.合二为一 => 子查询
select * from emp where sal > (select sal from emp where ename='CLARK') order by sal
--查询工资高于平均工资的员工的名字和工资
--1.先查询平均工资
select avg(sal) from emp
--2.合二为一 => 子查询
select ename, sal from emp where sal > (select avg(sal) from emp)
--查询和scott同一个部门的,但是比scott入职时间早的员工的信息
--1.先查询 scott 的部门编号
select deptno from emp where ename='SCOTT'--20
--2.查询scott 的入职时间
select hiredate from emp where ename='SCOTT'--87,4,19
--3.最终SQL语句
select * from emp where deptno=(select deptno from emp where ename='SCOTT') and hiredate<(select hiredate from emp where ename='SCOTT')
--查询 和 scott 同一个部门,但是比scott工资低的员工的信息
--1.先查询 scott 的部门编号
select deptno from emp where ename='SCOTT'--20
--2.在查询scott 的工资
select sal from emp where ename='SCOTT'--3000
--3.最终SQL语句
select * from emp where deptno=(select deptno from emp where ename='SCOTT') and sal < (select sal from emp where ename='SCOTT')
--查询 比scott 工资高或者入职时间比scott早的员工的编号 和姓名
--1.查询scott 的工资
select sal from emp where ename='SCOTT'--3000
--3.查询scott 的入职时间
select hiredate from emp where ename='SCOTT'--87,4,19
--3.最终SQL语句
select empno, ename from emp
where sal > (select sal from emp where ename='SCOTT') or hiredate< (select hiredate from emp where ename='SCOTT')
多行子查询:子查询的结果会有多个
1) all: 和所有的子查询的结果去比较
2) any:和子查询的结果集中的任意一个比较
3) in: 和子查询的结果集中的某一个比较是否相等
--查询工资低于任意一个 ‘CLERK’的工资的员工信息
--1.先查出所有的 职员 的工资
select sal from emp where job='CLERK'
--2.最后SQL语句
select * from emp where sal < any(select sal from emp where job='CLERK')
--查询工资 比所有的'SALESMAN'都高的员工的编号,姓名,工资
--查询所有的销售人员的工资
select sal from emp where job='SALESMAN'
--2.最后SQL语句
select empno,ename,sal from emp where sal > all(select sal from emp where job='SALESMAN')
--查询20号部门的中职务和10号部门职务相同的员工的信息
--1.先求10号部门的所有的人的工作
select distinct job from emp where deptno=10
--2.最终SQL
select * from emp where deptno=20 and job in(select distinct job from emp where deptno=10)
--查询哪些员工是领导,将领导的信息全部显式
--in any
--统计领导的编号
select distinct mgr from emp where mgr is not null
-- in 员工的编号 在领导的编号的集合中
select *from emp where empno in(select distinct mgr from emp where mgr is not null)
--any 员工的编号等于 领导的编号集合中的某一个
select * from emp where empno=any(select distinct mgr from emp where mgr is not null)
--查询20号部门中收入最高的职员的信息
--先求20号部门的最高工资 3000
select max(sal) from emp where deptno=20
--最终SQL语句
select *from emp where sal=(select max(sal) from emp where deptno=20)
--查询所有部门的平均薪水的等级
-- 1.先查询所有的部门的平均薪水
select deptno,avg(sal) from emp group by deptno
--将子查询作为一张表
--sql 92
select T.deptno, T.avg_sal, s.grade
from (select deptno,avg(sal) avg_sal from emp group by deptno) T, salgrade s
where T.avg_sal between s.losal and s.hisal
--sql 99
select T.deptno, T.avg_sal, s.grade
from (select deptno,avg(sal) avg_sal from emp group by deptno) T join salgrade s
on T.avg_sal between s.losal and s.hisal
--查询部门的详细信息,以及部门的平均工资和工资等级 三表查询
-- 查询所有的部门的平均薪水
select deptno,avg(sal) from emp group by deptno
--sql92
select d.*,T.avg_sal,s.grade
from (select deptno,avg(sal) avg_sal from emp group by deptno) T, salgrade s,dept d
where T.avg_sal between s.losal and s.hisal and T.deptno=d.deptno
--sql99
select d.*,T.avg_sal,s.grade
from (select deptno,avg(sal) avg_sal from emp group by deptno) T join salgrade s
on T.avg_sal between s.losal and s.hisal
join dept d
on T.deptno=d.deptno
相关子查询
--1:查询所有的部门的最高工资的员工的信息
--查询10部门的最高工资的员工的信息
--10部门的最高工资
select max(sal) from emp where deptno=40
select * from emp where deptno=10 and sal=(select max(sal) from emp where deptno=10)--1
select * from emp where deptno=20 and sal=(select max(sal) from emp where deptno=20)--2
select * from emp where deptno=30 and sal=(select max(sal) from emp where deptno=30)--1
select * from emp where deptno=40 and sal=(select max(sal) from emp where deptno=40)
-----------------------------------------------------------------------------------------------------------------------------
select * from emp e where sal=(select max(sal) from emp where deptno=e.deptno)
--2:查询工资高于其所在部门的平均工资的员工的信息
--查询工资高于10部门的平均工资的10部门员工的信息
--10部门的平均工资
select avg(sal) from emp where deptno=10
select * from emp where deptno=10 and sal > (select avg(sal) from emp where deptno=10)--1
select * from emp where deptno=20 and sal > (select avg(sal) from emp where deptno=20)--3
select * from emp where deptno=30 and sal > (select avg(sal) from emp where deptno=30)--2
-------------------------------------------------------------------------------------------------------------------------------------
select * from emp e1 where sal > (select avg(sal) from emp e2 where e2.deptno=e1.deptno)
总结:
--不相关子查询:可以单独运行,先执行子查询再执行 外查询。
--相关子查询:不可以单独运行,先执行外查询,再执行子查询。
--3:查询所有部门的最高工资的员工的信息
--查询所有部门的最高工资
select deptno, max(sal) from emp group by deptno
--方式-1
select e.*
from emp e, (select deptno, max(sal) max_sal from emp group by deptno) T
where e.deptno=T.deptno and e.sal=T.max_sal
--方式-2
select * from emp where (deptno,sal) in (select deptno, max(sal) from emp group by deptno)
----------------------------------------------------------------小练习---------------------------------------------------------------------
--1、列出所有员工的年工资,按年薪从低到高排序。
select ename, sal*12+nvl(comm,0)*12 year_sal from emp order by year_sal
--2、列出薪金比“ SMITH ”多的所有员工。
select * from emp where sal>(select sal from emp where ename='SMITH')
--3、列出所有员工的姓名及其直接上级的姓名。 sql92 , sql99
--sql92
select e1.ename,e2.ename
from emp e1, emp e2
where e1.mgr= e2.empno
--sql99
select e1.ename,e2.ename
from emp e1 join emp e2
on e1.mgr= e2.empno
--4、列出受雇日期早于其直接上级的所有员工。
--sql99
select e1.*
from emp e1 join emp e2
on e1.mgr=e2.empno
where e1.hiredate < e2.hiredate
--5、列出部门名称和这些部门的员工信息,包括那些没有员工的部门。
select d.dname,e.*
from emp e right join dept d
on e.deptno=d.deptno
--6、列出所有job 为“ CLERK ”(办事员)的姓名及其部门名称。
select e.ename,d.dname
from emp e join dept d
Using(deptno)
where e.job='CLERK'
--7、列出最低薪金大于1500 的各种工作。
select job, min(sal)
from emp
group by job
having min(sal) > 1500
--8、列出在部门“ SALES ”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
select e.deptno,e.ename
from emp e join dept d
on e.deptno=d.deptno
where d.dname='SALES'
--9、列出薪金高于公司平均薪金的所有员工。
select * from emp where sal > (select avg(sal) from emp)
--10、列出与“ SCOTT ”从事相同工作的所有员工。
select * from emp where job=(select job from emp where ename='SCOTT') and ename<>'SCOTT'
--11、列出薪金高于在部门 30 工作的所有员工的薪金的员工姓名和薪金。
select ename,sal from emp where sal>all(select sal from emp where deptno=30)
--12、列出在每个部门工作的员工数量、平均工资和平均服务期限(年)。
select deptno, count(*), avg(sal) , avg(to_char(sysdate,'YYYY')-to_char(hiredate,'YYYY')) 平均服务年限
from emp
group by deptno
--13、列出所有员工的姓名、部门名称和工资。
select e.ename,d.dname,e.sal from emp e natural join dept d
--14、列出从事同一种工作但属于不同部门的员工的一种组合。
select e1.ename,e1.job ,e1.deptno,e2.ename,e2.job,e2.deptno
from emp e1 join emp e2
on e1.job=e2.job and e1.deptno<>e2.deptno and e1.ename >e2.ename
--15、列出所有部门的详细信息和部门人数。
select d.*, count(*)
from emp e join dept d
on e.deptno=d.deptno
group by d.deptno,d.dname,d.loc select d.*,count(e.ename) from dept d left join emp e
on d.deptno = e.deptno
group by d.deptno,d.dname,d.loc
--16、列出各种工作的最低工资。
select job,min(sal) from emp group by job
-- 17 、列出各个部门的 MANAGER (经理)的最低薪金。
select deptno,min(sal)
from emp
where job='MANAGER'
group by deptno
--18、列出至少有一个员工的所有部门。
select d.*,count(*)
from emp e join dept d
on e.deptno=d.deptno
group by d.deptno,d.dname,d.loc
having count(*)>0
小练习
SQL语句复习【专题五】的更多相关文章
- SQL语句复习【专题一】
SQL语句复习[专题一] --创建用户 scott 并设置密码为 tiger create user scott identified by tiger --用户刚刚创建没有任何的权限,连登录的权限都 ...
- SQL语句复习【专题二】
SQL语句复习[专题二] 单行函数(日期.数学.字符串.通用函数.转换函数)多行函数.分组函数.多行数据计算一个结果.一共5个.sum(),avg(),max(),min(),count()分组函数 ...
- SQL语句复习【专题三】
SQL语句复习[专题三] DML 数据操作语言[insert into update delete]创建表 简单的方式[使用查询的结果集来创建一张表]create table temp as sele ...
- SQL语句复习【专题四】
SQL语句复习[专题四] 多表查询 sql 92多表查询 sql92.sql99 标准--查询所有员工的姓名,部门编号,部门名称select * from empselect * from dept- ...
- SQL语句复习【专题六】
SQL语句复习[专题六] 用户 + 创建表 --创建一个新的用户,然后给新的用户创建一张表,然后给表中添加一些数据.查询表中的数据 --创建用户需要比较大的权限 DBA create user di ...
- SQL语句复习【专题七】
SQL语句复习[专题七] 完整性约束分类1)域完整性约束(非空not null,检查check)2)实体完整性约束(唯一unique,主键primary key)3)参照完整性约束(外键foreign ...
- SQL语句复习【专题八】
SQL语句复习[专题八] 序列 Sequence.数据库对象是 oracle 专有的.作用:可以将某一列的值使用序列,来实现自动增长的功能.访问序列的值.[序列有两个属性 nextval currva ...
- SQL语句复习【专题九】
SQL语句复习[专题九] 视图:View视图的概念:视图是从若干基本表或其他视图构造出来的表.在创建一个视图时,只是存放的视图的定义,也即是动态检索数据的查询语句,而并不存放视图对应的数据在用户使用视 ...
- sql语句复习(基础-提升-技巧-经典数据开发案例-sql server配置)
1 基础 1.说明:创建数据库 CREATE DATABASE database-name charset=utf8 2.说明:删除数据库 drop database dbname 3.说明:备份sq ...
随机推荐
- R语言常用包简介
- syspolicy_purge_history作业故障排除
描述 我们有一台数据库服务器windows 2012 r2 上有安装sql server 2012 和sql server 2016双实例,后续又把sql 2016的服务全部停用,即只保留sql 20 ...
- SpringMVC中实现Bean Validation(JSR 303 JSR 349 JSR 380)
JSR 303是针对bean数据校验提出的一个规范.使用注解方式实现数据校验. 每个注解的用法这里就不多介绍,请移步JSR 303 - Bean Validation 介绍及最佳实践 笔者上面提到的J ...
- 手写web框架之实现依赖注入功能
我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...
- linux下正确卸载rpm包
linux下正确卸载rpm包 rpm -qa | grep -i ntp 执行结果: [root@bogon elasticsearch-head]# rpm -qa | grep -i ntp fo ...
- 模板引擎总结(Thymeleaf,FreeMarker,Enjoy,Velocity,JSP等)
在java领域,表现层技术主要有以下几种, (1)jsp; (2)freemarker; (3)velocity; (4)thymeleaf; (5)Enjoy; 1.JSP 优点: 1.功能强大,可 ...
- 一、Node.js安装及环境配置之Windows篇
一.安装环境 1.本机系统:Windows 10 Pro(64位)2.Node.js:v6.9.2LTS(64位) 二.安装Node.js步骤 1.下载对应你系统的Node.js版本:https:// ...
- sql server 备份语句
1.BACKUP DATABASE your_database TO DISK = 'diff.bak'with DIFFERENTIAL #差异备份,仅备份数据2.BACKUP DATABASE y ...
- Django:(04)状态保持和验证
一.Cookie 特点 Cookie是由服务器(网站)生成的,存储在浏览器端的 键值对数据(通常经过加密) 在响应请求时,服务器会把生成 Cookie数据 发给浏览器,浏览器会自动保存 (前提:浏 ...
- SpringCloud学习(七)高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)
上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用 准备工作 ...