zoukankan      html  css  js  c++  java
  • Oracle基本使用

    创建数据库表

    创建 scott 数据库中的 dept 表
    create table dept(
        -- 部门编号
        deptno      int unsigned auto_increment primary key,
        -- 部门名称
        dname       varchar(15)     ,
        -- 部门所在位置
        loc         varchar(50)    
    )engine = InnoDB;
    
    创建 scott 数据库中的 emp 表
     create table emp(
        -- 雇员编号
        empno           int unsigned auto_increment primary key,
        -- 雇员姓名
        ename           varchar(15)     ,
        -- 雇员职位
        job             varchar(10)     ,
        -- 雇员对应的领导的编号
        mgr             int unsigned    ,
        -- 雇员的雇佣日期
        hiredate        date            ,
        -- 雇员的基本工资
        sal             decimal(7,2)    ,
        -- 奖金
        comm            decimal(7,2)    ,
        -- 所在部门
        deptno          int unsigned    ,
        foreign key(deptno) references dept(deptno)
    )engine = innodb;
    
    创建数据库 scott 中的 salgrade 表,工资等级表
    create table salgrade(
        -- 工资等级
        grade       int unsigned    ,
        -- 此等级的最低工资
        losal       int unsigned    ,
        -- 此等级的最高工资
        hisal       int unsigned   
    )engine=innodb;
    
    
    创建数据库 scott 的 bonus 表,工资表
    create table bonus(
        -- 雇员姓名
        ename       varchar(10),
        -- 雇员职位
        job         varchar(9),
        -- 雇员工资
        sal         decimal(7,2),
        -- 雇员资金
        comm        decimal(7,2)
    )engine=innodb;
    
    
    dept表中的数据
    INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK'); 
    INSERT INTO dept VALUES (20,'RESEARCH','DALLAS'); 
    INSERT INTO dept VALUES (30,'SALES','CHICAGO'); 
    INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON'); 
    
    
    salgrade表中的数据
    INSERT INTO salgrade VALUES (1,700,1200); 
    INSERT INTO salgrade VALUES (2,1201,1400); 
    INSERT INTO salgrade VALUES (3,1401,2000); 
    INSERT INTO salgrade VALUES (4,2001,3000); 
    INSERT INTO salgrade VALUES (5,3001,9999);
    
    
    emp表中的数据
    INSERT INTO emp VALUES    (7369,'SMITH','CLERK',7902,to_date('1980-12-17','yyyy-mm-dd'),800,NULL,20); 
    INSERT INTO emp VALUES    (7499,'ALLEN','SALESMAN',7698,to_date('1981-2-20','yyyy-mm-dd'),1600,300,30);
    INSERT INTO emp VALUES    (7521,'WARD','SALESMAN',7698,to_date('1981-2-22','yyyy-mm-dd'),1250,500,30);
    INSERT INTO emp VALUES    (7566,'JONES','MANAGER',7839,to_date('1981-4-2','yyyy-mm-dd'),2975,NULL,20);
    INSERT INTO emp VALUES    (7654,'MARTIN','SALESMAN',7698,to_date('1981-9-28','yyyy-mm-dd'),1250,1400,30);
    INSERT INTO emp VALUES    (7698,'BLAKE','MANAGER',7839,to_date('1981-5-1','yyyy-mm-dd'),2850,NULL,30);
    INSERT INTO emp VALUES    (7782,'CLARK','MANAGER',7839,to_date('1981-6-9','yyyy-mm-dd'),2450,NULL,10);
    INSERT INTO emp VALUES    (7788,'SCOTT','ANALYST',7566,to_date('87-7-13','yyyy-mm-dd'),3000,NULL,20);
    INSERT INTO emp VALUES    (7839,'KING','PRESIDENT',NULL,to_date('1981-11-17','yyyy-mm-dd'),5000,NULL,10);
    INSERT INTO emp VALUES    (7844,'TURNER','SALESMAN',7698,to_date('1981-9-8','yyyy-mm-dd'),1500,0,30);
    INSERT INTO emp VALUES    (7876,'ADAMS','CLERK',7788,to_date('87-7-13','yyyy-mm-dd'),1100,NULL,20);
    INSERT INTO emp VALUES    (7900,'JAMES','CLERK',7698,to_date('1981-12-3','yyyy-mm-dd'),950,NULL,30);
    INSERT INTO emp VALUES    (7902,'FORD','ANALYST',7566,to_date('1981-12-3','yyyy-mm-dd'),3000,NULL,20);
    INSERT INTO emp VALUES    (7934,'MILLER','CLERK',7782,to_date('1982-1-23','yyyy-mm-dd'),1300,NULL,10);
    

    伪列

    简介:它不属于任何一张表,但是会被所有的表共享

    rownum:逻辑序列 1 2 3 4 5 6 7 8

    rowid:物理序列(18)真实的存放位置

    例子

    select rowid,rownum,e.* from emp e where mgr>7800;
    
    相同 rownum:不同SQL语句在执行时,rownum的值不一致
    不同 rownum:在相同SQL语句在执行时,rownum的值不变

    查询工资最高的前3条员工信息

    有问题的sql语句:

    select ename,sal 
    from emp 
    where rownum <=3
    order by sal desc
    

    使用子查询

    select rownum ,empno,ename,mgr,sal,deptno from  -- 然后按伪列标记查出
    (select * from emp order by sal desc) -- 先查出emp的倒序出来
    where rownum <=3 -- 把伪列的前三个取出
    

    创建一张表

    create table mystudent(
        stuno number,
        stuname varchar2(10),
        stuage number
    );
    insert into mystudent values(1,'ls',12);
    insert into mystudent values(2,'2s',12);
    insert into mystudent values(3,'ws',12);
    insert into mystudent values(4,'ss',12);
    
    -- 使用伪列查看
     select rownum,s.* from mystudent s;
    -- 使用伪列删除
     delete  from mystudent where rowid='AAAWl2AABAAAbXBAAD'
    

    如何删除重复的数据

    rowid:根据插入的顺序 一次递增

    rownum:逻辑伪列

    rowid: 物理伪列

    思路

    根据编号分组(将重复的数据 放到一组),然后在每组中只保留一个

    -- 先查询
    select  .... from mystudent 
    group by stuno
    
    delete from mystudent 
    where rowid 
    not in(
    select min(rowid)  -- 查询最大的
    from mystudent 
    group by stuno
    )
    

    查看

    SQL> select * from mystudent;

     STUNO STUNAME        STUAGE
         1 ls                 12
         2 ls                 12
         3 xs                 22
         1 ls                 12
         2 ls                 12
         3 ws                 32
    

    已选择6行。

    SQL> select * from mystudent;

     STUNO STUNAME        STUAGE
         1 ls                 12
         2 ls                 12
         3 xs                 22
    
    • 对查询出的结果集去重:distinct
    -- 把查询出来的null值,变为0
    select ename,comm,nvl(comm,0),nvl2(comm,comm,0) from  emp 
    

    学习视频

  • 相关阅读:
    小白重装系统步骤总结
    【bzoj3680】平衡点 模拟退火
    【洛谷P4513】小白逛公园
    【POJ3666】Making the Grade 离散化+DP
    【codevs1690】开关灯 线段树
    【POJ2182】Lost Cows 树状数组+二分
    【POJ2676】sudoku 搜索
    【UVA】11400 照明系统设计 排序+dp
    关于二分答案输出误差问题的看法
    Java programming language does not use call by reference for objects!
  • 原文地址:https://www.cnblogs.com/rzkwz/p/13265855.html
Copyright © 2011-2022 走看看