Fork me on GitHub

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解锁)
    
    *通过上面语句,可以创建一个student用户,但是该用户现在还不能登录数据库,因为它没有登录数据库权限,最少他需要一个create session系统权限才能登录数据库。
 
  (二)用户权限
    Oracle数据库的权限分为:
      系统权限create session可以和数据库进行连接的权限;
           create table、create view等具有创建数据库对象的权限。
      对象权限:比如:对表中数据进行增删改查操作,拥有数据库对象权限的用户可以对所拥有的对象进行相应的操作。
 
  (三)数据库角色
    1、oracle数据库角色是若干系统权限的集合,给Oracle用户进行授数据库角色,就是等于赋予该用户若干数据库系统权限。常用的数据库角色如下:
      CONNECT角色:connect角色是Oracle用户的基本角色,connect权限代表着用户可以和Oracle服务器进行连接,建立session(会 话)。

      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

二进制类型:存储的是二进制对象

例:图片、视频、声音等转换过来的二进制对象

 
  2、create table语句
    案例1:创建stuinfo(学生信息表)
-- 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 intoselect 子句

  例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时,表示的是单个字段查询结果的不重复数据,当后面跟着多个列值时,表示的是多个字段组成的查询结果的所有唯一值,进行的是多个字段的分组消除。

posted @ 2019-10-31 21:16  墨小语  阅读(359)  评论(0编辑  收藏  举报