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

    Oracle day4
    20120217
    =====================
    DML: insert / update / delete
    DDL: create / drop / alter / truncate
    DCL: grant / revoke

    一 DML
    1.insert
    insert into dept_ning
    values(55, 'market', 'beijing');

    insert into dept_ning
    (deptno,  dname, location)
    values(56, 'research', 'beijing');
    --数据没有全部提供,必须写列名
    insert into emp_ning(empno, ename,
    salary, deptno)
    values(1234,'rose',5000,10,500);

    --出错,没有足够的值
    insert into emp_ning(empno, ename, salary)
    values(1234,'rose');

    --出错,值太多了
    insert into emp_ning(empno, ename, salary)
    values(1234,'rose',5000,500);

    insert into emp_ning(empno, ename,
    salary, hiredate)
    values(1234, 'rose', 5000,
    to_date('2012/01/01','yyyy/mm/dd'));

    create table emp_bak
    as
    select * from emp_ning
    where deptno = 10;

    delete from emp_bak;

    insert into emp_bak
    (select * from emp_ning
     where deptno = 20);

    create table myObjects
    as
    select * from all_objects
    where rownum < 1000;

    delete myObjects;

    insert into myObjects
    (select * from all_objects
    where rownum < 10000);
    2.update
    update 表名
    set 列1 = 新值1,列2 = 新值2,...
    where 条件;

    update emp_ning
    set bonus = 1000, deptno = 20,
        job = 'Programmer'
    where empno = 1234;

    3.delete
    delete emp_ning where empno = 1234;
    delete emp_ning where deptno = 10;
    delete emp_ning;
    select count(*) from emp_ning;
    rollback;
    select count(*) from emp_ning;

    create table emp_bak1_ning
    as
    select empno, ename,salary
    from emp_ning
    where deptno = 30;


    --适合bak1中重复记录非常多的场合.
                  复制非重复记录
    emp_bak1_ning--------------> bak2
    删掉表bak1, 把bak2改名为bak1.


    --适合bak1中重复记录非常少的场合.
    --直接在bak1中删除.

    --查询重复记录中地址最大的那条
    select empno, ename, salary,
           max(rowid)
    from emp_bak1_ning
    group by empno, ename, salary;
    --删除除了地址最大的重复记录之外所有的记录.
    delete emp_bak1_ning
    where rowid not in (
    select max(rowid)
    from emp_bak1_ning
    group by empno, ename, salary);

    rownum, rowid是Oracle独有的.

    事务 Transaction
    commit / rollback

    -----事务开始--------------
    DML:insert / delete / update

    commit(提交,确认),
    或者 rollback(回滚,撤销)
    -----事务终止--------------

    A                B
    insert : 1234    select (查不到)
    commit          
                     可以查到 1234
    update          
                     update(挂起)
    commit(释放锁)   修改成功
    update(挂起)
                     rollback;
    修改成功.

    ---开始事务-----
    update account
    set money = money - 500
    where id = 'A';

    update account
    set money = money + 500
    where id = 'B';

    if (都成功)
     commit;
    else
         rollback;
    -----事务终止-----

    正常退出会话: commit
    异常退出会话: rollback
    DDL操作: commit

    create table temp_ning (id number);
    insert into temp_ning values(1);
    insert into temp_ning values(2);
    --设置保存点,名字是a(自定义)
    savepoint a;
    insert into temp_ning values(3);
    insert into temp_ning values(4);
    --回滚到指定点
    rollback to a;
    select * from temp_ning;--2条记录

    insert into temp_ning values(100);
    savepoint b;
    insert into temp_ning values(5);
    savepoint c;
    insert into temp_ning values(6);
    --b点之后的保存点被取消
    rollback to b;

    insert / update / delete

    二.DDL操作:
    create / drop / alter / truncate

    create table 表名(
    列1 列1数据类型,
    列2 列2数据类型,
    ....
    );

    drop table 表名;

    create function f_name()....
    drop function f_name;

    alter: 修改对象结构
    create table temp_ning(id number);

    --增加列,只能加在最后.
    alter table temp_ning
          add (name char(20));

    alter table temp_ning
          add (age number(3));

    --改列名
     alter table temp_ning
     rename column name to stuname;

    --改列的类型char(20)->char(10)
    --放大可以
    --缩小的话, 如果数据有超过10个字符的,不能修改.
    id    stuname        age
    1     tom             18
    2     zhangsan        20

    --删除列age
    alter table temp_ning
    drop column age;

    alter table 表名
    --add (name char(20));
    --rename column 旧列名 to 新列名;
    --modify (age number(3));
    --drop column 列名;

    --截取表:把表数据全部删除.
    --立即生效,不能rollback
    truncate table temp_ning;

    delete temp_ning + commit

    --三思而后行
    drop table ....;
    truncate table ...;

    三.DCL语言
    grant / revoke
    --授权
    grant select on emp_ning to scott;
    --撤销权限
    revoke select on emp_ning from scott;

    sys/安装时设置
    system/安装时设置
    scott/tiger(测试用户)
    ....
    openlab/open123
    ninglj/*****

    四.脚本文件
    文档
    源代码
    数据库脚本文件

    1.创建脚本文件script_ning.sql
    $vi script_ning.sql
    -----------------------
    drop table temp_ning;
    create table temp_ning(id number);
    insert into temp_ning values(1);
    commit;
    -----------------------
    esc键-> :wq
    2.sqlplus中批处理执行脚本文件
    SQL>@ /user/openlab/script_ning.sql

    数据库在192.168.0.26
    数据库的口令:openlab/open123
    Oracle的端口号: 1521
    Oracle的名字(sid):tarena
    sqlplus安装在本地机器上

    C:>sqlplus openlab/open123@192.168.0.26:1521/tarena
    SQL>

    连接数据库的工具:
    --首选,命令行工具
    sqlplus
    --图形工具
    pl/sql developer(非官方,免费)
    toad(非官方,收费)
    sql developer(官方,免费,11g以上)


    补充练习: procedure 过程
    PL/SQL:  Procedure Language / SQL

    函数(function)
    过程(procedure)
    包(package)
    触发器(trigger)

    --输入班号,输出最高分的学生名字和总成绩
    create or replace procedure cal_ning(
     p_class_id in number, p_student_name out char,
     p_total_score out number
    )
    is
    begin
      select student_name, total_score
      into  p_student_name, p_total_score
      from (
        select stu.student_name,
               sum(per.test_score) total_score
        from t_student_ning stu join t_performance_ning per
        on stu.student_id = per.student_id
        where stu.class_id = p_class_id
        group by stu.student_name
        order by total_score desc)
      where rownum < 2;
    end;
    /

    --打开输出,默认值是off
    SQL>set serveroutput on
    --匿名块,用来测试过程或函数
    SQL>declare
      p_student_name char(20);
      p_total_score number;
    begin
      cal_ning(&no, p_student_name,       p_total_score);
      --向控制台输出变量值,System.out.print
      dbms_output.put_line(p_student_name);
      dbms_output.put_line(p_total_score);
    end;
    /
    --可以用&abc符号表示在运行时输入变量值
    select * from emp_ning
    where deptno = &abc;

    --改进版,输入共多少个班,输出每个班的最高成绩的学生姓名和总分
    --假设是班号是1-p_class_num
    create or replace procedure cal_ning1(
       p_class_num in number)
    is
      p_student_name char(20);
      p_total_score number;
    begin
      for i in 1..p_class_num loop
        select student_name, total_score
        into  p_student_name, p_total_score
        from (
          select stu.student_name,
               sum(per.test_score) total_score
          from t_student_ning stu join t_performance_ning per
          on stu.student_id = per.student_id
          where stu.class_id = i
          group by stu.student_name
          order by total_score desc)
        where rownum < 2;
        dbms_output.put_line
            (p_student_name || ', ' || p_total_score);
      end loop;
    end;
    /
    SQL>exec cal_ning1(2); --2个班

  • 相关阅读:
    yum只下载不安装
    知乎的 Flink 数据集成平台建设实践
    饿了么EMonitor演进史
    手机淘宝轻店业务 Serverless 研发模式升级实践
    独家对话阿里云函数计算负责人不瞋:你所不知道的 Serverless
    一文详解物化视图改写
    业务团队如何统一架构设计风格?
    Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩
    开源 1 年半 star 破 1.2 万的 Dapr 是如何在阿里落地的?
    Service Mesh 从“趋势”走向“无聊”
  • 原文地址:https://www.cnblogs.com/ChenJw/p/2358128.html
Copyright © 2011-2022 走看看