zoukankan      html  css  js  c++  java
  • Oracle表的管理

    字符型

    char 定长,最大2000字符

          char(10) '小明',后面6个字符将被浪费掉,适合定义固定长度和经常被查询的字段,例如身份证号码,效率高

    varchar2 变长,最大4000字符

          varchar2(10) '小明'  后面6个字符空间将被节省

    clob  字符型大对象,最大4G

    数字型

    number   -10的38次方~10的38次方

         number(5,2) 表示5位有效数字,其中两位小数   -999.99~999.99

    number(5)  表示5位整数

    日期类型

       date   包含年月日时分秒

    图片

         blob  可以存放声音和图片

    建表

    create table student (--表名
    ID number(4),          --学号
    name varchar2(20),     --姓名
    sex char(2),           --性别
    birthday date,         --生日
    sal number(7,2)        --奖学金
    )
    注意:查看你数据库的字符类型 SELECT * FROM v$nls_parameters WHERE PARAMETER = 'NLS_CHARACTERSET'; 如果value=AL32UTF8  那么一个中文字符占用3个字节,你要设char(3)

    删除表

    
    
    drop table table_name purge
    
    

    清空表,保留表结构

    delete from student;     --保留表结构,写日志,用rollback可以恢复
    truncate table student;  --截断表,不写日志,无法恢复,速度快
     

    增加字段

    alter table student add(classID number(2));

    修改字段

    alter table student modify (name varchar2(30));     --更改字符型
    alter table student modify name not null; --更改约术条件

    删除一个字段

    alter table student drop column sal;

    修改表名

    rename student to stu;

    添加数据

    insert into student values('01','张三' ,'','11-11月-82',10000.98);
    insert into student(ID,name,sex) values('02','null','女') --插入部分字段,并且姓名为空
    默认的日期格式是:11-11月-82,这种格式如果看着别扭,可以改变成我们习惯的输入格式
    alter  session set nls_date_format='yyyy_mm_dd';
    insert into student values('3','王五','男','2000-12-03','6999'

     使用to_date函数

    insert into test (birthday,name) values (to_date('1981-03-12','yyyy-mm-dd'),'zy');

    更新数据

    update student sal set sal=sal/2 where sex='';
    update myemp set (sal,mdeptno)=(select sal,mdeptno from myemp where mname='SMITH') where mname='JAMES'; --通过子查询更

    删除数据

    delete from student where sex=''

    回滚数据

    rollback;    --回滚到上次commit的数据
    savepoint a8;    --创建保存点
    rollback to a8;  --回滚到保存点

     表的查询

     查询表结构

    desc student;

    显示操作所消耗的时间

    set timing on;

    通过子查询复制

    insert into users (uno,uname,upass) select * from users;     --自我复制
    insert into myemp select ename,deptno,sal from emp where depto='30'; --非自我复

    查询多少行

    select  count(*)  from tables_name;

    去除重复行

    select distinct deptno,job from emp;

    普通查询

    elect sal,deptno,job from emp where ename='SMITH';

     查询中带有数学计算,并把字段取别名

    select ename " 姓名",sal*12+nvl(comm,0)*12 "年薪" from emp     --nvl是将null置0,否则整个计算都将为空

     多条件查询

    select sal,deptno,job from emp where sal>='300' and sal <'5000;

    模糊查询 

    select ename,sal from emp where ename like 'S%';       -- "%"表示0到多个字符
    
    select ename,sal from emp where ename like '__I%';         --"_"表示单个字符    

     在where字句中使用in

    select  ename,sal from  emp where  empno in (20,30,40);

    使用is null操作符

    select empno,ename from emp where mgr is null;

     使用逻辑操作符

     select ename from emp where (sal>'500' or job='manager') and ename like 'J%';

    使用order by 排序

    select * from emp order by sal;        --默认是asc升序排列
    select * from emp order by sal desc;   --desc降序排列
    select (sal+nvl(comm,0))*12 "年薪",ename from emp order by "年薪"; --按别名排序
    select * from emp order by deptno,sal desc; --混合排列

    求最大,最小,平均和总和

     select max(sal),min(sal),avg(sal),sum(sal) from emp;

    使用子查询查出工资最高的人

    select ename ,sal from emp where sal=(select max(sal) from emp);

     使用group by进行分组查询

    select avg(sal),max(sal) from emp group by deptno;      --单字段分组
    select avg(sal),max(sal) from emp group by deptno,job;   --多字段分组

    select avg(sal),deptno from emp group by deptno order by avg(sal) desc ; ---先分组再排

    使用having限制分组查询显示结果

    select avg(sal),deptno from emp group by deptno having avg(sal)<2000;  

    多表查询

    select a.ename,a.deptno,b.dname,b.loc from emp a,dept b where a.deptno=b.deptno;     --条件至少要比表的个数少一个

    select a1.sal,a1.deptno
      from emp a1,(select avg(sal) avgsal ,deptno from emp group by deptno) a2
        where a1.deptno=a2.deptno and a1.sal>a2.avgsal; --其中一张表是通过查询得到的

    select *
      from dept d,emp e
        where d.deptno=e.deptno(+)
          and  e.deptno is null; --+ 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。

    分页查询

    select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rn>6; 

    复制表

    create table myemp as select * from emp;                         --通过查询复制表
    create table myemp(mname,mdeptno,sal) as select ename,deptno,sal from  emp; --复制指定字

    联合查询

    select * from emp where sal>2000 union all select * from emp where job='MANAGER';      ---取并集
    select * from emp where sal>2000 intersect select * from emp where job='MANAGER';      ---取交集
    select * from emp where sal>2000 minus select * from emp where job='MANAGER';          ---取差集
    
  • 相关阅读:
    从GoogleClusterData统计每个用户的使用率、平均每次出价
    简单的大众点评爬虫
    导入GoogleClusterData到MySQL
    高斯分布(正态分布)
    解决Mysql无法导入存在null数据的问题
    使用Python操作MySQL
    [Vue warn]: Duplicate keys detected: '0'. This may cause an update error.
    css多行超出时,超出高度,显示省略号
    mock.js学习之路(二)easy-mock(Vue中使用)
    mock.js学习之路一(Vue中使用)
  • 原文地址:https://www.cnblogs.com/zydev/p/5252568.html
Copyright © 2011-2022 走看看