【PL/SQL】基础练习 1 - 8 题(上)

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;

你可能感兴趣的:(plsql,oracle)