当前位置: 澳门新濠3559 > 数据库 > 正文

这里存在树形关系,列出所有办事员的姓名、编

时间:2019-11-07 13:43来源:数据库
1 7566 JONES MANAGER 7839 1981/4/2 2975.00 202 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 203 7876 ADAMS CLERK 7788 1987/5/23 1100.00 204 7902 FORD ANALYST 7566 1981/12/3 3000.00 205 7369 SMITH CLERK 7902 1980/12/17 800.00 select ENAME fro
1 7566 JONES MANAGER 7839 1981/4/2 2975.00  20
2 7788 SCOTT ANALYST 7566 1987/4/19 3000.00  20
3 7876 ADAMS CLERK 7788 1987/5/23 1100.00  20
4 7902 FORD ANALYST 7566 1981/12/3 3000.00  20
5 7369 SMITH CLERK 7902 1980/12/17 800.00  

select ENAME from emp where length(ename)=5;

 

1.时间的处理

select ename,round(sysdate-hiredate) emp_date from emp;

 

  例如:oracle自带scott.emp表,这里存在树形关系。

  1. 以首字母大写的方式显示所有员工的姓名

 

    查询'JONES'员工及所有其直接、间接下属员工的信息:  

  1. 显示正好为5个字符的员工姓名

CREATE OR REPLACE FUNCTION IS_EMP_THERE RETURN VARCHAR2 IS
    CURSOR C IS
        SELECT 1
          FROM emp
         WHERE hiredate > TRUNC(SYSDATE, 'MM');
    r NUMBER;
    v VARCHAR2(3);
BEGIN
    OPEN C;
    FETCH c
        INTO r;
    IF c%FOUND THEN
        v := 'YES';
    ELSE
        v := 'NO';
    END IF;
    CLOSE c;
    RETURN v;
END;

  同理:to_char(hiredate,'yyyy') year,to_char(hiredate,'MM') month

  1. 找出收取佣金的员工的不同工作

这是一个差劲的SQL,因为我们并不需要员工数量。通过对结果集的所有记录计数,从而验证至少有一行是满足条件的,这样并不高效。

  获取年: to_char(hiredate,'MM');---这里hiredate是date类型,格式1981/4/2

  1. 找出佣金高于薪金60%的员工

例如:检查是否有员工上个月聘用的。

  start with 条件1  connect by prior 条件2;---条件2是表中的父子字段。

select ename,empno,deptno from emp WHERE job = 'CLERK';

SELECT COUNT(1)
  FROM dual
 WHERE EXISTS (SELECT NULL
          FROM emp
         WHERE hiredate > TRUNC(SYSDATE, 'MM'));

select e.* from emp e start with ename='JONES' connect by prior empno=mgr;
  1. 找出部门10中所有经理,部门20中所有办事员,既不是经理又不是办事员但薪金大于或等于2000的所有员工的详细资料

典型的例子:

2.表中存在树形结构

 


    

  1. 选择部门30中的所有员工

SQL解决方法:

结果:

select ENAME from emp where ename not like'%R%';


  1. 找出部门10中所有经理和部门20中所有办事员的详细资料

where hiredate > trunc(sysdate,'MM');

select ename,to_char(hiredate,'YYYY/MM') from emp order by to_char(hiredate,'MM'),to_char(hiredate,'yyyy') asc ;

select count(*)

  1. 显示所有员工姓名、加入公司的年份和月份,按受雇日期所在月排序,若月份相同则将最早年份的员工排在最前面。

 差劲的SQL:

select distinct job from emp where comm is not null;

 结果:如果存在返回1,不存在返回0,所以根本不需要使用PLSQL。

select * from emp where (deptno=10 and job='MANAGER') or (deptno=20 and job='CLERK')or job not in ('MANAGER','CLERK') and sal >=2000;

 虽然读取单个记录确实比读取结果集的所有记录高效,但这个方法是PLSQL的方法,当有适合的SQL方法可以使用时,尽量使用SQL,因为SQL会比PLSQL高效得多。

select ename,to_char(hiredate,'YYYY')||'年'||to_char(hiredate,'MM')||'月'||to_char(hiredate,'DD')||'日'from emp;

 PL/SQL的方案,可以用显式游标和%FOUND属性来执行单个的读取。

  1. 显示员工的详细资料,按姓名排序

  from emp

select * from emp  where comm > sal;

查看是否存在一条记录满足<特定条件> 。存在则<做一些处理>。

  1. 显示满10年服务年限的员工的姓名和受雇日期
  1. 找出早于12年前受雇的员工
  1. 显示所有员工的姓名,用a替换所有A

select * from emp where comm is null or comm < 100;

  1. 找出在任何年份的2月受聘的所有员工

select ename ,hiredate from emp order by hiredate asc;

  1. 显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同按薪金排序
  1. 显示不带有R的员工姓名

select replace(ename,'A','a') from emp ;

  1. 对于每个员工,显示其加入公司的天数
  1. 以年月日的方式显示所有员工的服务年限

select  round(sal/30) from emp;

select * from emp where to_char(hiredate ,'MM')=2 ;

  1. 显示在一个月为30天的情况所有员工的日薪金,忽略余数
  1. 找出不收取佣金或收取的佣金低于100的员工
  1. 列出所有办事员的姓名、编号和部门编号
  1. 显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面

select ename,job,sal from emp order by job desc ,sal;

  1. 显示所有员工的前三个字符

select * from emp where deptno = 30;

select * from emp where last_day(hiredate)-hiredate=2;

select ename ,hiredate from emp where months_between(sysdate,hiredate)/12>=10;

 

select INITCAP(ENAME) from emp;

  1. 找出佣金高于薪金的员工

select * from emp order by ename ;

select * from emp  where comm > (0.6)*sal;

select substr(ename,1,3) from emp ;

  1. 找出各月倒数第三天受雇的所有员工。

select * from emp where (deptno=10 and job='MANAGER') or (deptno=20 and job='CLERK');

select * from emp where months_between(sysdate,hiredate)/12 >=12;

编辑:数据库 本文来源:这里存在树形关系,列出所有办事员的姓名、编

关键词:

  • 上一篇:没有了
  • 下一篇:没有了