1.查询员工ENAME的第三个字母是A的员工的信息(使用2种方法)。
分析:要么模糊查询,要么准确定位位置再判断
SELECT * FROM EMP
WHERE ENAME LIKE '__A%';
SELECT * FROM EMP
WHERE SUBSTR(ENAME,3,1) = 'A';
2.查询部门10, 20的员工截止到2000年1月1日,工作了多少个月
分析:工作了多久,用Months_Between函数,第一个参数减去第二参数返回相差月份数目。
SELECT DEPTNO,sum(MONTHS_BETWEEN(DATE'2000-01-01',HIREDATE)) AS 月 FROM EMP
WHERE DEPTNO = 10 OR DEPTNO = 20
GROUP BY DEPTNO;
3.显示姓名、hiredate和雇员开始工作日是星期几?
分析:TO_Char函数参数DAY,直接返回星期几
SELECT ename,hiredate,TO_CHAR(HIREDATE,'DAY') FROM EMP;
4.查询所有名字的开始字母是J、A或M的雇员,用首字母大写、其它字母小写显示雇员的全名,显示名字的长度,并对查询结果按雇员的全名升序排序。
分析:同上,截取判断可以模糊查询也可以用准确查询。多个条件判断即可以用IN或者用OR。
方法一:
SELECT E.*,
CONCAT(UPPER(SUBSTR(ENAME, 1, 1)), LOWER(SUBSTR(ENAME, 2))) AS 姓名,
LENGTH(ENAME) AS 长度
FROM (SELECT *
FROM EMP
WHERE ENAME LIKE 'J%'
OR ENAME LIKE 'A%'
OR ENAME LIKE 'M%') E
ORDER BY 姓名;
方法二:
SELECT UPPER(SUBSTR(ENAME,1,1))||LOWER(SUBSTR(ENAME,2,LENGTH(ENAME)-1)) AS NEW_NAME FROM EMP
WHERE SUBSTR(ENAME,1,1) IN ('J','A','M')
ORDER BY NEW_NAME;
5.查询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中包含大写字母A的员工姓名,员工姓名长度
SELECT * FROM EMP
WHERE DEPTNO IN (10,20) AND INSTR(ENAME,'A',1)>0 AND HIREDATE > DATE'1981-05-01';
6.将员工工资按如下格式显示:123,234.00 RMB。
分析: To_char函数里面可以用FM作为人民币,数字用逗号划分相当于Ctrl+ 1 下的会计专用。
SELECT TO_CHAR(SAL,'FM999,999,999,999.00')||'RMB' AS 员工工资 FROM EMP;
7.在员工表中查询出员工的工资,并计算应交税款:如果工资小于1000,税率为0,如果工资大于等于1000并小于2000,税率为10%,如果工资大于等于2000并小于3000,税率为15%,如果工资大于等于3000,税率为20%。
分析: 用Case When多条件判断,然后新建多一列.
SELECT
E.SAL,
CASE WHEN E.SAL>= 3000 THEN 0.2
WHEN E.SAL>2000 THEN 0.15
WHEN E.SAL>1000 THEN 0.10
ELSE 0 END AS 税率
FROM EMP E;
8.查询各个管理者手下员工的最低工资,其中最低工资不能低于2000,没有管理者的员工不计算在内
分析: 两张表连接,按员工编号分组后再判断最低工资不能低于2000.
SELECT E2.EMPNO,MIN(E1.SAL)FROM EMP E1
LEFT JOIN EMP E2
ON E1.MGR = E2.EMPNO
GROUP BY E2.EMPNO
HAVING E2.EMPNO IS NOT NULL AND MIN(E1.SAL)>2000;