2.Oracle基础一Oracle基础命令


本文系列来自 FREE教程,稍加修改以方便复习SQL,如果冒犯请联系作者删除。

建表create table

Oracle表是Oracle数据库的核心,是存储数据的逻辑基础。Oracle表是一个二维的数据结构,有列字段和对应列的数据构成一个数据存储的结构。可以简单看成行和列的二维表,列代表着Oracle字段(column),行代表着一行数据(即一条数据记录)。

create table语句

Oracle数据库建表是通过create table命令来执行的,通过Oracle用户这一章节我们创建了一个Student用户,现在我们可以在student用户下创建一个stuinfo(学生信息表)来讲解create table 命令的使用。

--crate table 语法
create table 用户.表名
(
	字段名 	数据类型		约束,
	name 		varchar(11) not null ,  --not null非空约束
)
 tablespaces 表空间名 
 	sotrage(  --storage表示存储参数
 	initial 64k   --区段(extent)一次扩展64k
 	minextents 1
 	maxextents unlimited --小区段数为1,最大的区段数不限制。
 	);
 comment on table  用户.表名  is "学生信息表";  --表名注释
 comment on coloumn 用户名.表名.字段名 is "姓名" ;--字段名注释

实例:

实例
-- Create table
create table STUDENT.stuinfo
(
  stuid      varchar2(11) not null,--学号:'S'+班号(7位数)+学生序号(3位数)(1)
  stuname    varchar2(50) not null,--学生姓名
  sex        char(1) not null,--性别
  age        number(2) not null,--年龄
  classno    varchar2(7) not null,--班号:'C'+年级(4位数)+班级序号(2位数)
  stuaddress varchar2(100) default '地址未录入',--地址 (2)
  grade      char(4) not null,--年级
  enroldate  date,--入学时间
  idnumber   varchar2(18) default '身份证未采集' not null--身份证
)
tablespace USERS --(3)
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table 
comment on table STUDENT.stuinfo --(4)
  is '学生信息表';
-- Add comments to the columns 
comment on column STUDENT.stuinfo.stuid -- (5)
  is '学号';
comment on column STUDENT.stuinfo.stuname
  is '学生姓名';
comment on column STUDENT.stuinfo.sex
  is '学生性别';
comment on column STUDENT.stuinfo.age
  is '学生年龄';
comment on column STUDENT.stuinfo.classno
  is '学生班级号';
comment on column STUDENT.stuinfo.stuaddress
  is '学生住址';
comment on column STUDENT.stuinfo.grade
  is '年级';
comment on column STUDENT.stuinfo.enroldate
  is '入学时间';
comment on column STUDENT.stuinfo.idnumber
  is '身份证号';

(1)处: not null 表示学号字段(stuid)不能为空。

(2)处:default 表示字段stuaddress不填时候会默认填入‘地址未录入’值。

(3)处:表示表stuinfo存储的表空间是users,storage表示存储参数:区段(extent)一次扩展64k,最小区段数为1,最大的区段数不限制。

(4)处:comment on table 是给表名进行注释。

(5)处:comment on column 是给表字段进行注释。

约束

NOT NULL:不能为空(只能定义在列级)
UNIQUE:唯一约束,不允许出现多个空值
PRIMARY KEY:主键约束(不允许空值,不能有重复)
FOREIGN KEY:外键约束(只能添加子表已有数据)
CHECK:添加条件
default :默认约束 check(age >=16 and age <=30)

添加约束

1.约束可以在填表时候加

create table STUDENT.stuinfo
(
	age number(4) not null check (age >16)
	......
)

2.直接修改表结构

语法

alter table STUDENT.stuinfo
 add constraint  约束名称 约束(列名);
-- Create/Recreate primary, unique and foreign key constraints 
alter table STUDENT.STUINFO
  add constraint pk_stuinfo_stuid primary key (STUID);
  --把stuid当做主键,主键字段的数据必须是唯一性的(学号是唯一的)
   
-- Create/Recreate check constraints 
alter table STUDENT.STUINFO
  add constraint ch_stuinfo_age
  check (age>0 and age<=50);--给字段年龄age添加约束,学生的年龄只能0-50岁之内的
   
alter table STUDENT.STUINFO
  add constraint ch_stuinfo_sex
  check (sex='1' or sex='2');
   
alter table STUDENT.STUINFO
  add constraint ch_stuinfo_GRADE
  check (grade>='1900' and grade<='2999');

查询数据(select)

select *|列名|表达式 from 用户名.表名 where 条件 order by 列名

实例:

查询学生信息表(stuinfo)中“李四”同学的基本信息:
select t.* from STUDENT.STUINFO t where t.stuname = '李四';

查询“李四”同学的学号、班级、年级和地址:
select t.stuid,t.classno,t.stuaddress,t.grade from STUDENT.STUINFO t where t.stuname = '李四';

查询“李四”同学的学号、班级、年级和地址:
select t.stuid,t.classno,t.stuaddress,t.grade from STUDENT.STUINFO t where t.stuname = '李四';

查询班级“C201801”所有同学信息,按年龄进行升序展示:
select t.*  from STUDENT.STUINFO t where t.classno = 'C201801' ORDER BY T.AGE ASC

备份查询数据命令

create table 表名 as select 语句
create table student.stuinfo_2018 as select * from student.stuinfo ;

插入数据(insert into)

insert into 表名(列名1,列名2,列名3.....)values(值1,值2,值3.....);

1、列名可以省略,当列名不填时,默认的是表中的所有列,列的顺序是按照建表的顺序进行排列的。
2、列名的数量和值的数量要一致,并且值的类型要和列的类型一一对应。
3、当表当中某些字段设置了某些约束的情况下,必须按照字段的约束来进行该值的插入,例如:学生信息表(STUINFO)当中设置有主键(主键字段是STUID),因此该字段必须具有唯一性,不能和原有的数据重复。age、stuname、calassno等字段是必填字段,因此是必须有值的。

实例

向学生信息表(stuinfo)插入一条数据:

insert into STUDENT.STUINFO (STUID, STUNAME, SEX, AGE, CLASSNO, STUADDRESS, GRADE, ENROLDATE, IDNUMBER)
values (‘SC201801005’, ‘龙七’, ‘1’, 26, ‘C201801’, ‘福建省厦门市XXX号’, ‘2018’, to_date(‘01-09-2018’, ‘dd-mm-yyyy’),
‘3503021992XXXXXXXX’);

insert插入一个select的结果集

INSERT INTO 表 SELECT 子句,

insert into student.stuinfo select * from student.stuinfo_2018;

commit 提交,释放锁

数据操纵语言(DML)包括 INSERT(插入)命令、 UPDATE(更新)命令、 DELETE(删除)命令、 SELECT … FOR UPDATE(查询)等。只有提交(commit)后才能持久化到数据库

提交分为两种,显式和隐式,只有提交了才算真正修改了这个数据库或者数据,如果只是使用了INSERT(插入)命令、 UPDATE(更新)命令、 DELETE(删除)命令、 SELECT … FOR UPDATE(查询)等语句修改数据,但是没有提交,此时只有当前操作人才看得见改变的数据,并没有真正修改数据库。或者此时一个rollback就能把修改的恢复回来。

显示提交

直接使用commit 
SQL>COMMIT;

隐式提交

DML 数据操作语言:
insert 将记录插入到数据库
update 修改数据库的记录
delete 删除数据库的记录
当执行DML命令如果没有提交,将不会被其他会话看到。除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动
发出commit命令,使未提交的DML命令提交。

DML 数据操作语言:
insert 将记录插入到数据库
update 修改数据库的记录
delete 删除数据库的记录
当执行DML命令如果没有提交,将不会被其他会话看到。除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动
发出commit命令,使未提交的DML命令提交。

未提交的可以用rollback回滚恢复,

更新(update)

update 表名 set 列名1=值1,列名2=值2,列名3=值3..... where 条件

更新学生“张三”的年龄和身份证信息:

update student.stuinfo t
set t.age = ‘24’, t.idnumber = ‘3503021994XXXXXXXX’
where t.stuname = ‘张三’;
commit;
select * from student.stuinfo t where t.stuname=‘张三’;

利用另外一张表关联更新本表数据

update 表1 set 列名=(select 列名 from 表2 where 表1.列名=表2.列名)
where exists (select 1 from 表2 where 表1.列名=表2.列名)

update student.stuinfo t
set (age, idnumber) =
(select age, idnumber from student.stuinfo_2018 b where b.stuid = t.stuid)
where exists (select 1
from student.stuinfo_2018 b
where b.stuid = t.stuid
and b.stuname = ‘张三’);

删除(delete)

delete from 表名 where 条件
1、当delete from不加where条件时,表示是把表中的数据全部删除。

delete from stuinfo t where t.stuname=‘张三’;

truncate命令

truncate命令也是数据删除命令,他是直接把Oracle表数据一次删除的命令,truncate命令是一个DDL命令,不同于delete是DML命令。

truncate table 表名;
删除学生信息备份表(stuinfo_2018):
truncate table stuinfo_2018;

truncate和delete都能删除表中的数据,他们的区别:

1、TRUNCATE 是 DDL 命令,命令执行完就提交,删除的数据不能恢复; DELETE 命令是 DML 命令,命令执行完需提交后才能生效,删除后的数据可以通过日志文件恢复。
2、如果表中的数据量较大,TRUNCATE的速度比DELETE速度快很多。
3、truncate删除将重新设置表索引的初始大小,而delete不能。
4、delete能够触发表上相关的delete触发器,而truncate则不会触发。
5、delete删除的原理是一次一条从表中删除数据,并将删除操作当做事物记录在数据库的日志当中,以便进行数据回滚。而truncate是一次性进行数据页的删除,因此执行速度快,但是不能回滚。

总结:truncate命令是属于DDL命令,一次性删除表中所有数据,并且数据不能恢复,在实际开发过程当中truncate命令慎用。

猜你喜欢

转载自blog.csdn.net/weixin_43859562/article/details/112530860