数据库查询

一、模糊查询  二、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 }

posted @ 2020-04-20 14:58  骎翎  阅读(328)  评论(0)    收藏  举报