数据库查询
一、模糊查询 二、order by的用法(排列) 三、限制记录的行数 四、rownum用法 五、函数
————————————————————————————————————————————————————————————————————————————————
一、模糊查询
like %代表零或任意更多的字符
_代表一个字符。(下划线)
eg:查询姓名以w开头的人员。
select * from emp where ename like 'w%'
查询职位以MAN_开头的员工信息。
select * from emp where ename like 'MAN@_%' escape '@'
二、order by的用法(排列)
order by 字段名1 asc/desc
三、限制记录的行数
使用select语句时,经常要返回前几条或者中间某几行记录,可以使用关键字limit。语法格式如下:
select 字段列表 from 数据源 limit [start,]length;
说明:1.limit接受一个或两个整数参数。start表示从第几行记录开始输出,length表示输出的记录行数。
2.表中第一行的start为0(不是1)。
四、rownum用法
1.查询员工信息及其所在部门信息,要求没有员工的部门也要显示
select * from emp,dept where emp.deptno(+) = dept.deptno
2.查询职位和10部门任意一个员工职位相同的员工姓名、职位
select ename,job from emp where job= any(select job from emp where deptno =10)
select ename,job from emp where job in(select job from emp where deptno =10)
3.查询员工岗位中不是以“SA”开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排列。
select job,avg(sal) from emp where job not like 'SA%' group by job having avg(sal) > 2500 order by avg(sal) desc
五、单行子查询
1、查询工资是最低工资的员工信息
select *
from emp
where sal=(select min(sal)
from emp)
2、查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期
select ename,hiredate
from emp
where hiredate<(select min(hiredate)
from emp
where deptno=20)
3、查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数
select deptno,dname,count(ename)
from emp
join dept
using (deptno)
group by deptno
having count(ename)> (select avg(a.c)
from (select count(ename) c
from emp
group by deptno) a)
六、多行子查询(in,any,all)
in 与任意一个值相等
>any 有一个值比左边的字段小,即大于最小值
<any 有一个值比左边的字段大,即小于最大值
=any 有一个值等于左边的字段 >all 大于最大值
<all 小于最小值
1、查询是经理的员工姓名,工资
select distinct m.ename,m.sal
from emp e
join emp m
on e.mgr=m.empno --(多表连接写法)
或
select ename,sal
from emp
where empno in (select mgr
from emp)
或select ename,sal
from emp
where empno=any (select mgr
from emp)
2.查询不是经理的员工姓名
select ename
from emp
where empno not in(select mgr
from emp
where mgr is not null)
3.查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资。
select ename,sal,a.deptno,a.avg_sal
from emp,(select deptno,avg(sal) avg_sal
from emp
group by deptno) a
where emp.deptno = a.deptno
and emp.sal > a.avg_sal
4、查询工资是本部门最低工资的员工信息
select *
from emp,(select deptno,min(sal) b
from emp
group by deptno) a
where emp.deptno=a.deptno
and emp.sal=a.b
或
select *
from emp
where (deptno,sal) in (select deptno,min(sal)
from emp
group by deptno)
或
select *
from emp e
where sal = (select min(sal)
from emp
where deptno = e.deptno)
七、多列子查询
select *
from emp
where (deptno,sal) in (select deptno,min(sal)
from emp
group by deptno)
八、相关子查询
select *
from emp e
where sal=(select min(sal)
from emp
where deptno=e.deptno)
1、利用相关子查询求比自己部门平均工资高的员工信息
select *
from emp e
where sal>(select avg(sal)
from emp
where deptno=e.deptno)
2.查询员工工资为其部门最低工资的员工的编号和姓名及工资。
select empno,ename,sal
from emp e
where sal = (select min(sal)
from emp
where deptno = e.deptno)
3. 显示每个部门的最高工资的员工
select deptno,ename,sal
from emp
where (deptno,sal) = any (select deptno,max(sal)
from emp
group by deptno)
五、函数
(一)分组函数
max(expr:)求expr的最大值
(二)非空函数
1.NVL函数
NVL函数的格式如下:NVL(expr1,expr2)
含义是:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。
2 NVL2函数
NVL2函数的格式如下:NVL2(expr1,expr2, expr3)
含义是:如果该函数的第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第三个参数的值。
3. NULLIF函数
NULLIF(exp1,expr2)函数的作用是如果exp1和exp2相等则返回空(NULL),否则返回第一个值。
4.Coalesce函数
Coalese函数的作用是的NVL的函数有点相似,其优势是有更多的选项。
格式如下: Coalesce(expr1, expr2, expr3….. exprn)
表示可以指定多个表达式的占位符。所有表达式必须是相同类型,或者可以隐性转换为相同的类型。 返回表达式中第一个非空表达式。
六、having
当筛选语句中存在min(),max()等分组函数时,是不能用where来筛选的,为了解决这个问题,只需要把where换成having即可。
select department_id,job_id, avg(salary) from employees having/where(replaced) avg(salary) > 10000 group by department_id,job_id
{原因: select语句书写的顺序 select,from,where,group up,having,order by select
语句执行的顺序 from,where,group up,having,select,order by }

浙公网安备 33010602011771号