- 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;