Oracle第九课

Oracle第九课

一、in,exists的用法

  • in:在一个范围内

    select * from emp where empno in (
    select empno from emp where deptno=10
    )
    -- 编号和姓名重复
    delete from emp where empno not in (
    select min(empno) from emp group by empno,ename)
    )
  • exists比in效率高

    • 主子表的存在关系,返回的是true,false

    • SELECT * FROM emp o WHERE EXISTS (SELECT 
      empno FROM emp i WHERE o.empno=i.empno AND deptno=10);
    • where exists(结果)

  • 作业

    CREATE TABLE team(NAME CHAR(1));
    INSERT INTO team VALUES(&a);
    -- 显示所有的可能结果
    -- ab,ac,ad,ae   bc,bd,be cd,ce de
    SELECT * FROM team;
    SELECT t1.*,t2.* FROM team t1,team t2 WHERE t1.name<t2.name;

二、PL/SQL编程

  • test window

    • declare:定义变量,变量要提前定义,只能在定义区定义

  • begin是SQL主体

  • 输出:dbms包里面有put_line和put方法

    • put:输出到缓存

    • put_line:把缓存中的数据一起输出

  • 简单示例

    declare 
     -- Local variables here
     -- 只能在这里定义变量
    i integer;
    begin
     -- Test statements here
    dbms_output.put(1);
    dbms_output.put_line(2);
    end;
  • 变量的定义和赋值

    -- Created on 2021/1/25 by 96093 
    declare
     -- Local variables here
     -- 只能在这里定义变量
    i integer;
    v_username VARCHAR(10);
    v_clazz NUMBER:=11;
    v_college NUMBER(10) DEFAULT 1;
    pai CONSTANT NUMBER := 3.14;
    BEGIN
     -- =只是比较的功能,不能赋值,赋值要加:=
    username:='张三';
     -- Test statements here
    dbms_output.put(1);
    dbms_output.put_line(2);
    dbms_output.put_line(v_username||'-'||v_clazz||'-'||v_college);
    END;
  • 把sql的结果放到变量中

    declare 
     -- Local variables here
    i integer;
     -- 数据类型来自于字段的类型,随着表字段改变而改变
     -- 始终保持一致
    v_empno emp.empno%TYPE;
    begin
     -- Test statements here
     -- 工资最低的员工编号,把sql的结果放到变量中
     SELECT empno INTO v_empno FROM (SELECT empno FROM emp ORDER BY sal DESC) WHERE ROWNUM=1;
    dbms_output.put_line('最高工资'||v_empno);
    end;
  • 行变量定义

     v_emprow emp%ROWTYPE; -- 行记录类型变量,数据结构
    dbms_output.put_line('最高工资'||v_emprow.empno||'-'||v_emprow.ename);
  • select...into...应该只能得到一条记录

  • 异常处理

    -- 捕获异常
    EXCEPTION
       -- others 包罗万象
       -- sqlcode:异常编号 sqlerrom:异常信息
       WHEN no_data_found THEN -- oracle内部预定义的异常名称
        dbms_output.put_line('没有数据');
       WHEN too_many_rows THEN
        dbms_output.put_line('返回太多行');
       WHEN OTHERS THEN -- 对未知异常的处理
        dbms_output.put_line(SQLCODE||'-'||SQLERRM);
  • IF ELSIF

    -- Created on 2021/1/25 by 96093 
    declare
     -- Local variables here
    i integer;
    begin
     -- Test statements here
    i:=60;
     IF i<60 THEN
      dbms_output.put_line('no pass');
     ELSE
      dbms_output.put_line('pass');
     END IF;
    /* IF i<60 THEN
       dbms_output.put_line('no pass');
       ELSIF i<80 THEN
         dbms_output.put_line('普通');
         ELSIF i<90 THEN
           dbms_output.put_line('良好');
           ELSE
             dbms_output.put_line('优秀');
             END IF;*/
    end;
  • 随机数

    -- Created on 2021/1/25 by 96093 
    declare
     -- Local variables here
    v_score INTEGER;-- 成绩
    i integer;
    begin
     -- Test statements here
     DELETE FROM t_score;-- 测试前先删除表数据
     FOR i IN 1..10 LOOP -- 2. for循环
    v_score:=abs(mod(dbms_random.random,100)); -- 1. 随机数
       INSERT INTO t_score(NAME,score) VALUES('name'||seq1.nextval,v_score);
     END LOOP;
     COMMIT;
    dbms_output.put_line(i);
    end;
  • case when

      SELECT score,CASE 
     WHEN score BETWEEN 0 AND 59 THEN '不及格'
      WHEN score BETWEEN 60 AND 80 THEN '普通'
       WHEN score BETWEEN 80 AND 90 THEN '良好'
         WHEN score BETWEEN 90 AND 100 THEN '优秀'
           END
           FROM t_score;
           
    -- 第二个示例
     SELECT CASE
     WHEN score BETWEEN 1 AND 60 THEN 'no pass'
       ELSE 'pass'
     END
     FROM t_score;
  • 表里有多少条数据

      SELECT COUNT(*) INTO i FROM t_score;
    dbms_output.put_line(i);
  • while循环

    -- 变量定义时为初始化为null,无法进行比较
    declare
     -- Local variables here
    i INTEGER;
    BEGIN
     IF i IS NULL THEN
      dbms_output.put_line('i is not init');
      i:=1;
       ELSE
         IF i<10 THEN
            dbms_output.put_line('i<10');
         ELSE
          dbms_output.put_line('i>=10');
     -- Test statements here
     WHILE i<10 LOOP
      i:=i+1;
      dbms_output.put_line(i);
     END LOOP;
    end;
  • loop end loop

    declare 
     -- Local variables here
    i integer;
    begin
     -- Test statements here
     /*
     for ... loop
       end loop
       while loop
         end loop
     */
     LOOP
       IF i IS NULL THEN
        i:=0;
        ELSIF i<10 THEN
          i:=i+1;
           ELSE
             EXIT; -- 退出循环
             END IF;
            dbms_output.put_line(i);
             END LOOP;
    end;

    -- 示例2
    declare
     -- Local variables here
    i integer;
    begin
     -- Test statements here
    i:=0;
     LOOP
      i:=i+1;
       EXIT WHEN i>10;
      dbms_output.put_line(i);
       END LOOP;
    end;

三、作业

  1. 输出100以内的质数

  2. 建一张表,t_money(id,name,money),money是收入,1万以内,分段显示:0-1500属于贫困,1501-3000是蓝领,3001-8000是白领,8001-10000是精英

    select case when end 来实现

  3. 写一个程序,找出上述t_money表中有多少条记录,并显示工资最高的人的信息,排序再过滤,结果存储到变量



上一篇:数据库系统学习笔记(一)


下一篇:你想了解数据库吗,进来瞧一瞧吧,详细的数据库解读