zoukankan      html  css  js  c++  java
  • oracle学习笔记03

    一:表空间

    /*
    	 创建表空间:逻辑单位,通常我们新建一个项目,就会去创建表空间,在表空间中创建用户,用户去创建表。
    	 语法:create tablespace 表空间名字
    	 	   datafile '文件的路径(服务器上的)'
    	 	   size   大小
    	 	   autoextend  on   自动扩展
    	 	   next   每次扩展的大小
    
    */
    --切换到system用户
    --创建一个表空间prod_dm
    create tablespace prod_dm
    datafile 'D:appprod_dm.dbf'
    size 100m
    autoextend on
    next 10m;
    --D:appprod_dm.dbf 会自动产生一个文件,大小100MB,占用空间100MB
    
    --删除表空间
    drop tablespace prod_dm;   --删除逻辑关系,文件还存在,手动删除
    
    --查看用户表空间情况,需要有resource角色权限
    select tablespace_name,sum(bytes)/1024/1024 || 'MB' FROM user_free_space group by  tablespace_name;
    
    
    

    二 创建用户

    /*
    	创建用户:
    	create  user 用户名
    	identified by 密码
    	default tablespace  表空间的名字
    
    */
    --创建用户
    create user prod_dm
    identified  by dm_passwd
    default tablespace prod_dm;
    --现在可以用prod_dm登录,但是会报错 ORA-01045: user lacks CREATE SESSION privilege
    /*
    oracle中已经存在3个重要的角色:connect角色,resource角色,dba角色
    connect  主要使用是让用户可以连接到数据库 
    resource  主要使用是让用户可以创建表
    dba  它是一种比较特殊的权限,普通用户拥有之后可以成为数据库管理者
    CONNECT 角色: --是授予最终用户的典型权利,最基本的权限有
    			ALTER SESSION --修改会话
    			CREATE CLUSTER --建立聚簇
    			CREATE DATABASE LINK --建立数据库连接
    			CREATE SEQUENCE      --建立序列
    			CREATE  SESSION --建立会话
    			CREATE  SYNONYM  --建立同义词
    			CREATE  VIEW     --建立视图
    
    RESOURCE 角色: --授予开发人员的
    			CREATE CLUSTER --建立聚簇
    			CREATE PROCEDURE --建立存储过程
    			CREATE  SEQUENCE  --建立序列
    			CREATE TABLE  --建表
    			CREATE TRIGGER --建立触发器
    			CREATE TYPE    --建立类型
    DBA:该角色具有数据库所有的权限,只有DBA角色权限才能创建数据库结构,并且系统权限也要DBA授出。
    			
    授权语法:grant 角色|权限 to  用户名;
    --授权create session的权限,resource角色
    grant create session,resource to 用户名;
    */
    grant connect to prod_dm;  --执行
    

    三 数据类型

    /*常用列的类型 
         varchar2(长度)  可变长度   varchar2(10)  hello 占5个字符
         char(长度)      固定长度   varchar(10)   hello  占10个字符,用空格填充
         number(总长度,小数长度)     数字类型
         date             年月日时分秒
         timestamp       时间戳
         
    
     */
     
     
    select  current_date from dual;
    select  current_timestamp from dual;
    
    --使用子查询方式创建表
    create table  test2  as select * from emp;
    

    四:修改表

    /*
    	修改表:
    			添加列
    			修改列 varchar2(10)
    			删除列
    			修改列名
    			重命名表
    			
    	SQL分类:
    
    
    */
    --创建表
    create table stu(
           stuid number primary key ,
           sname varchar(10)
    );
    
    --添加列add
    alter  table stu  add  phone varchar2(11);
    --添加2列
    alter  table stu  add (
    		sex  varchar2(2),
        	 address varchar2(2)
    );
    
    --修改列的类型modify
    --把sex列的类型长度2修改为4
    alter table stu modify sex varchar(4);
    
    
    --修改列名 alter table 表名 rename column 旧列明  to  新列名;
    --把sex列修改为gender
    alter table stu rename  column  sex to gender;
    
    --删除列  alter table 表名 drop column 列名;
    --删除gender列
    alter table stu drop column gender;
    
    
    --修改表名 rename 旧表名 to 新表名;
    rename stu to student;
    
    
    --删除表
    drop table student;
    
    
    
    
    

    五:表的约束

    /*表的五大约束
    	列的约束:约束主要是用来约束表中数据的规则
    	  1:主键约束
    	  2:非空约束
    	  3:唯一约束
    	  4:检查约束
    	  
    	  
    	  5:外键约束:主要是用来约束从表product1中的记录,此记录必须存在于主表categoty1中
    */
    --性别:男女不详
    create table student(
           student number primary key,
           sname varchar2(10) unique,
           age   varchar2(4) not null,
           gender varchar2(4)  check( gender in ('男','女','不详'))
    
    );
    --主键约束违反
    insert into student values(1,'张三','30','男');
    insert into student values(1,'李四','31','男');  
    --回滚
    --唯一约束违反
    insert into student values(1,'诸葛','30','男');
    insert into student values(2,'诸葛','31','男');  
    --非空约束
    insert into student values(1,'诸葛','','男');
    insert into student values(2,'周瑜',null,'男');
    --检查约束
    insert into student values(2,'周瑜','31','你好');
    
    
    
    --外键约束
    /*
    商品分类,商品表
    
    */
    --创建商品分类表 主表
    create table category1(
           cid  number primary key,
           cname varchar2(20)
    );
    --创建商品表  从表
    create table product1(
           pid number primary key,
           pname varchar2(20),
           cnumber number 
    );
    
    insert into category1 values (1,'手机数码');
    insert into product1 values(10,'apple',11);    --插入这个11,没有意义,但是可以插入,所以需要添加外键约束
    select * from category1;
    select * from product1;
    
    
    --添加外键约束
    alter table product1 add  foreign key (cnumber) references category1(cid); --之前有问题的数据没有删掉,所以会报错
    --下面删除有问题的数据
    truncate  table  product1; 
    truncate  table  category1;
    
    
    --删除含有外键的表
    drop table tablename cascade constraints;
    
    

    六:更新数据和删除数据

    /*
    	update 表名 set  列名 =列的值  where 条件
    	delete  from  表名  where 条件			 
    */
    

    七:事务

    /*事务:就是一系列的操作,要么都成功,要么都失败
    四大特性:原子性,隔离性,一致性,持久性
    
    
    如果不考虑隔离级别:脏读,虚读,不可重复读
    Mysql隔离级别:Read Uncommitted(读取未提交内容),Read Committed(读取提交内容),Repeatable Read(可重读)--默认事务隔离级别 ,Serializable(可串行化)
    
    ORACLE隔离级别: read committed--默认的,serializable, read-only
    
    提交:commit
    事务的保存点/回滚点: savepoint   保存点的名字
    回滚:rollback  
    rollback to  保存点名字
    */
    
    

    八: 视图

    /*
    	视图:是对查询结果的一种封装。视图里的所有数据,都是来源于原表。视图本身不存储任何数据。
    	    作用:1:能够封装复杂的查询结果
    	    	 2:屏蔽表中的细节
    	    	 
    	语法: create [or replace ]  view  视图的名称 as  查询语句  [with  read only]
    	--一般加上with read only
    */
    --查询员工表
    select * from emp;
    
    --创建一个视图,视图可以理解成一个窗户,显示特定的大小,显示数据
    --存在就替换 or  replace
    create or replace view  view_test1 as select ename,job,mgr from emp;
    --授权才能创建视图
    grant create view to scott;
    
    --查询视图
    select * from view_test1;
    
    
    --通过视图修改数据--不建议使用视图修改数据
    update view_test1 set ename='SMITH2'  where ename='SMITH';
    select * from view_test1;
    
    --创建一个只读视图
    create or replace view  view_test2 as select ename,job,mgr from emp with read only;
    select * from view_test2;
    update view_test2 set ename='SMITH1'  where ename='SMITH2';   --不能修改只读视图
    
    

    九:序列

    /*
    	序列:生成类似于mysql中auto_increment 这种ID自动增长的数值
    	
    	
    	oracle 语法:
    		create sequence  序列的名字
    		start  with  从几开始
    		increment by 每次递增多少
    		maxvalue 最大值 |nomaxvalue
    		minvalue 最小值 |nominvalue
    		cycle | nocycle     --是否循环1,2,3,1,2,3
    		cache  缓存的数量
    		
        如何从序列中获取值:
        currval:当前值     --注意:currval需要在调用一次nextval之后才能调用
        nextval:下一个值
    
    */
    
    --创建一个序列1,2,3,4,5...30 ,循环
    create sequence seq_test001
    start with 1
    increment by 2
    maxvalue 30
    cycle
    cache 10;
    
    --测试
    select seq_test001.currval from dual;  --报错,虚要调用一次nextval
    select seq_test001.nextval from dual;  --1
    select seq_test001.currval from dual;  --1
    select seq_test001.nextval from dual;  --3
    select seq_test001.currval from dual;  --3
    
    --序列用的最多的写法
    create sequence seq_test002;
    select seq_test002.nextval from dual;
    
    
    

    10:索引

    /*
    	索引:在数据量比较大的情况下,如果某一列经常作为查询条件,就可以创建索引,提高查询效率
    	
    	语法:
    		create  index 索引的名称 on   表名(列);
    		
    	注意:主键约束自带主键索引,唯一约束自带唯一索引。
    
    */
    
    --测试
    --插入500万条数据
    declare
    
    begin
           for i in 1..5000000  loop
               insert into FiveMillion values('姓名'|| i,'地址'|| i);
           
           end loop;
           commit;
    
    end;
    
    --test
    --在没有索引的情况下,查询 name='姓名3000000'
    select * from FiveMillion where name='姓名3000000';    --0.086seconds
    
    --创建索引name,再去查询name='姓名3000000'
    create index  ind_FiveMillion on FiveMillion(name);  --32.256seconds
    select * from FiveMillion where name='姓名3000000';   --0.044 seconds  速度变快了一倍
    
    
    --创建复合索引
    create  index ind_FiveMillion2 on FiveMillion(name,address);  
    select * from FiveMillion where name='姓名3000000' and address='地址3000000'; 
    
    /*SQL语句F5:explain plan 查看指标
    	1:cost  CPU调用的次数
    	2:cardinality  影响的行数
    */
    
    --索引的原理:平衡二叉树 btree  blance tree
    --如果某一列作为查询条件的时候,索引可以提高查询效率,但是插入数据的时候,会变慢。
    --索引创建之后,过一段时间之后,DBA重构索引。
    
    
  • 相关阅读:
    腾讯之困,QQ与微信各有各的烦恼
    Attribute(一)——提前定义特性
    假设有来生
    codeforces248(div1) B Nanami's Digital Board
    驳斥苹果“诊断后门论”,声援扎德尔斯基
    python批量下载色影无忌和蜂鸟的图片 爬虫小应用
    建筑建模学习笔记2——3DMax房屋框架建模
    【大话QT之十六】使用ctkPluginFramework插件系统构建项目实战
    javaObject类
    java基本类型和String之间的转换
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/12070397.html
Copyright © 2011-2022 走看看