zoukankan      html  css  js  c++  java
  • Oracle笔记

    消除重复行
    SELECT DISTINCT DEPTNO FROM EMP
    查看表结构
    (CMD命令中)DISCRIBE EMP
    优先级 NOT>AND>OR
    ORDER BY  ASC升序  DESC降序
    LOWER 全部转换成小写
    UPPER 全部转换成大写
    INNITCAP 首字母大写其他小写
    CONCAT 连接两个值等同于||
    SUBSTR (expression,n1,n2)截取字符从n1开始,n2个字符,如果n1为负数则从右往左数
    LENGTH(expression) 获取字符长度
    INSTR (s1,s2,n1,n2)返回s2在s1中从n1开始第n2次出现的位置,n1,n2可以不写,默认值为1
    LPAD (S1,N1,S2)返回S1被S2从左面填充到N1长度的字符串
    SELECT  LPAD(‘DE’,6,’*’) FROM DUAL 结果 ****DE
    RPAD(S1,N1,S2) 返回S1被S2从右面填充到N1长度的字符串
    SELECT  LPAD(‘DE’,6,’*’) FROM DUAL 结果 DE****
    TRIM去除字符串头部或尾部(头尾)的字符
    SELECT TRIM(‘S’FROM ‘SSMITH’) FROM DUAL 结果 MITH
    REPLACE(S1,S2,S3)把S1中的S2用S3替换
    ROUND(expression,n1) 四舍五入到n1位,正数表示小数点后面,负数表示小数点前面
    TRUNC(expression,n1) 截取到第n1位正数表示小数点后面,负数表示小数点前面
    select to_char(23.45,'0000.000') from dual 结果: 0023.450
    select to_char(23.45,'9999.999') from dual 结果:   23.450
    select to_char(123123,'99,999,999.99') from dual 结果:    123,123.00
    select to_char(123123.3,'FM99,999,999.99') from dual 结果:123,123.3
    select to_char(123123.3,'$99,999,999.99') from dual 结果:    $123,123.30
    select to_char(123123.3,'L99,999,999.99') from dual 结果:             ?23,123.30
    select to_char(123123.3,'99,999,999.99C') from dual 结果:        123,123.30GBP MOD(m,n)返回m除以n的余数 日期函数(格式碼CC世纪,YY,MM,DD,HH,MI,SS) SYSDATE 返回系统日期 MONTHS_BETWEEN 返回两个日期相差的月数 SELECT MONTHS_BETWEEN(HIREDATE1,HIREDATE2) FROM DUAL ADD_MONTHS 返回指定日期加上相应月数后的日期 SELECT ADD_MONTHS(HIREDATE,3)FROM DUAL NEXT_DAY 返回某一日期指定的下一指定日期 SELECT NEXT_DAY(‘1,6月,2017’,‘星期一’)FROM DUAL 返回2017年6月1号的下一个星期一是几号 LAST_DAY 返回指定日期当月最后一天的日期 SELECT LAST_DAY(‘1,6月,2017’)FROM DUAL ROUND(date[,’fmt’]) 将date按照fmt指定的格式四舍五入,如果没有指定fmt则默认为DD,将date四舍五入为最近的一天 TRUNC(date[,’fmt’]) 将date按照fmt指定的格式截断,如果没有指定fmt则默认为DD,将date四舍五入为最近的一天 EXTRACT 返回年或月或日 SELECT EXTRACT(MONTH FROM HIREDATE) FROM EMP SELECT TO_CHAR(HIREDATE,'YY/MM/DD')FROM EMP指定格式转换 YYYY 完整数字表示的年份 YEAR 年份的英文表示 MM 两位数字表示月份 MONTH 月份的全名 DAY 星期几 DY 三个英文缩写表示星期 通用函数 NAL(N1,N2)如果N1不为null则返回N1,否则返回N2 NAL(N1,N2,N3)如果N1不为null则返回N2,否则返回N3 NULLIF(N1,N2)比较两个表达式,如果相等返回null,否则返回N1 SELECT COALESCE(COMM,0) COMM,DEPTNO FROM EMP返回第一个不为空的参数,参数个数不受限制 ************************************************** select ENAME,DEPTNO, (CASE DEPTNO WHEN 10 THEN '销售部' WHEN 20 THEN '技术部' WHEN 30 THEN '管理部' else 'WU' END) DEPTNAME FROM DEPT *************************************************** select ENAME,DEPTNO, DECODE( DEPTNO 10, '销售部' 20, '技术部' 30, '管理部' 'WU' ) FROM EMP 99语法: SELECT TABLE1.COLUM1 ,TABLE2. COLUM2 FROM TABLE1 CROSS JOIN TABLE2 交叉连接 ,产生笛卡尔积 NATURAL JOIN TABLE2 自然连接 JOIN TABLE2 USING COLUM JOIN TBLE2 ON TABLE1.COLUM=TABLE2.COLUM LEFT/RIGHT/FULL OUTER /JOIN TABLE2 ON TABLE1.COLUM=TABLE2.COLUM 全外连接为99独有 92语法 SELECT TABLE1.COLUM1 ,TABLE2. COLUM2 FROM TABLE1 WHERE TABLE1.COLUM=TABLE.COLUM 自然连接 WHERE TABLE1.COLUM=TABLE.COLUM(+) 左外连接 WHERE TABLE1.COLUM(+)=TABLE.COLUM 右外连接 授予视图权限: 登陆system 账户,密码oracle 语法:grant create view to scott DDL(schema data definition)数据库模式定义语言create alter drop truncate DCL(data control language) 数据库控制语言grant deny revoke DML数据操作语言 insert delete update select 数值类型及函数 number是oracle中的数据类型 Precision代表精度,sacle代表小数位数;Precision范围[1,38],scale范围[-84,127] 常用方法: abs()求绝对值:select abs(-3) as absvalue from dual round()四舍五入:select round(33.54,1) as roundvalue from dual,第二个参数为保留到小数第几位 ceil()向上取整:select ceil(33.34) as roundvalue from dual 结果:234 floor()向下取整:select floor(33.34) as roundvalue from dual 结果:33 mod()取模:select mod(5,3) as roundvalue from dual 结果:2 Sign()正负性:select sign(-4) as roundvalue from dual正数为1,负数为-1 Sqrt()求平方根:select sqrt(9) as sqrtvalue from dual 结果:3 Power()求乘方:select power(2,3) as powervalue from dual 结果:8 Trunc截取:select trunc(274364.3645,3) as truncvalue from dual 结果:274364.364
    select to_char(23.45,'0000.000') from dual 结果: 0023.450
    select to_char(23.45,'9999.999') from dual 结果:   23.450
    select to_char(123123,'99,999,999.99') from dual 结果:    123,123.00
    select to_char(123123.3,'FM99,999,999.99') from dual 结果:123,123.3
    select to_char(123123.3,'$99,999,999.99') from dual 结果:    $123,123.30
    select to_char(123123.3,'L99,999,999.99') from dual 结果:             ?23,123.30
    select to_char(123123.3,'99,999,999.99C') from dual 结果:        123,123.30GBP
    
    set serverout on;让控制台输出信息
    例1:
    set serverout on;
    begin
        dbms_output.put_line('hello');
    end;
    /
    例2:
    set serverout on;
    --声明变量
    declare n number:=1;
            v varchar2(20):='world';
    begin
        dbms_output.put_line('hello'||n||v);
    end;
    /
    例3:
    set serverout on;
    declare emp_count number;
    begin
            select count(*) into emp_count from emp where sal>=3000;
            if emp_count>0 then
              dbms_output.put_line('有薪资大于3000的员工'||emp_count||'个');
            else
               dbms_output.put_line('没有薪资大于3000的员工'||emp_count||'个');
            end if;
    end;
    /
    例4:(switch case)
    set serverout on;
    declare emp_count number;
    begin
            select count(*) into emp_count from emp where sal>=3000;
            case emp_count
              when 0 then dbms_output.put_line('没有薪资超过3000的员工');
              when 1 then dbms_output.put_line('有一个薪资超过3000的员工');
              when 2 then dbms_output.put_line('有两个薪资超过3000的员工');
              when 3 then dbms_output.put_line('有三个薪资超过3000的员工');
              else dbms_output.put_line('有超过三个薪资超过3000的员工');
            end case;
    end;
    /
    例5:(if条件)
    set serverout on;
    declare g_id number:=2;
            g_losal number;
            g_hisal number;
    begin
          loop
            if(g_id>4) then exit;
            end if;
            select hisal,losal into g_hisal,g_losal from salgrade where grade=g_id;
            dbms_output.put_line('id号'||g_id||'最低工资'||g_losal|| '最高工资'||g_hisal);
            g_id:=g_id+1;
          end loop;
    end;
    /
    例6:(while循环)
    set serverout on;
    declare g_id number:=2;
            g_losal number;
            g_hisal number;
    begin
         while g_id<5 loop
            select hisal,losal into g_hisal,g_losal from salgrade where grade=g_id;
            dbms_output.put_line('id号'||g_id||'最低工资'||g_losal|| '最高工资'||g_hisal);
            g_id:=g_id+1;
          end loop;
    end;
    /
    例7:(for循环)
    set serverout on;
    declare g_id number:=2;
            g_losal number;
            g_hisal number;
    begin
         for g_id in 2..4 loop
            select hisal,losal into g_hisal,g_losal from salgrade where grade=g_id;
            dbms_output.put_line('id号'||g_id||'最低工资'||g_losal|| '最高工资'||g_hisal);
           end loop;
    end;
    /
    游标简介:使用游标我们可以具体操作数据,比如对查询的结果,行,列进行更加细致的处理,以及对其他DML进行判断等操作。
    
    显示游标:
    例1:
    set serverout on;
    declare cursor cu_emp is select empno,ename,sal from emp;
    e_no number;
    e_name varchar2(10);
    e_sal number;
    begin
          open cu_emp;
          fetch cu_emp into e_no,e_name,e_sal;
          while cu_emp%found loop
            dbms_output.put_line('编号: '||e_no||', 姓名: '||e_name||', 薪资: '||e_sal);
            fetch cu_emp into e_no,e_name,e_sal;
            end loop;
            close cu_emp;
    end;
    /
    例2:
    set serverout on;
    declare cursor cu_emp is select empno,ename,sal from emp;
    --动态指定类型
    e_no emp.empno%type;
    e_name emp.ename%type;
    e_sal emp.sal%type;
    begin
          open cu_emp;
          fetch cu_emp into e_no,e_name,e_sal;
          while cu_emp%found loop
            dbms_output.put_line('编号: '||e_no||', 姓名: '||e_name||', 薪资: '||e_sal);
            fetch cu_emp into e_no,e_name,e_sal;
            end loop;
            close cu_emp;
    end;
    /
    例3:
    set serverout on;
    declare cursor cu_emp is select * from emp;
    e emp%rowtype;
    begin
          open cu_emp;
          fetch cu_emp into e;
          while cu_emp%found loop
            dbms_output.put_line('编号: '||e.empno||', 姓名: '||e.ename||', 薪资: '||e.sal);
            fetch cu_emp into e;
            end loop;
            close cu_emp;
    end;
    /
    例4:
    set serverout on;
    declare cursor cu_emp is select * from emp where sal>2000 and sal<3000;
    e emp%rowtype;
    begin
          open cu_emp;
          fetch cu_emp into e;
          while cu_emp%found loop
            dbms_output.put_line('编号: '||e.empno||', 姓名: '||e.ename||', 薪资: '||e.sal);
            fetch cu_emp into e;
            end loop;
            close cu_emp;
    end;
    /
    隐式游标:
    隐式游标的属性  返回值类型  意义
    SQL%ROWCOUNT    整型        代表DML语句成功执行的行数
    SQL%FOUND       布尔型      值为TRUE代表插入,删除,更新或单行查询操作成功
    SQL%NOTFOUND    布尔型      与SQL%FOUND返回值属性相反
    SQL%ISOPEN      布尔型      DML执行过程中为真,结束为假
    例1:
    set serverout on;
    begin 
      update emp set sal=1000 where empno=1002;
      if sql%rowcount=1 then
       dbms_output.put_line('更新成功');
      else
        dbms_output.put_line('更新失败');
    end if;
    end; 
    动态游标
    强类型动态游标
    弱类型动态游标
    例1:
    set serverout on;
    declare type customType is ref cursor;
    e_count number;
    e emp%rowtype;
    s salgrade%rowtype;
    cType customType;
    begin 
     select count(*) into e_count from emp where job='PRESIDENT';
     if e_count=0 then
       open cType for select * from salgrade;
       fetch cType into s;
       while cType%found loop
         dbms_output.put_line('等级: '||s.grade||', 最低薪资:'||s.losal||', 最高薪资:'||s.hisal);
         fetch cType into s;
        end loop;
        close cType;
      else
        open cType for select * from emp;
       fetch cType into e;
       while cType%found loop
         dbms_output.put_line('编号: '||e.empno||', 姓名: '||e.ename||', 薪资: '||e.sal);
         fetch cType into e;
        end loop;
        close cType;
        end if;
    end; 
    /
    
    触发器
    例1:
    create trigger tr_book
    before insert or update
    on book
    begin
       if user!='cc' then
         raise_application_error(-2001,'权限不足');
         end if;
    end;
    /
    例2:
    create trigger tr_book_log
    after insert or update or delete
    on book
    begin
      if inserting then
        insert into book_log values(user,'insert',sysdate);
        else if updating then
          insert into book_log values(user,'update',sysdate);
          else if deleting then
            insert into book_log values(user,'delete',sysdate);
       end if;
       end if;
       end if;
    end;
    /
    例3:
    create trigger tr_bkk_add
    after insert
    on book
    for each row
    begin
      update booktype set num=num+1 where id=:new.typeid;  
    end;
    /
    例4:
    create or replace trigger tr_bkk_delete
    after delete
    on book
    for each row
    begin
      update booktype set num=num-1 where id=:old.typeid;
    end;
    /
    禁用触发器:alter trigger triggerName disabled;
    解禁触发器:alter trigger triggerName enable;
    
    
    自定义函数:
    例1:
    create function getBookCount return number as
    begin
      declare book_count number;
      begin
        select count(*) into book_count from book;
        return book_count;
      end;
    end getBookCount;
    调用:
    set serveroutput on;
    begin
      dbms_output.put_line('表boo有 '||getBookCount()||'条数据。');
    end;
    例2:
    create function getRecordCount(tablename varchar2) return number as
    begin
       declare record_count number;
       query_sql varchar2(100);
       begin
         query_sql:='select count(*) from '||tablename;
         execute immediate query_sql into record_count;
         return record_count;
    end;
    end getRecordCount;
    调用:
    set serveroutput on;
    begin
      dbms_output.put_line('表boo有 '||getRecordCount('book')||'条数据。');
    end;
    存储过程:
    例1:
    create procedure addBook(bookname in varchar2,typeid in number) as
    begin
      declare maxid number;
      begin
        select max(id) into maxid from book;
        insert into book values(maxid+1,bookname,typeid);
    	commit;
      end;
    end addBook;
    /
    调用存储过程:
    execute addBook('德语',2);
    例2:
    create or replace procedure addBook2(bn in varchar2,typeid in number) as
    begin
      declare maxid number;
      n number;
      begin
        select count(*) into n from book where bn=bookname;
        if n>0 then
          return;
          end if;
        select max(id) into maxid from book;
        insert into book values(maxid+1,bn,typeid);
        commit;
      end;
    end addBook2;
    /
    
  • 相关阅读:
    Apache Solr入门教程(初学者之旅)
    Codeforces 631 (Div. 2) E. Drazil Likes Heap 贪心
    Codeforces 631 (Div. 2) D. Dreamoon Likes Sequences 位运算^ 组合数 递推
    Codeforces 631 (Div. 2) C. Dreamoon Likes Coloring 思维or构造
    python中的类型转换
    MVC3.0在各个版本IIS中的部署
    get和post的区别
    Vue和React对比
    谈谈你对web标注和W3c的理解和认识
    js中的undefined 和null
  • 原文地址:https://www.cnblogs.com/yanweichen/p/9571471.html
Copyright © 2011-2022 走看看