首页 > 技术文章 > oracle数据库 查询

loveJavaJava 2020-07-29 21:02 原文

今天是数据库查询,求最大,最小,求和,平均值,还有分组查询,子查询,比较难的是链接查询,分内连,左外连,右外连,全外连,只有把表之间的联系想清楚,遵从查询语法规则,慢慢就能写出来。

  学习心得:一定要会找到错误原因,思考修改,问别人会快一点,但是不光要学知识,更要培养修改能力,查资料能力,工作的时候不会有人像现在学习小组有组长帮忙。



----------------------常见的五种组函数----------------------------
--1.MAX():求最大值
--需求1:求员工的最高工资
select max(sal) from emp;
--2.MIN():求最小值
--需求2:求员工的最低工资
select min(sal) from emp;
--3.SUM():求和
--需求3:求员工的总工资
select sum(sal) from emp;
--4.AVG():求平均值
--需求4:求员工的平均工资
select avg(sal) from emp;
--5.COUNT():求总数
--需求5:求员工的总数
--注意:这个*号可以用任意数字替换
select count(*) from emp;--count(1)替换 sql 15条


----------------------分组查询----------------------------
/*分组查询语法:
    分组后能查询的列 只能是 (分组列和聚合函数)
  select 分组条件【,分组条件1,分组条件2。。。】 from 表名
  where 条件                                                  --可选语句
  group by 分组条件【,分组条件1,分组条件2。。。】           --分组必须语句
  having  对分组进行过滤     --可选语句
  order by 排序条件          --可选语句
*/
----------使用group by对查询后的记录进行分组-------------
--需求1:求每个部门的平均薪水
select  deptno,avg(sal) as avg_sal
from emp
group by deptno;

--需求2:每个部门同一个职位的最大工资
select deptno ,job, max(sal)  
from emp
group by deptno,job;

----------使用having对分组以后的数据进行再过滤-----------
--需求1:按照部门编号进行分组,分组之后求每一个部门的平均薪水,要求显示平均薪水大于2000的部门的部门编号和平均薪水
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>2000;

--需求2:薪水大于1200的雇员,按照部门编号进行分组,
--分组之后平均薪水必须大于1500,求分组内的平均工资,平均工资按倒序排列
--注意:排序的字段必须是查询字段之中
select deptno,avg(sal)
from emp
where sal>1200
group by deptno
having avg(sal)>1500
order by avg(sal) desc;


----------------------子查询(嵌套查询)----------------------------
--需求1:求最大工资那个人的姓名和薪水
--分解第一步:求最高工资
select max(sal) from emp;
--分解第二步:求最高工资的那个员工叫什么
select ename,sal from emp where sal=5000;
--分解第三步:合并
select ename,sal from emp where sal=(select max(sal) from emp);  

--需求2:哪些人得工资位于 所有人得平均工资之上
--分解第一步:求平均工资
select avg(sal) from emp;
--分解第二步:工资大于平均工资的 人的姓名、工资
select ename,sal from emp where sal>2073.21428571429;
--分解第三步:合并
select ename,sal from emp where sal>(select avg(sal) from emp);


----------------------连接查询----------------------------
--------内连接(交集)
--语法: select * from 表1 inner join 表2 on (表1.字段=表2.字段)
--需求:查询员工姓名、薪水、部门名称
select e.ename,e.sal,d.dname
from dept d inner join emp e
on (d.deptno = e.deptno);

/*外连接分类:左外连接、右外连接、全外连接*/
-------左外连接(并集)outer可以省略 on 相当于where
--语法: select * from 表1 left outer join 表2 on (表1.字段=表2.字段)
--需求:在内连接的基础上,保证左表的数据都有 (右表的字段用空补全)
--注意:外连接语句中的outer关键字可以省略
select * from dept left outer join emp
on (dept.deptno = emp.deptno);

-------右外连接
--语法: select * from 表1 right outer join 表2 on (表1.字段=表2.字段)
--需求:在内连接的基础上,保证右表的数据都有 (左表的字段用空补全)
select * from dept right outer join emp
on (dept.deptno = emp.deptno);

-------全外连接
--语法: select * from 表1 full outer join 表2 on (表1.字段=表2.字段)
--需求:在内连接的基础上保证左右表的数据都有 (左连接和右连接的并集)
select * from dept full outer join emp
on (dept.deptno = emp.deptno);

-------交叉连接(笛卡尔积)和自然连接
--语法: select * from 表1 cross join 表2
select * from emp;-- sql 15条
select * from dept;-- sql 9条       
select ename,dname from emp,dept;--?sql 135条
select ename,dname from dept cross join emp;--?sql  135条
--左表15条*右表9=查询结果共135条

-------自然连接
--语法: select * from 表1 natural join 表2
select * from dept natural join emp;


----------------------等值连接和非等值连接----------------------------
------等值连接
--需求:查询员工名称和部门名称
select ename,dname from emp join dept
on (emp.deptno=dept.deptno);

------非等值连接(演示连接三张表)
--需求: 查询姓名、薪水、部门名称 、薪水等级
select emp.ename,emp.sal,dept.dname,salgrade.grade
from dept
inner join emp on(dept.deptno = emp.deptno)
inner join salgrade    
on (emp.sal between  salgrade.losal and salgrade.hisal);


-----------------------自关联------------------------------
--需求1:SMITH这个人的名字 以及他的经理人的名字
select employee.ename,manager.ename
from emp manager inner join emp employee
on(manager.empno=employee.mgr)
where employee.ename='SMITH';

--需求2:查询所有员工的名字和上司的名字
select employee.ename,manager.ename
from emp manager right join emp employee    
on(manager.empno=employee.mgr);


























推荐阅读