您的位置:首页 > 数据库 > Oracle

ORACLE的一些查询语句

2010-08-31 20:44 316 查看
学了几天的oracle现在做总结如下:

1 刚安装好oracle19g在命令行以scott用户登录的时候,一般要对其进行解锁,其语句如下

首先以dba的身份登录连接到该数据库 sqlplus sys/orcl as sysdba

连接后执行如下语句:alter user scott account unlock

输入该语句后会让重新输入密码:一般是tiger ,可以随意设但是自己要记得所设密码啊呵呵

然后再重新输入密码进行确认,这样以scott用户登录了嘿嘿,其登陆语句是:sqlplus

然后让输入密码,输入你刚才所设密码即可。如果输入正确即可进行一些数据库的操作了呵呵

2 以下是一些查询语句:

a 从emp表中查询出每个人的员工编号,名字,月薪,年薪(不包含奖金),职位,奖金 并且每个字段定义别名

select empno 编号,ename 姓名,sal 月薪,sal*12 年薪,job 职位,comm 奖金 from emp;

b 从emp表中查询出每个人的员工编号,名字,月薪,年薪(包含奖金),职位,奖金 并且每个字段定义别名

select empno 编号,ename 姓名,sal 月薪,(sal+comm)*12 年薪,job 职位,comm 奖金 from emp;

*注意喽:此时由于comm有的是空的,oracle对于有null值的表达式其值一定为空滴呵呵所以要注意了,要想知道怎么解决还得继续往下看哦呵呵,建议:在实际开发中不要使用null值的字段

c 查询出薪水大于1500的人的编号,名字,职位,月薪,奖金,年薪

select empno 编号,ename 姓名,sal 月薪,sal*12 年薪,job 职位,comm 奖金

from emp

where sal > 1500;


d 查询出名字不等于SMITH的人的编号,名字,职位,月薪,奖金,年薪

select empno 编号,ename 姓名,sal 月薪,sal*12 年薪,job 职位,comm 奖金

from emp

where ename <> 'SMITH';


注意:在oracle中字符串是区分大小写的

e 求出薪水在1500到3000之间的人的薪水

select sal from emp

where sal between 1500 and 3000;


f 查询出名字中包含a的人的信息

select * from emp

where lower(ename) like '%a%';


注:lower()是把字符串全部转换为小写的,upper()是把字符串全部转换为大写的

g 查询出倒数第三个字符不为Y的人的信息

select * from emp

where ename not like '--Y%';


h 按照员工月薪由高到低的顺序进行排列后的员工的信息

select * from emp

order by sal desc;


注:desc是按降序排,asc是按升序排,默认为升序

i 查询出薪水大于1200并且入职日期在1981-04-02之后的人的编号,名字,月薪,年薪(不包含奖金),入职日期,格式化中国人能接受的日期形式

select empno,ename,sal,sal*12 annual_sal,hiredate,to_char(hiredate,'YYYY-MM-DD') from emp

where sal>1200 and to_char(hiredate,'YYYY-MM-DD')>'1981-04-02'


注:to_char() 可把字符串转换成指定格式的日期 to_date()可把日期转换成数据库中的日期形式,其用法会在下文中提到

j 求出工资在公司的平均工资之上的人的信息

select * from emp

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


注:avg(sal)是求平均工资

k 从emp表中查询出每个人的员工编号,名字,月薪,年薪(包含奖金),职位,奖金 并且每个字段定义别名

select empno 编号,ename 姓名,sal 月薪,(sal+nvl(comm,0))*12 年薪,job 职位,comm 奖金 from emp;

注:大家看到了吧,用nvl()这个方法就可以去掉上述中奖金为空年薪也为空的现象了,nvl()是专门用来处理null值的呵呵

l 求出每个人的编号,名称,工资,入职日期,部门编号,部门名称及部门所在地

方法一: select e.empno,e.ename,e.sal,e.hiredate,e.deptno,dname,loc

from emp e,dept d

where e.deptno = d.deptno;


方法二: select e.empno,e.ename,e.sal,e.hiredate,e.deptno,dname,loc

from emp e join dept d on e.deptno = d.deptno;


注:此时where后是两个表之间的连接条件,建议最先写连接条件,以免遗忘呵呵

方法二中用到了join on来表示两表之间的连接,on后面写连接的条件,如果还有其他的条件则放where后面

m 查询工资大于公司平均工资,且名字中不包含a的,并且入职日期大于1982-07-07的员工的编号,名称,月薪,年薪,部门编号,部门名称,部门所在地 并且按照薪 水降序进行排列

方法一: select e.empno,e.ename,e.sal,(e.sal+nvl(e.comm,0))*12 ,e.deptno,dname,loc

from emp e,dept d

where e.deptno = d.deptno

and sal > (select avg(sal) from emp)

and lower(e.ename) not like '%a%'

and hiredate > to_date('1982-07-07','yyyy-mm-dd')

order by sal desc;


方法二: select e.empno,e.ename,e.sal,(e.sal+nvl(e.comm,0))*12 ,e.deptno,dname,loc

from emp e join dept d on e.deptno = d.deptno

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

and lower(e.ename) not like '%a%'

and hiredate > to_date('1982-07-07','yyyy-mm-dd')

order by sal desc;



注:注意子查询哦,很绕的,小心给绕进去了呵呵

n 求出每个人的名字,工资,职位,编号,以及对应的直接领导的名字,工资,职位,编号信息

select e.ename,e.sal,e.job,e.empno,e1.ename,e1.sal,e1.job,e1.empno

from emp e join emp e1 on e.mgr = e1.empno;


o 求每个人的工资属于哪个级别

select grade from emp join salgrade on sal between losal and hisal;

p 求出工资在公司的平均工资之上,并且入职日期在1981-06-04之后,并且名字中包含a的人的编号,姓名,工资,等级

方法一 : select empno,ename,sal,grade from emp ,salgrade

where sal between losal and hisal

and sal > (select avg(sal) from emp)

and hiredate > to_date('1981-06-04','yyyy-mm-dd')

and lower(ename) not like '%a%';



方法二: select empno,ename,sal,grade from emp join salgrade on sal between losal

and hisal

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

and hiredate > to_date('1981-06-04','yyyy-mm-dd')

and lower(ename) not like '%a%';


q 查出名字里面第二个字母不是A的人的信息以及所在的部门情况以及工资的等级情况

方法一: select e.* ,dname,loc ,grade

from emp e,dept d,salgrade s

where e.deptno = d.deptno and e.sal between s.losal and s.hisal

and upper(e.ename) not like '-A%';



方法二: select e.* ,dname,loc ,grade

from emp e join dept d on e.deptno = d.deptno join salgrade s

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

where substr(upper(ename),2,1) != 'A';



r 每个人和对应的经理人的信息(包含king)

select e.* from emp e left join emp m on e.mgr = m.empno;

s 求出每个部门平均薪水等级

select grade ,deptno,avg_sal from (

select avg(sal) avg_sal,deptno from emp group by deptno) join salgrade

on avg_sal between losal and hisal;


t 求平均薪水最高的部门编号

select deptno from (

select deptno, avg(sal) avg_sal from emp group by deptno)

where avg_sal = (select max(avg(sal)) from emp group by deptno);


u 求平均薪水最高的部门名称

select dname from dept

where deptno = ( select deptno from (

select e1.deptno, avg(sal) avg_sal from emp e1 group by e1.deptno) e

where avg_sal = (select max(avg(sal)) from emp group by deptno));


v 求平均薪水等级最低的部门部门名称

要想求平均薪水最低的部门名------->首先要求平均薪水最低的部门的部门号 -------->最低的平均薪水级别------->每个部门的平均薪水级别------>求每个部门的平均薪水

1 每个部门的平均薪水

select avg(sal) ,deptno from emp

group by deptno;


2 每个部门的平均薪水级别

select grade,deptno from (select avg(sal) avg_sal,deptno from emp

group by deptno) a,salgrade s

where avg_sal between s.losal and s.hisal;


3 最低平均薪水级别

select min(grade) from

(select grade,deptno from (select avg(sal) avg_sal,deptno from emp

group by deptno) a,salgrade s

where avg_sal between s.losal and s.hisal);


4 平均薪水最低的部门的部门号

select deptno from

(select grade,deptno from (select avg(sal) avg_sal,deptno from emp

group by deptno) a,salgrade s

where avg_sal between s.losal and s.hisal) a

where grade = (

select min(grade) from

(select grade,deptno from (select avg(sal) avg_sal,deptno from emp

group by deptno) a,salgrade s

where avg_sal between s.losal and s.hisal));


5 平均薪水最低的部门名

select dname from dept

where deptno in(

select deptno from

(select grade,deptno from (select avg(sal) avg_sal,deptno from emp

group by deptno) a,salgrade s

where avg_sal between s.losal and s.hisal) a

where grade = (

select min(grade) from

(select grade,deptno from (select avg(sal) avg_sal,deptno from emp

group by deptno) a,salgrade s

where avg_sal between s.losal and s.hisal)))

;


w 薪水最高的前5个人

select rownum r,ename,empno,sal from(

select ename,empno,sal from emp order by sal desc)

where rownum <6;


注:oracle中用rownum来进行分页,sqlserver用top来进行分页,mysql则用limit来进行分页

而且在oracle中如果有order by 和rownum的话会先进行分页后排序,所以要注意喽,下面教给大家一些小窍门:

1.先不管分页 写出要查询的sql语句(注意如果要求排序一定要包含排序语句) -----sql

2.然后将该sql语句看成一张子表 给这种字表加上一个变为实字段的伪字段

即select rownum r,a.* from (sql) a

得到的是一个拥有顺序的结果

3.最后将该结果再次看成一张子表 对该表进行分页 利用的已经变为实字段的伪字段r类获取

select * from (2的sql语句) where r between ? and ? 其中第一个问号指从哪开始 第二个指的到哪结束


以下这几个就用到上面的窍门了哦呵呵

x *按薪水从高到低排列的第6个到第10个人的信息

select * from (

select rownum r,a.* from(

select ename,empno,sal from emp order by sal desc) a )

where r between 6 and 10;


y 查询出名字中包含a的,并且薪水大于1200,并且入职日期大于1979-01-03的人里面薪水由高到低顺序排名的3到7人的信息

select * from (

select rownum r,a.* from(

select * from emp

where lower(ename) like '%a%'

and sal > 1200

and hiredate > to_date('1979-01-03','yyyy-mm-dd')

order by sal desc) a )

where r between 3 and 7;


z 查询出名字中包含a的,并且薪水大于1200,并且入职日期大于1979-01-03的人里面薪水由高到低顺序排名的3到7人的编号,姓名,职位,月薪,年薪,部门名称,所在地以及工资的等级情况

select * from(

select rownum r,a.* from(

select empno,ename,job,sal,(sal+nvl(comm,0))*12 annual_sal,dname,loc,grade

from emp e,dept d,salgrade s

where e.deptno=d.deptno

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

and lower(ename) like '%a%' and sal >1200

and hiredate > to_date('1979-01-03','yyyy-mm-dd')

order by sal desc) a)

where r between 3 and 7;



嗯好了就先写这么多吧呵呵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: