Oracle 表空间、用户,数据类型,DDL、DML 语句、约束,exp/imp

目录

创建表空间

创建用户

用户授权

Oracle 数据类型

创建表

子查询复制表

修改表结构 & 删除表

五大约束

插入/更新/删除数据

exp/imp 导入导出数据


Oracle SQL 语句由如下命令组成:

数据定义语言( DDL ):包括 CREATE (创建)命令、 ALTER (修改)命令、 DROP (删除)命令等。
数据操纵语言( DML ):包括 INSERT (插入)命令、 UPDATE (更新)命令、 DELETE(删除)命令、 SELECT FOR UPDATE (查询)等。
数据查询语言( DQL ):包括基本查询语句、 Order By 子句、 Group By 子句等。
事务控制语言( TCL ):包括 COMMIT (提交)命令、 SAVEPOINT (保存点)命令、ROLL BACK (回滚)命令。
数据控制语言( DCL): GRANT (授权)命令、 REVOKE (撤销)命令。

创建表空间

1、Oralce 数据库通常只有一个数据库实例 orcl,新建 Java Web 项目后,需要先新建表空间,然后创建用户并分配表空间,接着授权给用户,最后由此用户来建表操作。

2、创建表空间语法:

create tablespace 表空间名 datafile '文件在服务器山的路径' size 表空间初始大小 autoextend on next 每次扩展的大小;

(autoextend on:表示超出初始大小后自动进行扩展)

3、以系统用户 system 登录后,开始创建表空间 "dongShan"(datafile 的存储目录必须存在,.dbf 文件会自动创建):

create tablespace dongShan
  datafile 'E:\oracle_tablesapce\dongShan.dbf'
  size 500M 
  autoextend on
  next 50M;

4、上面的语句执行之后,在 oralce 服务器的指定位置就会自动生成 dbf 文件,且大小为初始大小500M。

5、默认情况下表空间(dbf文件)直接右键删除是删除不了的,因为它被 Oracle 占用了,如果真的不再需要,可以先删除表空间:drop tablespace 表空间名

drop tablespace xxx 删除的是 Oralce 中维护的表空间关系,删除之后 dbf 文件只是一个普通的文件,所以可以手动删除。

select * from dba_tablespaces; -- 查询所有表空间

select distinct tablespace_name  from dba_all_tables; -- 查询所有已经使用过的表空间

select *  from dba_all_tables where tablespace_name = 'GRP' ;-- 查询指定表空间下所有的表信息

创建用户

1、Oralce 数据库通常只有一个数据库实例 orcl,新建 Java Web 项目后,需要先新建表空间,然后创建用户并分配表空间,接着授权给用户,最后由此用户来建表操作。

2、创建用户语法:create user 用户名 identified by 密码 default tablespace 表空间名;

3、alter user 用户名 identified by "新密码"; --修改用户密码

--创建用户。Oracle 12c 创建用户的时候用户名必须以 c## 或者 C## 开头
--oracle12c 创建用户不用 C## 开头时,会报错:Oracle-65096:公用用户名或角色无效
create user c##wmx identified by 123456 default tablespace dongShan;
--删除用户,如果用户已经建了表,或者试图等,则必须使用 cascade 进行级联删除
--删除用户,必须使用其它管理员账号来进行操作
drop user 用户名名 cascade; 

select * from all_users; --查询系统用户

select * from dba_users; --查询系统用户

select * from v$session; -- 查询当前所有连接的用户

select * from session_privs; -- 查看当前用户权限

select * from all_tables where owner='WORKFLOW_1'; -- 查询用户 'WORKFLOW_1' 下的所有表,用户名 WORKFLOW_1 必须大写

用户授权

1、上面创建的用户 wmx 暂时只是普通用户,没有任何权限,无法登陆 oralce,接下来需要为它分配角色/授权。

2、Oracle 中有3个重要的角色:connect、resource、dba:

角色 权限
connect

ALTER SESSION--修改会话

CREATE CLUSTER--建立聚簇

CREATE DATABASE LINK--建立数据库链接

CREATE SEQUENCE--建立序列

CREATE SESSION--建立会话

CREATE SYNONYM--建立同义词

CREATE VIEW--建立视图

--是授予最终用户的典型权利,是最基本的

resource

--在上面的基础上又加了

CREATE PROCEDERE--建立过程

CREATE TABLE--建表

CREATE TRIGGER--建立触发器

CREATE TYPE--建立类型

--是授予开发人员的

dba 拥有全部权限,是系统最高权限。只有 dba 才可以创建数据库结构,系统权限也只能由 dba 授出,dba 可以操作全体用户(包括其它dba)的任意表,包括删除表。

3、授权语法:grant 角色|权限 to 用户名

grant connect to c##wmx;--授予 connect 角色给 c##wmx 用户
grant resource to c##wmx;--授予 resource 角色给 c##wmx 用户
grant dba to c##wmx;--授予 dba 角色给 c##wmx 用户
--如果想授予用户 zhangsan 有基本的操作的数据库的权限,比如建表等,但是又不想授予其管理员权限
--此时应该授权它  connect 连接权限,以及 resource 操作权限,需要同时赋予它两个角色的权限
grant connect to zhangsan; --授权 连接权限
grant resource to zhangsan; --授权操作基本的操作权限

4、授权操作必须是 dba 操作,授权之后 c##wmx 用户则可以连接数据库进行操作了。

Oracle 数据类型

1、在学习建表、操作表之前,应该先清楚 Oralce 的数据类型。Oracle 数据库的核心是表,表中的列使用到的常见数据类型如下:

类型 描述
CHAR(length) 存储 固定长度 的字符串。参数 length 指定了长度,如 果存储的字符串长度小于 length ,用空格填充。默认长度是 1 ,最长不超过 2000 字节。
VARCHAR2(length) 存储可变长度的字符串。length 指定了该字符串的最大长度。默认长度是 1 ,最长不超过 4000 字符。
NUMBER(p,s) 既可以存储浮点数,也可以存储整数。p 表示数字的最大位数(如果是小数,则包括整数部分和小数部分和小数点, p 默认是 38 位), s 是指 小数位数。小数位不能大于总数位。
DATE 存储日期和时间,存储纪元、 4 位年、月、日、时、分、秒,存储时间。从公元前4712 年 1 月 1 日到公元后 4712 年 12 月 31 日。
TIMESTAMP 不但存储日期的年月日,时分秒,以及秒后6 位 ,同时包含时区。
CLOB 存储大的文本,比如存储非结构化的XML 文档
BLOB 存储二进制对象,如图形、视频、声音等。

NUMBER 类型的示例:

创建表

1、建表语法:create table 表名( 列名 数据类型 [约束],列名 数据类型 [约束],...);

--创建学生表
CREATE TABLE STUDENT ( 
STUID VARCHAR2(7) NOT NULL, --学号 学号=‘S’+班号+2位序号 
STUNAME VARCHAR2(10) NOT NULL, --姓名 
GENDER VARCHAR2(2) NOT NULL, --性别 
AGE NUMBER(2) NOT NULL, --年龄 
SEAT NUMBER(2) NOT NULL, --座号 
ENROLLDATE DATE, --入学时间 
STUADDRESS VARCHAR2(50) DEFAULT '地址不详', --住址 
CLASSNO VARCHAR2(4) NOT NULL --班号 班号=学期序号+班级序号 
);

2、desc 用于查看表的结构,它不属于 sql ,所以需要到命令窗口中操作。

3、更多建表与约束操作可以参考下面的“五大约束”部分。

select * from all_tables where owner='WORKFLOW_1'; -- 查询用户 'WORKFLOW_1' 下的所有表,用户名 WORKFLOW_1 必须大写

子查询复制表

1、如果对于一张以及存在的表,现在想要复制它,则可以使用子查询复制表来实现。

2、语法:create table 表名 as 查询语句

3、如果子查询有结果,则复制表结构的同时也会复制表中的数据,如果子查询没有结果,则只复制表结构

--通过已经存在的 STUDENT 表复制一张新表 person
CREATE TABLE PERSON AS SELECT * FROM STUDENT;

修改表结构 & 删除表

1、通常有:

添加列:alter table 表名 add (列1 数据类型,列2, 数据类型....); -- 如果表中已有数据,则新增列不可约束为"NOT NULL"

修改列:alter table 表名 modify (列1 新数据类型 [约束]..);

删除列:alter table 表名 drop column 列名

修改列名:alter table 表名 rename column 旧列名 to 新列

修改表名:rename 旧表名 to 新表名

select * from person;--查询 person 表

alter table person add phone varchar2(11);--添加 phone 列
alter table person add (     --同时添加多列
      fatherName varchar2(16)  not null,
      fatherPhone varchar2(11) 
);

--为 saf_fund_account 表添加 fund_name 列,不允许为 null
alter table saf_fund_account add fund_name varchar2(60) not null;

-- 为 saf_fund_account 表的 fund_name 列设置描述
comment on column saf_fund_account.fund_name is '专户账户名';

alter table person drop column fatherName;--删除列
alter table person drop column fatherPhone;--删除列

alter table person modify fatherName varchar2(12);--修改列的数据类型
alter table gbm_bs_affix modify AFFIX_TITLE VARCHAR2(200);--修改列数据类型长度
alter table person rename column gender to sex;--修改列名

rename person to person_1;--修改表名
rename person_1 to person;--修改表名

drop table person_1;--删除表

五大约束

1、表的约束目的是为了保持数据的完整性,约束表中数据的规则。主要有:主键约束(PRIMARY KEY)、非空约束(NOT NULL )、唯一约束(UNIQUE)、检查约束(CHECK)、外键约束(FOREIGN KEY )。

2、主键约束:主键(primary key)不能为空,且必须唯一

3、如下所示建表的同时设置约束

--建表的同时创建约束
create table student_1(
stuid number(32) primary key,--主键
stuname varchar2(16) unique,--唯一约束
age varchar2(4) not null,--非空约束
gender varchar2(8) check (gender in ('男','女','保密'))
);
insert into student_1 values(1,'张三',22,'男');--插入数据,必须符合约束
insert into student_1 values(2,'李四',22,'女');--插入数据,必须符合约束
select * from student_1;--查询

4、如下所示建表后设置约束

--创建学生表
CREATE TABLE STUDENT ( 
STUID VARCHAR2(7) NOT NULL, --学号 学号=‘S’+班号+2位序号 
STUNAME VARCHAR2(10) NOT NULL, --姓名 
GENDER VARCHAR2(2) NOT NULL, --性别 
AGE NUMBER(2) NOT NULL, --年龄 
SEAT NUMBER(2) NOT NULL, --座号 
ENROLLDATE DATE, --入学时间 
STUADDRESS VARCHAR2(50) DEFAULT '地址不详', --住址 
CLASSNO VARCHAR2(4) NOT NULL --班号 班号=学期序号+班级序号 
);

--添加主键约束。constraint 关键字英文意思为约束、限制,PK_INFOS 为约束名称(自定义),primary key 约束类型
ALTER TABLE STUDENT ADD CONSTRAINT PK_INFOS PRIMARY KEY(STUID);
ALTER TABLE STUDENT ADD CONSTRAINT CK_INFOS_GENDER CHECK(GENDER = '男' OR GENDER = '女');--添加检查约束,性别只能是男或者女
ALTER TABLE STUDENT ADD CONSTRAINT CK_INFOS_SEAT CHECK(SEAT >=0 AND SEAT <=50);--添加检查约束,坐位号只能在 [0,50] 之间
ALTER TABLE STUDENT ADD CONSTRAINT CK_INFOS_AGE CHECK(AGE >=0 AND AGE<=100);--与上同理
--添加检查约束,限制班号范围
ALTER TABLE STUDENT ADD CONSTRAINT CK_INFOS_CLASSNO CHECK((CLASSNO >='1001' AND CLASSNO<='1999') OR (CLASSNO >='2001' AND CLASSNO<='2999'))
ALTER TABLE STUDENT ADD CONSTRAINTS UN_STUNAME UNIQUE(STUNAME);--添加唯一约束,姓名不能重复

--添加 GBM_BS_QTRY 唯一约束:ID_CARD,AGENCY_ID,END_DATETIME
ALTER TABLE GBM_BS_QTRY ADD CONSTRAINTS UK_ID_CART_AGENCY_ID_QTRY UNIQUE(ID_CARD,AGENCY_ID,END_DATETIME);

--为 saf_income_src 表的 SRC_CODE 列添加非空约束
--因为 not null 约束类型必须声明在列上,无法声明在表上,所以必须用 modify 方式来写 
alter table saf_income_src modify SRC_CODE not null;

--删除 saf_income_src 表的 SRC_CODE 列的非空约束
alter table saf_income_src modify SRC_CODE null; 

5、外键约束操作如下:另一张表被引用的列需是主键或Unique

--创建商品类型表。商品类型与商品 1 对多 关系,商品依赖类型表,类型表为主表,商品为从表
create table productType(
pid number(32) primary key,
pname varchar2(16) not null
);
--创建商品表。建表的同时设置外键
create table product(
pid number(32) primary key,
pname varchar2(16) not null,
price number(8,2) not null,--价格
ptId number(32) ,--外键
foreign key(ptId) references productType(pid)--设置外键,关联类型表的主键
);

--如果建表的时候没有设置外键,则修改表,为其添加外键。默认情况下,当主表记录被从表依赖时,主表记录无法删除,除非先删除依赖项
alter table product add constraints fk_ptId foreign key(ptId) references productType(pid);
--添加外键的同时设置级联删除。即主表删除记录时,会自动搜索,如果有其它记录依赖自己,则先删除依赖项,然后删除自己。
alter table product add constraints fk_ptId foreign key(ptId) references productType(pid) on delete cascade;

--插入数据
insert into productType values(1,'IT');
insert into productType values(2,'书籍');
insert into productType values(3,'美食');
select * from productType;

insert into product values(1,'鹿鼎记',35.55,2);
insert into product values(2,'蚂蚁上树',66.55,3);
select * from product;

delete from productType where pid =1;--正常删除,因为 pid =1 没有被任何记录依赖
--如果依赖自己的外键没有设置级联删除,则这里无法删除自己,报错:违反完整约束条件,已找到子记录。除非先删除所有依赖的子记录,否则只能强制删除(不建议)
--如果依赖自己的外键设置了级联删除,则会一并删除
delete from productType where pid =2 or pid = 3;

约束的删除与禁用:如果想修改一个约束类型,只能先删除约束再添加新的约束,如果禁用约束后加了一些非法数据,再开启约束是会失败的。

alter table student disable constraints uk_stuid;--禁用 student 表的唯一约束 uk_stuid,禁用后索引也会暂时失效。
alter table student enable constraints uk_stuid;--启用 student 表的唯一约束 uk_stuid
alter table student drop constraint uk_stuid;-- 删除 student 表的唯一约束 uk_stuid

--如果删除主键约束时,该主键是另一表的外键,则该主键不能直接删除,除非连带把外键约束也删除。
alter table dept drop constraint pk_dept cascade;

插入/更新/删除数据

insert into 表名 values(value1,value2,value3,...);--表中所有列按顺序给出所有值
insert into 表名(列1,列2,列3...) values(value1,value2,value3,...);--为部分列添加值
insert into 表名 查询语句;--使用子查询插入数据

--当前使用的是拥有管理员权限的用户 wmx 登录,管理员可以查询/操作任何用户的数据,包括其它管理员
select * from dept;
select * from system.dept;--查询系统用户 system 的部门表

insert into dept select * from system.dept;--子查询插入。将系统用户的部门表数据全部插入到 wmx 用户的部门表中
insert into dept(deptno,dname) values(50,'财务部');--为部分列添加数据
insert into dept values(60,'开发部','深圳');--为所有列添加值

--往员工表插入数据,对于日期使用 to_date 函数进行专户,Java 代码中也是同理
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(8001,'李四','主管',7782,to_date('2019/06/25 15:42:00','YYYY-MM-DD HH24:MI:SS'),9800.80,100,20);

select * from dept;
--更新数据格式:update 表名 set 列名1=value,列名2=value,... [where 条件];
update dept set dname='测试部',loc='长沙' where deptno = 50;--如果不加 where 条件,则整个表的 dname 都会被更新
update dept set dname='人事部' where deptno = 60;

--delete 删除数据:delete from 表名 [where 条件];  delete 是逐条删除,支持事务操作
--truncate 删除删除:truncate 先删除整个表,然后再创建表结构,不支持事务操作,如果是删除全部数据,效率会高些
--delete 删除的数据可以恢复,truncate 删除的数据不可恢复,必须慎重操作.

delete from dept where deptno = 60 or deptno = 50;
truncate table  dept;--删除表中所有数据

exp/imp 导入导出数据

1、在安装了 Oracle 后,在 bin 目录下提供了很多工具,其中就有 exp 与 imp. 可以在任意目录下的 cmd 中执行这些命令:

--导出数据库
-- cmd 中执行如下命令,hnbs 为目标 Oracle 数据库中的账号,1 是密码,...240/1521 是目标数据库 ip 与端口,file 后面跟保存的 .dmp 文件路径
exp hnbs/[email protected]:1521/orcl file=d:/hnbs.dmp
 
--在新数据库中创建同名的用户。在  plsql 等工具中执行命令。如果导出的数据库有表空间,则新数据库中的用户也建议设置同名的表空间,表空间需要提前创建。
--如果导出的数据库没有设置表空间,则这里也可以省略
select * from dba_tablespaces; -- 查询数据库所有表空间
create user hnbs identified by 1 default tablespace grp
 
--为用户授予权限
grant dba to hnbs;
 
--在 cmd 中执行命令,将导出的数据库文件导入到新数据库中
imp hnbs/[email protected]:1521/orcl file=d:/hnbs.dmp
 
--拓展:如果不想和导出的数据库使用一样的用户名称,则也可以创建不同的用户名,使用 fromuser 指定导出的数据库用户名称,touser 指定导入数据库用户名称
imp hnbs_3/[email protected]:1521/orcl file=C:\Users\Lenovo\Desktop\20190909yselement.dmp fromuser=hnbs touser=hnbs_3
发布了458 篇原创文章 · 获赞 884 · 访问量 92万+

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/90690400