SQL知识点4 - oracle

创建、维护表( 属于DDL )

create - 创表

注意事项

  • 当前用户拥有 create table 权限
  • 当前用户拥有一定大小的表空间
  • 使用不属于本用户的表:用户名.表名
  • 数据字典
    • user_tables:查看当前用户所有表对象


  语法结构

// 方法1
create table 表名 (
    列名 数据类型 【约束】 
)

// 方法2
create table 表名 [ (列名) ] as  子查询           // 新表列名列表 必须与 子查询 匹配  -- 列名不能多不能少 ----  注意该语句没有复制父表的约束


  示例1

create table student (
    id number(11),
    sex char(2) default('男'),
    sname varchar2(15)          // 括号内最后一行不需要写 逗号
);      //  sql语句记得 分号结束


  示例2:不会复制父表的约束

create table dept_copy (a, b, c) as select * from dept;

create table dept_copy  as select * from dept  where 1=0;     //只创建表结构

alter - 修改表结构

注意事项

  • 修改表
    • 只能修改 列名、数据类型及长度、默认值
    • 数据类型修改: 该列的所有数据都必须为 null 或者 ‘’
    • 数值型长度修改: 长度变小 → 改前数据必须为空、长度变大 → 无限制
    • 字符型长度修改: 长度表小 → 符合当前数据的最小值、长度变大 → 无限制
  • 删除列
    • 默认: 被外键引用的列,不能被删除
    • 表必须保留一列

  语法结构

// 增加新列
alter table 表名 add ( 新列的定义 )

// 修改列
alter table 表名 modify ( 列的定义 )

// 修改列名
alter table dept rename column 旧列名 to 新列名;

// 删除列
alter table 表名 drop (列名)

  示例

// 增加咧
alter table dept add ( describe varchar2(30) not null );

// 修改列
alter table dept modify ( loc varchar(30)  );

// 修改列名
alter table dept rename column loc to local;

// 删除列
alter table dept drop (describe );

drop - 删除表

注意事项

  • 表的结构、以及数据被删除
  • 约束、索引被删除
  • 与表关联视图、同义词被保留、但已失效


  语法结构

drop table 表名;

rename - 重名表名

  语法结构

rename 旧表名 to 新表名

truncate - 截断表

注意事项

  • 权限: 表拥有者 或者 权限是delete any table
  • 删除表中所有数据

  语法结构

truncate table 表名

视图 – view

选择性的显示数据表的一部分


注意事项

  • 复杂视图如果有 单行、多行函数,必须写明视图列名 或者 基表函数别名

  • update、delete只能作用视图显示出来的数据,其他未显示的视图数据即使能运行成功,但并不能作用到基表

  • with read only:不能通过视图执行任何DML语句

  • with check option:insert的数据必须在视图能显示、即符合where范围

  • 数据字典

    • user_views:包含视图的定义
    • user_updatable_columns:包含描述哪些列可以更新、插入、删除
    • user_objects:包含用户的对象



通过视图进行DML操作

  • delete - 创视图时的子查询不存在以下内容即可以删除
    • group函数、( group by、distinct )关键字
  • update - 创视图时的子查询不存在以下内容即可以修改
    • group函数、( group by、distinct )关键字
    • 表达式定义的列
    • rownum 伪列
  • insert - 创视图时的子查询不存在以下内容即可以插入
    • group函数、( group by、distinct )关键字
    • 表达式定义的列
    • rownum 伪列
    • 基表中未在视图中选择的其它列定义为非空并且没有默认值 — ????看不懂

视图view
简单视图
基表数量1个
可以DML操作
复杂视图
基表数量1个或多个
包含函数
包含数据组
不一定可以DML操作

创建视图

  语法结构

// or replace修改已经存在的视图、force基于是否存在,都会创此视图
create 【 or replace 】【 force / noforce 】 view 视图名  【 视图列名 】
as 子查询
【 with check option 【constraint 约束名】 】  //通过视图进行插入、修改的数据行满足所定义的查询
【 with ready only 】    // 不能在视图进行DML操作


  示例

// 简单视图
create view view_emp as select * from emp;

// 复杂视图
create view dept_sum ( dname, minsal, avgsal )
as select dname, mix(sal), avg(sal) 
    from dept, emp
    where dept.deptno = emp.deptno
    group by dname;
删除视图

  语法结构

drop view 视图名;

约束 – constraint

列值必须符合某种限制 – 不仅仅是数据类型

oracle默认约束命名: SYS_C + 数字n

自定义约束建议命名规则: 表名_列名_约束类型

数据字典

  • user_constraints:查看表上所有约束
  • user_cons_columns:查看与约束相关联的列名
约束
not null -- 非空值、只能是列级别
unique -- 列组合值必须唯一、可以空值
check -- 列值在某个范围、不允许使用伪列
primary key -- 主键
foreign key -- 外键[ 空值、或者'参照列值' ]、参照( 外表的主键、唯一键 )

添加约束 - 创表时
外键删除类型
默认:当主键值被外键引用时,不能删除被引用的主键行
on delete cascade → 参照行被删除、相应的外键列被删除
on delete set null → 参照行被删除、对应的外键列值设置为 空

  语法结构

// 方法1 - 创表时
create table 表名 (
    列名 数据类型  【 constraint 约束名 】references 参照表( 参照列 ) 删除类型 ,    // 外键列级别约束
    列名 数据类型 默认值 【 constraint 约束名 】  约束类型,       // 列级别约束、在每列后面
    
    【 constraint 约束名 】 约束类型( 列名 ) ,            // 表级别约束,定义所有列之后,在写约束
    【 constraint 约束名 】foreign key( 外键列名 ) references  参照表( 参照列 ) 删除类型// 外键表级别约束
)

  示例

create table student (
    sid number(11) constraint student_sid_unique unique,
    sname varchar2(16) not null,
    loc varchar2(30),
    sex char(2) check (sex in ( '男', '女' ),
    age number,
    constraint student_loc_unique unique(loc),
    constraint student_age_check check( age between 18 and 30 )
);

追加约束 - 已经创表

  语法结构

alter table 表名 add  【 constraint 约束名 】 约束类型( 列名 ) 

alter table 表名 add 【 constraint 约束名 】 foreign key( 外键列名 ) references 参照表( 参照列 )                 // 追加外键

alter table 表名 modify  ( 列名【 constraint 约束名 】not null )    // 特殊、追加不空约束


  示例

alter table student add constraint student_sid primary key ( sid );

alter table student add foreign key( sname ) references school(sname);

alter table student modify ( sex not null );

删除约束

  语法结构

alter table 表名 drop  primary/foreign key( 列名 );

alter table 表名 drop constraint 约束名 【 cascade 】   //【cascade】跟该表关联的约束一同删除


  示例

alter table student drop primary key cascade  // 外表的外键约束一同删除

alter table student drop constraint student_sid_unique;

启用、禁用约束

大批数据导入、禁用约束能提高导入效率

  语法结构

 // 禁用约束、cascade外表关联该列的约束一同禁用
alter table 表名 disable constraint 约束名 【 cascade】 ;

// 启用约束u
alter table 表名 enable constraint 约束名;

索引 – index

类似书本目录、查找页面内容不需要全书翻页查找,只需根据目录查找大概的范围位置

注意事项

  • 占用空间
  • 降低DML操作速度
  • 数据字典
    • user_indexs:包含索引的名称、及其唯一性
    • user_ind_columns:包含索引名称、表名、列名
索引
单列索引 --- 建立在单列上
复合索引 --- 建立在列组合上
适合创建索引情况
数据量大
查询结果条数在 2% ~ 4%左右
经常where的列
查询列包含大量null --- 空值不包含在索引内
不适合创建索引情况
数据量小
不常作为查询条件的列
查询条件中有单行函数、not null、!=、<>
频繁更新的表

例如:empno创建了索引,但是查询条件 (empno+12)有算术、单行函数则该索引不会起作用

创建索引

手动创建索引名建议使用:idx_表名_列名

创建方式
自动创建 -- primary key、unique系统会自动创建索引
手动创建

  语法结构

create index 索引名 on 表名( 列名 );


  示例

// 单列索引
create index idx_emp_empno on emp( empno );

// 复合索引
create index idx_emp_empnoDeptno on emp( empno, deptno );



  测试检索速度

// emp_copy表  有1千万条数据
select * from emp where empno=100000;     
// 无索引时:2.749、2.746、2.734、2.730、2.722 秒

create  index idx_empCopy_empno on emp_copy(empno);     // empno列上创建索引
// 有索引时:0.041、0.037、0.032、0.041 秒

// 有索引 比 无索引 快了将近100多陪的速度

删除索引

索引被删除 → 索引所占的空间被释放

  语法结构

drop index 索引名

同义词( 对象别名 ) – synonym

数据库对象的指针 → 类似指向java对象的变量名
公有同义词的创建、删除 → 只能由数据库管理员进行操纵

创建同义词

  语法结构

create 【public】synonym 对象别名 for 对象名   ---  默认 private 


  示例

create synonym s_emp for emp;     // emp表指针变量为 s_emp

// 两者查询是一样的
select * from emp;     
select * from s_emp; 

&emsp;

删除同义词

  语法结构

drop synonym 同义词( 对象别名 )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值