Oracle笔记(五)单行函数(四)

2014-11-24 15:03:32 · 作者: · 浏览: 4
FROM emp WHERE comm>sal;
4、 找出佣金高于薪金的60%的员工。
SELECT * FROM emp WHERE comm>sal*0.6;
5、 找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料。
SELECT * FROM emp
WHERE (job='MANAGER' AND deptno=10) OR (job='CLERK' AND deptno=20);
6、 找出部门10中所有经理(MANAGER),部门20中所有办事员(CLERK),既不是经理又不是办事员但其薪金大于或等于2000的所有员工的详细资料。
SELECT * FROM emp
WHERE (job='MANAGER' AND deptno=10) OR (job='CLERK' AND deptno=20)
OR (job NOT IN ('MANAGER','CLERK') AND sal>=2000);
7、 找出收取佣金的员工的不同工作。
SELECT DISTINCT job FROM emp WHERE comm IS NOT NULL;
8、 找出不收取佣金或收取的佣金低于100的员工。
SELECT * FROM emp WHERE comm IS NULL OR comm<100;
9、 找出各月倒数第3天受雇的所有员工。
每一个雇员的雇佣日期肯定是不一样的,所以现在必须找到每一个雇员雇佣所在月的最后一天,之后按照“日期-数字”的方式求出前三天的日期,这个日期必须和雇佣日期相符合才满足条件。
SELECT * FROM emp WHERE LAST_DAY(hiredate)-2=hiredate;
10、 找出早于12年前受雇的员工。
如果要求年份,最准确的做法是使用总月数/12;
SELECT * FROM emp WHERE MONTHS_BETWEEN(SYSDATE,hiredate)/12>12;
11、 以首字母大写的方式显示所有员工的姓名。
SELECT INITCAP(ename) FROM emp; www.2cto.com
12、 显示正好为5个字符的员工的姓名。
SELECT ename FROM emp WHERE LENGTH(ename)=5;
13、 显示不带有“R”的员工的姓名。
SELECT ename FROM emp WHERE ename NOT LIKE '%R%';
14、 显示所有员工姓名的前三个字符。
SELECT SUBSTR(ename,0,3) FROM emp;
15、 显示所有员工的姓名,用“a”替换所有“A”。
SELECT REPLACE(ename,'A','a') FROM emp;
16、 显示满10年服务年限的员工的姓名和受雇日期。
SELECT ename, hiredate FROM emp
WHERE MONTHS_BETWEEN(SYSDATE,hiredate)/12>10;
17、 显示员工的详细资料,按姓名排序。
SELECT * FROM emp ORDER BY ename;
18、 显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面。
SELECT ename, hiredate FROM emp ORDER BY hiredate;
19、 显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同则按薪金排序。
SELECT ename, job, sal FROM emp ORDER BY job DESC,sal;
20、 显示所有员工姓名、加入公司的年份和月份,按受雇日期所有月排序,若月份相同则将最早年份的员工排在最前面。
本程序需要从日期之中取出年份和月份,用TO_CHAR()函数完成。
SELECT ename,TO_CHAR(hiredate,'yyyy') year,TO_CHAR(hiredate,'mm') months
FROM emp
ORDER BY months,year;
21、 显示在一个月为30天的情况所有员工的日薪金,忽略余数。
SELECT ename,sal,TRUNC(sal/30) FROM emp;
22、 找出在(任何年份的)2月受聘的所有员工。
SELECT * FROM emp WHERE TO_CHAR(hiredate,'mm')=2;
23、 对于每个员工,显示其加入公司的天数。
SELECT ename,SYSDATE-hiredate FROM emp;
24、 显示姓名字段的任何位置包含“A”的所有员工的姓名。
www.2cto.com
SELECT ename FROM emp WHERE ename LIKE '%A%';
25、 以年月日的方式显示所有员工的服务年限。
第一步:求出每个雇员的雇佣年数:被雇佣的总月数 / 12 = 年数;
SELECT ename, hiredate,
TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year
FROM emp;
第二步:求出月数,以上计算之中被忽略的小数点实际上都是月份,所以直接取余即可;
SELECT ename, hiredate,
TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year,
TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) months
FROM emp;
第三步:求出天数,最准确的做法是在不超过30天的范围之内求;
现在已经知道当前的时间使用SYSDATE取出,而雇佣的日期使用hiredate取出,可是hiredate和SYSDATE之间的差距太大了,所以肯定会有误差,那么就必须想办法将hiredate的日期提升到与SYSDATE差距在30天的范围之内。
www.2cto.com
在之前学习过两个函数:
MONTHS_BETWEEN():求出两个日期间的月数,如果是:MONTHS_BETWEEN(SYSDATE,hiredate)求出的是雇佣日期到今天为止的雇佣月份;
ADD_MONTHS():在一个日期上加入指定的月之后的日期,如果说hiredate + 与今天相距的月数 = 一个新的日期,而且这个新的日期肯定和SYSDATE相距不超过30天。
SELECT ename, hiredate,
TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year,
TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) months,
TRUNC(SYSDATE-ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate))) day
FROM emp;
以上的这道程序,属于日期函数的综合应用。