一、查询
- 查询员工表所有数据
sql
select * from emp
- 查询职位(JOB)为'PRESIDENT'的员工的工资
sql
select sal from emp where job='PRESIDENT'
- 查询佣金(COMM)为0或为NULL的员工信息
sql
select * from emp where comm=0 or comm is null
- 查询入职日期在 1981-5-1到1981-12-31之间的所有员工信息
sql
select * from emp where hiredate between to_date(19810501,'yyyy/mm/dd') and to_date(19811231,'yyyy/mm/dd')
- 查询所有名字长度为4的员工的员工编号,姓名
sql
select empno,ename from emp where length(ename)=4
- 显示10号部门的所有经理('MANAGER')和20号部门的所有职员('CLERK')的详细信息
sql
select * from emp where deptno=10 and job='MANAGER' or (deptno=20 and job='CLERK')
- 显示姓名中没有'L'字的员工的详细信息或含有'SM'字的员工信息
sql
select * from emp where ename not like '%L%' or ename like '%SM%'
- 显示各个部门经理('MANAGER')的工资
sql
select deptno,sal from emp where job='MANAGER'
- 显示佣金(COMM)收入比工资(SAL)高的员工的详细信息
sql
select * from emp where comm >sal
- 把hiredate列看做是员工的生日,求本月过生日的员工(考察知识点:单行函数)
sql
select ename from emp where extract(month from hiredate)=extract(month from sysdate)
select ename from emp where to_char(hiredate, 'mm') = to_char(sysdate , 'mm');
- 把hiredate列看做是员工的生日,求下月过生日的员工(考察知识点:单行函数)
sql
select ename from emp where extract(month from hiredate)=extract(month from sysdate)+1
select * from emp where to_char(hiredate, 'mm') = to_char(add_months(sysdate,1) , 'mm');
- 求1982年入职的员工(考察知识点:单行函数)
sql
select ename from emp where extract(year from hiredate)=1982
select * from emp where to_char(hiredate,'yyyy') = '1982';
- 求1981年下半年入职的员工(考察知识点:单行函数)
sql
select ename from emp
where extract(year from hiredate)=1981 and extract(month from hiredate)>6
select * from emp where hiredate
between to_date('1981-7-1','yyyy-mm-dd') and to_date('1982-1-1','yyyy-mm-dd') - 1;
- 求1981年各个月入职的的员工个数(考察知识点:组函数)
sql
select count(*),extract(month from hiredate) from emp
where extract(year from hiredate)='1981' group by extract(month from hiredate)
select count(*), to_char(trunc(hiredate,'month'),'yyyy-mm') from emp
where to_char(hiredate,'yyyy')='1981' group by trunc(hiredate,'month') order by trunc(hiredate,'month');
- 查询各个部门的平均工资
sql
Select deptno, avg(sal) from emp group by deptno
- 显示各种职位的最低工资
sql
select job, min(sal) from emp group by job
- 按照入职日期由新到旧排列员工信息
sql
select * from emp order by hiredate desc
- 查询员工的基本信息,附加其上级的姓名
sql
select emp.*, t.ename managername from emp , emp t where emp.mgr=t.empno
- 显示工资比'ALLEN'高的所有员工的姓名和工资
sql
select ename,sal from emp where sal>(select sal from emp where ename='ALLEN')
- 显示与'SCOTT'从事相同工作的员工的详细信息
sql
select * from emp where job=(select job from emp where ename='SCOTT') and ename <> 'SCOTT'
- 显示销售部('SALES')员工的姓名
sql
select ename from emp,dept where emp.deptno=dept.deptno and dname='SALES'
- 显示与30号部门'MARTIN'员工工资相同的员工的姓名和工资
sql
select ename,sal from emp where deptno=30 and sal=(select sal from emp where ename='MARTIN') and ename <> 'MARTIN'
- 查询所有工资高于平均工资(平均工资包括所有员工)的销售人员('SALESMAN')
sql
select ename from emp where sal>(select avg(sal) from emp) and job='SALESMAN'
- 显示所有职员的姓名及其所在部门的名称和工资
sql
select ename,dname,sal from emp ,dept where emp.deptno=dept.deptno
- 查询在研发部('RESEARCH')工作员工的编号,姓名,工作部门,工作所在地
sql
select empno,ename,dname,loc from emp,dept where emp.deptno=dept.deptno
- 查询各个部门的名称和员工人数
sql
select dname,countnum from dept, (select deptno,count(empno) countnum from emp group by deptno) t
where dept.deptno=t.deptno
select dname,c from (select count(*) c, deptno from emp group by deptno) e inner join dept d on e.deptno = d.deptno;
- 查询各个职位员工工资大于平均工资(平均工资包括所有员工)的人数和员工职位
sql
select count(empno) ,job from emp where sal>(select avg(sal) from emp)group by job
- 查询工资相同的员工的工资和姓名
sql
select sal,ename from emp e where(select count(*) from emp where sal=e.sal group by sal)>1
- 查询工资最高的 3名员工信息
sql
select * from (select * from emp order by sal desc )t where rownum<4
- 按工资进行排名,排名从1开始,工资相同排名相同(如果两人并列第1则没有第2名,从第三名继续排)
sql
select e.*, (select count(*) from emp where sal > e.sal)+1 rank from emp e order by rank;
- 求入职日期相同的(年月日相同)的员工
sql
select * from emp e where (select count(*) from emp where e.hiredate=hiredate)>1
- 查询每个部门的最高工资
sql
select deptno, max(sal) from emp group by (deptno)
- 查询每个部门,每种职位的最高工资
sql
select deptno,job,max(sal) from emp group by deptno,job
- 查询每个员工的信息及工资级别(用到表 Salgrade)
sql
select emp.*,grade from emp,salgrade where sal between losal and hisal
- 查询工资最高的第 6-10 名员工
sql
select * from(select rownum r,ename from (select ename from emp order by sal desc))where r<=10 and r>=6
- 查询各部门工资最高的员工信息
sql
select * from emp e where e.sal=(select max(sal) from emp where emp.deptno=e.deptno)
- 查询每个部门工资最高的前 2名员工
sql
select * from emp e where (select count(*) from emp where sal > e.sal and e.deptno =deptno) < 2
select * from (
select rank() over (partition by deptno order by sal desc) rank, e.* from emp e
) where rank < 3;
- 查询出有3个以上下属的员工信息
sql
select * from emp, (select mgr,count(empno)countnum from emp group by mgr)t
where t.countnum>3 and emp.empno=t.mgr
select * from emp e where (select count(*) from emp where e.empno =mgr) >2 ;
- 查询所有大于本部门平均工资的员工信息
sql
select * from emp where sal>(select avg(sal)sal from emp e where deptno=emp.deptno)
- 查询平均工资最高的部门信息
sql
select * from dept where deptno=
(select deptno from emp group by deptno having avg(sal)=
(select max(avg(sal)) from emp group by deptno))
- 查询大于各部门总工资的平均值的部门信息
sql
select * from dept where deptno=(select deptno from emp group by deptno having sum(sal)>(select avg(sum(sal))sal from emp group by deptno ))
- 查询大于各部门总工资的平均值的部门下的员工信息(考察知识点:子查询,组函数,连接查询)
sql
select * from emp where deptno=
(select deptno from emp group by deptno having sum(sal)>
(select avg(sum(sal))sal from emp group by deptno ))
- 查询没有员工的部门信息
sql
select d.* from dept d left join emp e on (e.deptno = d.deptno) where empno is null;
- 显示与Blake在同一部门工作的雇员的项目和受雇日期,但是blake不包含在内。
sql
select ename,hiredate from emp where deptno=
( select deptno from emp where ename='BLAKE') and ename <> 'BLAKE'
二、常见系统函数
1. 字符类函数
- ASCLL©函数和CHR(i)函数
--分别求得字符"Z、H、D和空格"的ASCII值。
sql
SELECT ASCII('Z') Z, ASCII('H') H, ASCII('D') D, ASCII(' ') SPACE FROM DUAL;
--返回字符
sql
SELECT CHR(90), CHR(72), CHR(68), (32) S FROM DUAL;
- CONCAT(s1,s2)函数
--连接俩个字符串
SELECT CONCAT('Hello', 'World!') INFORMATION FROM DUAL;
- INITCAP(s)函数
--将字符串首字母大写,其余字母小写。
sql
SELECT INITCAP('oh mY God!') INFORMATION FROM DUAL;
- INSTR(s1,s2,i,j)函数
--在字符串"oracle 11g"中,从第3个字符开始查询字符串"1"第2次出现的位置。
--i为负数将从右至左查询
sql
SELECT INSTR('oracle 11g', '1', 3, 2) FROM DUAL;
- LENGTH(s)函数
--查询字符串长度
sql
SELECT LENGTH('hello') FROM DUAL;
--查询雇员名称长度大于5的雇员信息及所在部门信息。
sql
SELECT *
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE LENGTH(E.ENAME) > 5;
- LOWER(s)函数和UPPER(s)函数
--将字符串转换为小写
sql
SELECT LOWER('HellO!') FROM DUAL;
--将字符串转换为大写
sql
SELECT UPPER('heLLo!') FROM DUAL;
- LTRIM(s1,s2)函数、RTRIM(s1,s2)函数个TRIM(s1,s2)函数
--删除字符串左边的指定字符串
sql
SELECT LTRIM('###hello##!##', '#') FROM DUAL;
--删除字符串右边的指定字符串
sql
SELECT RTRIM('###hello##!##', '#') FROM DUAL;
--删除字符串两端的指定字符串
sql
SELECT TRIM('#' FROM '###hello##!##') FROM DUAL;
- REPLACE(s1,s2,s3)函数
--将字符串"Bad Luck Bad Gril"中的"Bad"字符串用"Good"替换掉
sql
SELECT REPLACE('Bad Luck Bad Gril', 'Bad', 'Good') FROM DUAL;
- SUBSTR(s,i,j)函数
--截取字符串"MessageBox"中从第8个位置开始长度为3的字符串
sql
SELECT SUBSTR('MessageBox', 8, 3) FROM DUAL;
2. 数字类函数
- ABS(n)函数
--返回n的绝对值
sql
SELECT ABS(-1) FROM DUAL;
- CEIL(n)函数
--返回大于或等于数值n的最小整数
sql
SELECT CEIL(-7.9) FROM DUAL;
- COS(n)函数
--返回n的余弦值,n为弧度
sql
SELECT COS(30) FROM DUAL;
- EXP(n)函数
--返回e的n次幂
sql
SELECT EXP(1) FROM DUAL;
- FLOOR(n)函数
--返回小于或等于n的最大整数
sql
SELECT FLOOR(-2.2) FROM DUAL;
- LOG(n1,n2)函数
--返回以n1为底n2的对数
sql
SELECT LOG(4, 16) FROM DUAL;
- MOD(n1,n2)函数
--返回n1除以n2的余数
sql
SELECT MOD(3, 2) FROM DUAL;
- POWER(n1,n2)函数
--返回n1的n2次方
sql
SELECT POWER(3, 4) FROM DUAL;
- ROUND(n1,n2)函数
--返回舍入小数点右边n2位的n1的值,n2的默认值为0,
--这会返回小数点最接近的整数。
--如果n2为负数,就舍入到小数点左边相应的位置上,n2必须是整数。
sql
SELECT ROUND(3.1415926, 2) FROM DUAL;
- SIGN(n)函数
--若n为负数,则返回-1,若n为正数,则返回1,若n=0,则返回0.
sql
SELECT SIGN(-22) FROM DUAL;
- SIN(n)函数
--返回正弦值,n为弧度
sql
SELECT SIN(30) FROM DUAL;
- SQRT(n)函数
--返回n的平方根,n为弧度
sql
SELECT SQRT(16) FROM DUAL;
- TRUNC(n1,n2)函数
--返回结尾n2位小数的n1的值,n2默认设置为9,当n2为默认设置时,
--会将n1截尾为整数,如果n2为负值,就截尾在小数点左边响应的位上。
sql
SELECT TRUNC(2333.1415, -2) FROM DUAL;
3. 日期和时间类函数
- ADD_MONTHS(d,i)函数
--返回日期d加上i个月之后的结果。其中,i为任意整数
sql
SELECT ADD_MONTHS('2015-2-22', 3) FROM DUAL;
- LAST_DAY(d)函数
--返回包含日期d月份的最后一天
sql
SELECT LAST_DAY('2016-3-19') FROM DUAL;
- MONTHS_BETWEEN(d1,d2)函数
--返回d1和d2之间的数目,若d1和d2的日期都相同,或者都是该月的最后一天,
--则返回一个整数,否则返回的结果将包含一个小数。
sql
SELECT MONTHS_BETWEEN('2016-3-19', '2015-3-19') FROM DUAL;
- NEW_TIME(d1,t1,t2)函数
--其中,d1是一个日期数据类型,当时区t1中的日期和时间是d1时,
--返回时区t2中的日期和时间。t1和t2是字符串。
sql
SELECT SYSDATE BJ_TIME, NEW_TIME(SYSDATE, 'PDT', 'GMT') LOS_ANGLES FROM DUAL;
- SYSDATE()函数
--返回系统当前时间
sql
SELECT SYSDATE FROM DUAL;
4. 转换类函数
-
CHARTOROWID(s)函数
--该函数将字符串s转换为RWID数据类型
-
CONVERT(s,aset[,bset])函数
--该函数将字符串s由bset字符集转换为aset字符集
-
ROWIDTOCHAR()函数
--该函数将ROWID数据类型转换为CHAR类型
-
TO_CHAR(x[,format])函数
--该函数实现将表达式转换为字符串,format表示字符串格式。
sql
SELECT TO_CHAR(SYSDATE, 'YYYY:MM:DD') FROM DUAL;
- TO_DATE(s[,format[lan]])函数
--该函数将字符串s转换成date类型,format表示字符串格式,lan表示所使用的语言
sql
SELECT TO_DATE('2015-1-1', 'YYYY-MM-DD') FROM DUAL;
- TO_NUMBER(s[,format[lan]])函数
--该函数将返回字符串s代表的数字,返回值按照format格式进行显示,
--format表示字符串格式,lan表示所使用的语言。
--将十六进制数-18f转换为十进制数
sql
SELECT TO_NUMBER('18', 'xxx') AS "十进制数" FROM DUAL;
5. 聚合类函数
- AVG()函数
--计算选择列表的平均值,列表项目可以是一个列或多个列的表达式
sql
SELECT AVG(SAL) AS "平均工资" FROM EMP;
- COUNT()函数
--返回查询结果中的记录数
sql
SELECT COUNT(1) FROM EMP;
- MAX()函数
--返回选择列表项目中的最大数,列表项目可以使一个列或多个列的表达式。
sql
SELECT MAX(SAL) AS "最高工资" FROM EMP;
- MIN()函数
--返回选择列表项目中的最小数,列表项目可以使一个列或多个列的表达式。
sql
SELECT MIN(SAL) AS "最低工资" FROM EMP;
- SUM()函数
--返回选择列表项目中的数值总和,列表项目可以使一个列或多个列的表达式。
sql
SELECT SUM(SAL) AS "工资之和" FROM EMP;
- VARIANCE()函数
--返回选择列表项目的统计方差,列表项目可以使一个列或多个列的表达式。
sql
SELECT VARIANCE(SAL) AS "统计工资方差" FROM EMP;
- STDDEV()函数
--返回选择列表项目中的标准偏差,列表项目可以使一个列或多个列的表达式。
sql
SELECT STDDEV(SAL) AS "工资标准偏差" FROM EMP;