Oracle第七课课后作业

Oracle第七课课后作业

一、作业

一个公司有很多部门有上级部门

一个员工有他所在的部门,根据员工编号找到他所在的所有上级部门。

编号姓名部门
1 张三 301
2 李四 401
编号名称上级部门
301 财务部 11
11 集团中心 2
2 财务总监 0

显示出张三的上级部门:财务部,集团中心,财务总监

-- 创建员工表
CREATE TABLE emp(ID NUMBER(2) PRIMARY KEY,
NAME VARCHAR(6) NOT NULL,
deptno NUMBER(4)CONSTRAINT fk_dept REFERENCES dept(ID) );
INSERT INTO emp VALUES(1,'张三',301);
INSERT INTO emp VALUES(2,'李四',401);
SELECT * FROM emp;
-- 创建部门表
CREATE TABLE dept(ID NUMBER(4) PRIMARY KEY,NAME VARCHAR(10) NOT NULL,pre_id NUMBER(4));
INSERT INTO dept VALUES(301,'财务部',11);
INSERT INTO dept VALUES(11,'集团中心',2);
INSERT INTO dept VALUES(2,'财务总监',0);
INSERT INTO dept VALUES(401,'保安部',NULL);

-- 张三的上级部门
SELECT * FROM dept START WITH ID=(SELECT deptno FROM emp WHERE NAME='张三') CONNECT BY PRIOR pre_id = ID;

二、内置函数

  1. 单行函数

    • 字符函数

      -- 返回字符的ascii值:ascii函数
      -- 将连个字符或字符串拼接起来:concat函数
      -- 查找字符:instr函数
      -- 返回字符串的长度:length函数
      -- 将所有字符全部转换为小写:lower函数
      -- 将所有字符全部转换为大写:upper函数
      -- 去掉字符串中的空格:ltrim(去掉左边的空格),rtrim(去掉字符串右边的空格),trim(去掉字符串两边的空格)
      -- 替换字符:replace函数
      -- 截取字符中的一段:substr函数
    • 数字函数

      -- 求绝对值:abs函数
      -- 求大于或等于某个数的最小值:ceil函数
      -- 求小于或等于某个数的最大值:floor函数
      -- 四舍五入:round函数
      -- 截断函数:trunc函数
      -- 取余:mod函数
    • 日期函数

      -- 显示当前时间:sysdate关键字
      -- 在当前时间上增加一个月:add_months函数
      -- 求当前月的最后一天十几号:last_day函数
      -- 四舍五入日期:round函数
      -- 求月份差:months_between函数
      -- 求当前日期的下一个星期几是几号:next_day函数
      -- 提取员工的入职月份:extract函数
      -- 截断日期:trunc函数
    • 转换函数

      -- 转换成字符:to_char函数
      -- 转换成数字:to_number函数
      -- 转换成日期:to_date函数
  2. 多行函数

    • 统计函数

      -- 求最大值:max函数
      -- 求最小值:min函数
      -- 求员工的个数:count函数
      -- 求平均值:avg函数
      -- 求和:sum函数
    • 解决空值:nvl

      -- nv1(comm,0)函数:如果奖金(comm)为空的话,则转换为0
      -- nv2(comm,1,0)函数:如果奖金(comm)不为空,则转换为1,否则,转换为0
    • decode函数

      -- decode(job,'CLERK','店员');
      -- 注释:如果job=’CLERK‘,则显示为店员

三、应用

  1. 行转列

    CREATE TABLE resident(NAME VARCHAR(6) NOT NULL,r_month number(2) NOT NULL,sal NUMBER(8) NOT NULL);
    INSERT INTO resident VALUES('赵一',1,10000);
    INSERT INTO resident VALUES('赵一',2,10500);
    INSERT INTO resident VALUES('赵一',3,9000);
    INSERT INTO resident VALUES('赵一',4,10030);
    INSERT INTO resident VALUES('赵一',5,10500);
    INSERT INTO resident VALUES('赵一',6,10000);
    INSERT INTO resident VALUES('赵一',7,12000);
    INSERT INTO resident VALUES('赵一',8,10500);
    INSERT INTO resident VALUES('赵一',9,10800);
    INSERT INTO resident VALUES('赵一',10,10900);
    INSERT INTO resident VALUES('赵一',11,10010);
    INSERT INTO resident VALUES('赵一',12,10800);
    SELECT * FROM resident;
    DROP TABLE resident;
    -- 显示每个人每月的工资,以列的形式显示,2020我国的平均收入是40000元左右,显示该居民是否达到或拖后腿
    SELECT NAME,SUM(DECODE(r_month,1,sal)) 一月,
    SUM(DECODE(r_month,2,sal)) 二月,
    SUM(DECODE(r_month,3,sal)) 三月,
    SUM(DECODE(r_month,4,sal)) 四月,
    SUM(DECODE(r_month,5,sal)) 五月,
    SUM(DECODE(r_month,6,sal)) 六月,
    SUM(DECODE(r_month,7,sal)) 七月,
    SUM(DECODE(r_month,8,sal)) 八月,
    SUM(DECODE(r_month,9,sal)) 九月,
    SUM(DECODE(r_month,10,sal)) 十月,
    SUM(DECODE(r_month,11,sal)) 十一月,
    SUM(DECODE(r_month,12,sal)) 十二月,
    DECODE(TRUNC(SUM(sal)/40000),0,'拖后腿','合格') 是否合格
    FROM resident r GROUP BY NAME;
  2. SQL递归的实现:

    -- SELECT *  FROM XX STRAT WITH 从什么地方开始  CONNECT BY PRIOR 递归条件
    -- 找id为1的子辈
    SELECT * FROM cow START WITH ID=1 CONNECT BY PRIOR ID = parent_id;



软件下载提取码:qwer
原文地址:https://www.cnblogs.com/ty0910/p/14309557.html