Oracle数据库
一、Oracle客户端工具
SQL Plus工具
1. 打开
该工具是 Oracle 系统默认安装的自带的一个客户端工具。在 Windows cmd 命令行中输入“sqlplus”命令,就能够启动该工具了。
2. 登录
输入账户:system 和密码即可登录到本地数据库
3. 连接远程数据库
在cmd命令行中输入“sqlplus /nolog ”启动工具;
输入命令:conn 用户名/密码@服务器连接字符串(数据库IP地址)
as
连接身份
*
连接身份达标者用户连接数据库后拥有的权限,有如下三种身份
sysdba:数据库管理员身份。权限:打开(关闭)数据库服务器、备份(恢复)数据库、日志功能、会话限制、数据库管理功能等。
例如:sys用户必须用sysdba才能登录,system用户用普通用户就可以登录。
sysoper:数据库操作员身份。权限:打开(关闭)数据库服务器、备份(恢复)数据库、日志功能、会话限制。
normal:普通用户。权限:操作该用户下的数据对象和数据查询,默认身份是normal用户。
二、Oracle服务
(一)
1、OraleServer+服务器名(ORCL)
该服务是Oracle数据库的基础,只有启动该服务才能正常使用Oracle数据库。
2、OracleOraDb11g_home1TNSlistenter:
在使用第三方客户端连接Oracle数据库时,该服务必须启动,才能连接到远程数据库!
该服务为Oracle客户端提供监听程序的服务,只有启动该服务,本地的客户端程序才能通过监听连接到数据库,和数据库进行交互。
3、Oracle ORCL VSS Wrier Service:
Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(比如磁盘,阵列等)创建高保真的时间点映像,即映射拷贝(shadow copy)。它可以在多卷或者单个卷上创建映射拷贝,同时不会影响到系统的性能。(非必须启动)
4、OracleMTSRecoveryService:
服务端控制。该服务允许数据库充当一个微软事务服务器MTS、COM/COM+对象和分布式环境下的事务的资源管理器。(非必须启动)
5、OracleOraDb11g_home1ClrAgent:
Oracle数据库 .NET扩展服务的一部分。 (非必须启动)
6、OracleJobSchedulerORCL:
Oracle作业调度(定时器)服务,ORCL是Oracle实例标识。(非必须启动)
(二)数据库的启动和关闭
1、启动:conn 用户名/密码@数据库连接字符(IP地址) as 身份
2、关闭:shutdown 数据库名
3、重启:startup open
三、Oracle用户
(一)用户的创建
create
user
student
--用户名
identified
by
"123456"
--密码
default
tablespace USERS
--表空间名
temporary
tablespace
temp
--临时表空间名
profile
DEFAULT
--数据文件(默认数据文件)
account unlock;
-- 账户是否解锁(lock:锁定、unlock解锁)
RESOURCE角色:resouce角色是开发过程中常用的角色。 RESOURCE给用户提供了可以创建自己的对象,包括:表、视图、序列、过程、触发器、索引、包、类型等。
DBA角色:DBA角色是管理数据库管理员该有的角色。它拥有系统的所有权限,和给其他用户授权的权限。SYSTEM用户就具有DBA权限。
*系统权限只能通过DBA用户授权,对象权限有拥有该对象权限的对象授权!(不一定是本身对象)用户不能自己给自己授权!
2、语法:授权
--GRANT 对象权限 on 对象 TO 用户 grant select, insert, update, delete on JSQUSER to STUDENT; --GRANT 系统权限 to 用户 grant select any table to STUDENT; --GRANT 角色 TO 用户 grant connect to STUDENT;--授权connect角色 grant resource to STUDENT;--授予resource角色
3、语法:取消用户权限
-- Revoke 对象权限 on 对象 from 用户 revoke select, insert, update, delete on JSQUSER from STUDENT; -- Revoke 系统权限 from 用户 revoke SELECT ANY TABLE from STUDENT; -- Revoke 角色(role) from 用户 revoke RESOURCE from STUDENT;
4、语法:Oracle用户的其他操作
--修改用户信息 alter user STUDENT identified by ****** --修改密码 account lock;--修改用户处于锁定状态或者解锁状态 (LOCK|UNLOCK )
四、SQL语句介绍
在 Oracle 开发中,客户端把 SQL 语句发送给服务器,服务器对 SQL 语句进行编译、执行,把执行的结果返回给客户端。常用的SQL语句大致可以分为五类:
1、数据定义语言(DDL),包括 CREATE(创建)命令、 ALTER(修改)命令、 DROP(删除)命令等。
2、数据操纵语言(DML),包括 INSERT(插入)命令、 UPDATE(更新)命令、 DELETE(删除)命令、 SELECT … FOR UPDATE(查询)等。
3、数据查询语言(DQL),包括基本查询语句、 Order By 子句、 Group By 子句等。
4、事务控制语言(TCL),包括 COMMIT(提交)命令、 SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。
5、数据控制语言(DCL), GRANT(授权)命令、 REVOKE(撤销)命令。
五、Oracle建表(create table)
列代表着Oracle字段(column),行代表着一行数据(即一条数据记录)。
1、Oracle 字段数据类型
数据类型 |
类型解释 |
varchar2(length) |
字符串类型:存储可变长度的字符串, length:是字符串的最大长度,默认不填的时候是1,最长长度不超过4000 |
char(length) |
字符串类型:存储固定长度的字符串, length:字符串的固定的最大长度,默认是1,最大长度不超过2000 |
number(a, b) |
数值类型:存储数据的类型,可以存整数,也可以存浮点数。 a 代表数值的最大位数:包含小数位和小数点,b 代表小数的位数。 例:number(6, 2), 输入123.12345,实际存入:123.12 |
data |
时间类型:存储的是日期和时间,包括年、月、日、时、分、秒。 例:内置函数 sysdata 获取的就是 data 类型 |
timestamp |
时间类型:存储的不仅是时间和日期,还包括了时区。 例:内置函数 systimestamp 获取的就是 timestamp 类型 |
clob |
大字段类型:存储的是大的文本。 例:非结构化的txt文本,字段大于4000长度的字符串。 |
blob |
二进制类型:存储的是二进制对象 例:图片、视频、声音等转换过来的二进制对象 |
-- 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 是给表字段进行注释。
通过上面crate table命令创建了stuinfo学生信息表后,还可以给表添加相应的约束来保证表数据的准确性。比如:学生的年龄不能存在大龄的岁数,可能是错误数据、性别不能填入不是1(男)、2(女)之外的数据等。
案例2:stuinfo(学生信息表)添加约束
-- 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');
六、Oracle查询(select)
1、select 命令结构
select *|列名|表达式 from 表名 where 条件 order by 列名
例1:查询学生信息表(stuinfo)中“李四”同学的基本信息:
select t.* from STUDENT.STUINFO t where t.stuname = "李四";
例2:查询“李四”同学的学号、班级、年级和地址:
select t.stuid, t.classno, t.stuaddress, t.grade from STUDENT .STUINFO t where t.stuname = "李四";
例3:查询班级“C201801”所有同学信息,按年龄进行升序展示:
select t.* from STUDENT.STUINFO t where t.classno = 'C201801' ORDER BY T.AGE ASC
语法解析:
1、“t”代表stuinfo的别名。
2、 "*" 代表所有字段。
3、表达式可以是函数(列名)、常数、连接词“||”等组成的表达式。
4、where子语句是查询语句的条件。
5、order by :查询结果按某个字段进行排序,默认是升序,desc是降序。
2、备份查询数据
Oracle进行表数据备份时,可以利用create table(建表)的方式对select查询的结果进行快速备份。
备份查询数据的命令结构:
create table 表名 as select 语句
例:备份学生信息表(stuinfo)的数据
create table student.stuinfo_2018 as select * from student.stuinfo; select * from student.stuinfo_2018;
七、Oracle插入(insert into)
1、insert 命令结构:
insert into 表名(列名1,列名2......)value (值1,值2......);
语法解析:
1、列名可以省略,当列名不填时,默认的是表中的所有列,列的顺序是按照建表的顺序进行排列的。
2、列名的数量和值的数量要一致,并且值的类型要和列的类型一一对应。
3、当表当中某些字段设置了某些约束的情况下,必须按照字段的约束来进行该值的插入,例如:学生信息表(STUINFO)当中设置有主键(主键字段是STUID),因此该字段必须具有唯一性,不能和原有的数据重复。age、stuname、calassno等字段是必填字段,因此是必须有值的。
例1:向学生信息表(stuinfo)插入一条数据:
insert into STUDENT.STUINFO(STUID, STUNAME, SEX, AGE, CLASSNO, STUADDRESS, GRADE, ENROLDATE, IDNUNBER) value ('SC201801005', '龙七', '1', 26, 'C201801', '福建省厦门市XXX号', '2018', to_date('01-09-2018', 'dd-mm-yyyy'),
'3503021992XXXXXXXX'); select * from student.stuinfo t where t.stuid='SC201801005';
例2:向学生信息表(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');
2、insert 插入一个 select 的结果集
命令结构
insert into 表 select 子句
例3:把上一章节利用 Oracle 查询(select)语句备份的表 stuinfo_2018 的数据一次插入表stuinfo 当中:
delete from student.stuinfo t where t.stuid in (select b.stuid from student.stuinfo_2018 b ); insert into student.stuinfo select * from student.stuinfo_2018; select * from student.stuinfo;
*数据操纵语言(DML)包括 INSERT(插入)命令、 UPDATE(更新)命令、 DELETE(删除)命令、 SELECT … FOR UPDATE(查询)等。只有提交(commit)后才能持久化到数据。库。
八、更新(update)
1、update 命令结构
update 表名 set 列名1=值1,列名2=值2,列名3=值3..... where 条件
例1:更新学生“张三”的年龄和身份证信息:
update student.stuinfo t set t.age = '24', t.idnumber = '3503021994XXXXXXXX' where t.stuname = '张三'; commit; select * from student.stuinfo t where t.stuname='张三';
2、update 利用另外一张表关联更新本表数据的命令结构如下:
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 = '张三'); select *from student.stuinfo t where t.stuname='张三';
九、删除(delete)
1、delete 命令结构
delete from 表名 where 条件
命令解析:
(1)当 delete from 不加 where 条件时,表示是把表中的数据全部删除。
例1:删除学生信息表(stuinfo)中学生“张三”的数据:
delete from stuinfo t where t.stuname="张三";
2、truncate命令
truncate命令也是数据删除命令,他是直接把Oracle表数据一次删除的命令,truncate命令是一个DDL命令,不同于delete是DML命令。
truncate 命令结构:
truncate table 表名
例1:删除学生信息备份表(stuinfo_2018):
truncate table stuinfo_2018
3、delete 与 truncate 的区别
(1)truncate 是 DDL 命令,命令执行完就提交,删除的数据不能恢复; DELETE 命令是 DML 命令,命令执行完需提交后才能生效,删除后的数据可以通过日志文件恢复。
(2)如果表中的数据量较大,TRUNCATE的速度比DELETE速度快很多。
(3)truncate删除将重新设置表索引的初始大小,而delete不能。
(4)delete能够触发表上相关的delete触发器,而truncate则不会触发。
(5)delete删除的原理是一次一条从表中删除数据,并将删除操作当做事物记录在数据库的日志当中,以便进行数据回滚。而truncate是一次性进行数据页的删除,因此执行速度快,但是不能回滚。
总结:truncate命令是属于DDL命令,一次性删除表中所有数据,并且数据不能恢复,在实际开发过程当中truncate命令慎用。
十、Oracle 运算符
1、算术运算符(+、-、*、/【/获得的结果是浮点数】)
2、关系运算符【常用于where条件语句中】
符号 | 解释 |
= | 等于 |
> | 大于 |
< | 小于 |
<> 或者 != | 不等于 |
>= | 大于等于 |
<= | 小于等于 |
3、逻辑运算符:AND、OR、 NOT
十一、字符串连接符 ||
例:
select '姓名:' || c.stuname || ', 课程:' || b.coursename || ', 成绩:' || a.score || '分。' as sxcj from score a, course b, stuinfo c where a.courseid = b.courseid and a.stuid = c.stuid
结果:
十二、Oracle DISTINCT
Oracle DISTINCT关键字的作用可以对Oracle查询结果进行重复数据的消除。
1、语法
select distinct 列1, lie2, 列3... from 表名;
当关键字DISTINCT后面只有一个列1时,表示的是单个字段查询结果的不重复数据,当后面跟着多个列值时,表示的是多个字段组成的查询结果的所有唯一值,进行的是多个字段的分组消除。