oracle 常用语句3

- oracle 函数

select sign(-3),sign(3), sign(0) from dual;

select ceil(3.7) from dual;
select floor(3.7) from dual;
       -- 四舍五入
select round(123.456, 2) from dual;
select round(183.456, -2) from dual;
select round(183.556) from dual;


select trunc(123.456, 2) from dual;
select trunc(183.456, -2) from dual;
select trunc(183.556) from dual;


-- length() 返回字符串长度

select ename, length(ename) from emp e;

-- 查询长度是6个字符的员工名字
select ename from emp e where length(ename) = 6;

select ename from emp e where ename like '______';

-- 查询长度是6个字符并且以M开头的员工名字
select ename from emp e where length(ename) = 6 and ename like 'M%';

select ename from emp e where ename like 'M_____';

select lower('abCdE') from dual;
select upper('abCdE') from dual;

select * from emp where lower(ename) = 'scott';

       -- sysdate 当前日期时间
select sysdate from dual;

select sysdate, last_day(sysdate) from dual;

       -- to_date()
select to_date('20170711', 'YYYYMMDD') from dual;
select to_date('20170711 18:20:45', 'YYYYMMDD hh24:mi:ss') from dual;

       -- to_char()
select to_char(sysdate, 'mm') from dual;

select * from emp e;

-- 查询12月份入职的员工信息
select * from emp where to_char(hiredate, 'mm') = '12';

-- 分组函数
-- max()      最大值
-- min()      最小值
-- avg()      平均值
-- sum()      求和
-- count()    数目


-- 分组函数有两种用法
--1. 单独使用
-- 查询10号部门最高工资
select max(e.sal) from emp e where e.deptno = 10;

-- 查询10号部门最高工资、最低工资
select max(e.sal), min(e.sal) from emp e where e.deptno = 10;


select sum(e.sal),count(e.sal) from emp e;

-- 查询工资高于30号部门所有人的员工信息
select * from emp where sal > (select max(sal) from emp where deptno = 30);


-- 查询20号部门的员工数目
select count(empno) from emp where deptno=20;

select count(*) from emp where deptno=20;


-- 查询所有销售(SALESMAN)的最低工资
select min(e.sal) from emp e where e.job = 'SALESMAN';

-- 查询30号部门工资最高员工名字

select ename
  from emp
 where deptno = 30
   and sal = (select max(sal) from emp where deptno = 30);

--2. 配合group by一起使用

-- 分组: group by 列

-- 查询每个部门的最高工资,显示部门编号和最高工资
select deptno, max(sal) from emp group by deptno;

-- (分组之后)筛选组: having ...
-- 查询最高工资超过2900的部门,显示部门编号和最高工资
select deptno, max(sal) from emp group by deptno having max(sal) > 2900;


-- 查询最高工资超过2900的部门,显示部门编号和最高工资
--  按照最高工资降序排序
select deptno, max(sal)
  from emp
 group by deptno
having max(sal) > 2900
 order by max(sal) desc;
 
 
-- 查询语句骨架

select xxx from xxx 
[where ...] 
[group by ...] 
[having ...] 
[order by ... [asc|desc]]


--表连接查询

create table stu(
sno    number(3),
sname  varchar2(20),
sclass varchar2(10)
);


create table cls(
cid    varchar2(10),
ctype  varchar2(20)
);

insert into stu values(1, 'tom', 'c01');
insert into stu values(2, 'mary', 'c02');
insert into stu values(3, 'jack', 'c05');
commit;


insert into cls values('c01', '测试');
insert into cls values('c02', '测试');
insert into cls values('c03', '开发');
commit;


select * from stu;
select * from cls;

-- 查询结果是两张表的笛卡尔积
select * from stu, cls;


-- 内连接
select * from stu s inner join cls c on s.sclass = c.cid;
select * from stu s join cls c on s.sclass = c.cid;

select * from stu s, cls c where s.sclass = c.cid;


-- 左连接
select * from stu s left join cls c on s.sclass = c.cid;
select * from stu s, cls c where s.sclass = c.cid(+);

-- 右连接
select * from stu s right join cls c on s.sclass = c.cid;
select * from stu s, cls c where s.sclass(+) = c.cid;


-- 全连接
select * from stu s full join cls c on s.sclass = c.cid;

select * from emp e;
select * from dept d;

-- 查询所有员工的名字和所属部门名字
select e.ename, d.dname from emp e, dept d where e.deptno=d.deptno;


select e.ename, (select d.dname from dept d where d.deptno = e.deptno) dname
  from emp e;

-- 查询ALLEN的所属部门名字
select d.dname
  from emp e, dept d
 where e.deptno = d.deptno
   and e.ename = 'ALLEN';


-- 查询销售部(SALES)所有员工名字
select e.ename
  from emp e, dept d
 where e.deptno = d.deptno
   and d.dname = 'SALES';


select ename
  from emp
 where deptno = (select deptno from dept where dname = 'SALES');


-- 查询工资超过2000的员工姓名和上班地点
select e.ename, d.loc
  from emp e, dept d
 where e.deptno = d.deptno
   and e.sal > 2000;

-- 查询所有员工姓名和其主管姓名,没有主管的主管姓名为空
select a.ename,b.ename from emp a, emp b where a.mgr = b.empno(+);

-- 查询ALLEN的主管姓名
select b.ename
  from emp a, emp b
 where a.mgr = b.empno
   and a.ename = 'ALLEN';

-- 查询入职时间早于其主管的员工姓名
select a.ename
  from emp a, emp b
 where a.mgr = b.empno
   and a.hiredate < b.hiredate;


-- 查询每个部门的最高工资,显示部门编号和最高工资
select e.deptno,max(e.sal) from emp e group by e.deptno;

-- 查询每个部门的最高工资,显示部门名字和最高工资
select d.dname, max(e.sal)
  from emp e, dept d
 where e.deptno = d.deptno
 group by d.dname;

-- 查询最高工资超过2900的部门,显示部门名字和最高工资
select d.dname, max(e.sal)
  from emp e, dept d
 where e.deptno = d.deptno
 group by d.dname
having max(e.sal) > 2900;

-- 查询最高工资超过2900的部门,显示部门名字和最高工资,按照最高工资升序排序
select d.dname, max(e.sal)
  from emp e, dept d
 where e.deptno = d.deptno
 group by d.dname
having max(e.sal) > 2900
 order by max(e.sal) asc;
 
-- 查询员工数目超过2个的职位,显示职位和员工数目,按照员工数目降序排序
select e.job, count(*)
  from emp e
 group by e.job
having count(*) > 2
 order by count(*) desc;
 
-- 查询工资高于平均工资的员工信息
select * from emp where sal > (select avg(sal) from emp);

-- 查询工资高于本部门平均工资的员工信息
-- 方法1
select *
  from emp e
 where e.sal > (select avg(a.sal) from emp a where a.deptno = e.deptno);

-- 方法2

select e.*
  from emp e, (select deptno, avg(sal) av from emp group by deptno) a
 where e.deptno = a.deptno
   and e.sal > a.av;


-- 查询每个部门的编号、名字和员工数目

select d.deptno, d.dname, a.c
  from dept d, (select e.deptno, count(*) c from emp e group by e.deptno) a
 where d.deptno = a.deptno(+);


select d.deptno, d.dname, nvl(a.c, 0)
  from dept d, (select e.deptno, count(*) c from emp e group by e.deptno) a
 where d.deptno = a.deptno(+);
 
-- nvl() 为空值赋值函数
select ename,sal,nvl(comm, 0) from emp;

-- 查询每个部门工资最高的员工姓名

select e.ename
  from emp e, (select deptno, max(sal) m from emp group by deptno) a
 where e.deptno = a.deptno
   and e.sal = a.m;
原文地址:https://www.cnblogs.com/guog1/p/8508308.html