Windows使用Oracle 19c


一、下载

1.1官网下载

前排提醒:官网下载需要挂vpn加速,可以选择镜像下载

进入官网

这里选择Windows-x64版本,即64位版本

进行账户注册与登录

二、安装

2.1解压

在你的电脑里选择一块区域,新建文件夹(注意这里不能含有英文)进行解压

2.2配置

选择setup.exe进行配置

默认选择创建并配置单实例数据库

下一步默认选择桌面类

下一步选择创建新Windows用户,我的选择是oracle+123456

下一步设置Oracle基目录,这里建议额外建立文件夹,设置好后数据库文件位置自动随基目录生成,设置口令,建议和密码一致。同时不创建为容器数据库,容器数据库是自12C出现的新特性,下一步弹出不符合标准弹窗点是

核对安装信息,可以保存为响应文件进行静默安装,点击安装,执行时间约15分钟左右

安装完成

三、查看所安装的数据库信息

3.1打开cmd命令行

输入

sqlplus /nolog

出现如下则安装成功

Microsoft Windows [版本 10.0.18363.959]
(c) 2019 Microsoft Corporation。保留所有权利。

C:\Users\zjlic\Documents>sqlplus

SQL*Plus: Release 19.0.0.0.0 - Production on 星期二 4月 5 21:50:22 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

SQL>

3.2登陆https://localhost:5500/em/login

登录用户是之前创建的,若报不安全则无视风险进入,进入如下界面则安装成功

四、问题与卸载

如果遇到问题可以查看弹出窗口的log文件,如报Oracle Database Configuration Assistant失败,log显示

INFO: [2020-9-20 15:45:46] [FATAL] [DBT-10304] Oracle 主目录用户口令不正确
INFO: [2020-9-20 15:45:46] Skipping line: [FATAL] [DBT-10304] Oracle 主目录用户口令不正确。
INFO: [2020-9-20 15:53:11] Oracle Database Configuration Assistant 失败。

则说明重新安装的oracle和之前安装的oracle冲突了,用户输入的口令和第一次的不一致,解决办法是彻底删除上一次安装的oracle,找到deinstall文件夹并以管理员身份执行deinstall.bat文件进行自动卸载操作,执行过程中输入回车或者yes或者是,不能删除的目录在卸载执行完成后手动删除

若不能完全删除,查看

五、使用

以下学习过程基于njupt CS-DBS课程实验要求编写

5.1以数据库管理员的身份登录

数据库几种登录方式

打开cmd输入

sqlplus

用户名

system

口令(为之前所设)

将出现以下界面即登入成功

Microsoft Windows [版本 10.0.19043.1586]
(c) Microsoft Corporation。保留所有权利。

C:\Users\zjlic\Documents>sqlplus

SQL*Plus: Release 19.0.0.0.0 - Production on 星期三 4月 6 11:24:43 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

请输入用户名:  system
输入口令:
上次成功登录时间: 星期三 4月  06 2022 11:22:21 +08:00

连接到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL>

SQL*Plus是一个交互式操作环境,可在提示符SQL> 下键入SQL语句

注:Oracle数据库有三类用户:一般数据库用户(connect)、具有支配部分数据库资源特权的数据库用户(resource)和具有数据库管理员特权的数据库用户(DBA),只有DBA具有创建用户的权力,system/ORACLE是Oracle默认的DBA帐户之一,scott/tiger是Oracle默认的resource级帐户。

5.2 创建用户并授予其系统权限的方法

创建用户并授予系统权限的工作只能由DBA来做。

相关命令如下:

5.2.1 创建用户

SQL>create user 用户名 identified by 口令;

create user B19030417 identified by b19030417;

注意:口令要以字母开头,SQL语句要以 ‘;’ 结束

5.2.2 授系统权限

SQL>grant DBA to 用户名;

grant dba to B19030417;

或 SQL>grant DBA, resource, connect to 用户名;

注:系统权限有connect, resource,DBA,后者兼有前者。

5.3 以自己的用户身份连接到数据库的方法

SQL>connect 用户名/口令

connect B19030417/b19030417

注意:该用户必须具有connect或更高的系统权限,

connect命令不需要以 ‘;’ 结束

5.4 用SQL的DDL语句图书管理系统创建基表

要求定义列完整性、实体完整性、引用完整性

建立简单的图书管理数据库的三个基表(下划线处为主键斜体处为两个外键):

5.4.1 图书(图书编号、分类号、书名、作者、出版单位、单价)

CREATE TABLE 图书
(图书编号 CHAR(4),
 分类号 CHAR(4) NOT NULL,
 书名 VARCHAR(12),
 作者 VARCHAR(5),
 出版单位 VARCHAR(10),
 单价 DEC(5,2),
 primary key(图书编号));

5.4.2 读者(借书证号、姓名、单位、职称)

create table 读者
(借书证号 char(4) not null,
 姓名 char(5) not null,
 单位 varchar(10),
 职称 varchar(6),
 primary key(借书证号));

5.4.3 借阅(借书证号、图书编号、借阅日期、备注)

CREATE TABLE 借阅
(借书证号 CHAR(4),
 图书编号 CHAR(4),
 借阅日期 DATE NOT NULL,
 备注 VARCHAR(20),
 PRIMARY KEY(借书证号,图书编号),
 FOREIGN KEY(借书证号) REFERENCES 读者(借书证号),
 FOREIGN KEY(图书编号) REFERENCES 图书(图书编号));

5.5 为基表“读者”补充定义:职称只能取初级、中级、高级之一

ALTER TABLE 读者 ADD CHECK (职称 IN('初级','中级','高级'));

5.6 用SQL的DML语句向上述基表中增加、修改和删除数据

5.6.1 向三个基表中插入数据

5.6.1.1 插入图书表中数据
insert into 图书
values('0001','TP31','计算机基础','WANG','高等教育', 17.00);

这里在插入时会报错,插入的字段超过了设定的大小

这里对字段长度进行修改,注意,这里使用以下命令会报错

ALTER TABLE 图书 ALTER COLUMN 书名 VARCHAR(30);

询问老师后,解释是oracle本身不支持ALTER COLUMN命令,正确命令是

ALTER TABLE 图书 MODIFY 书名 VARCHAR(30);
ALTER TABLE 图书 MODIFY 作者 VARCHAR(10);
ALTER TABLE 图书 MODIFY 出版单位 VARCHAR(30);

这里可以查看一下表的状态

describe 图书

修改成功

接着重新插入即可

5.6.1.2 插入读者表中数据

同样先修改字段长度再插入

ALTER TABLE 读者 MODIFY 姓名 CHAR(10);
ALTER TABLE 读者 MODIFY 单位 VARCHAR(30);
insert into 读者
values('T201','LIXIN','计算机系','中级');

注意这里读者表后没有接字段名称,系统会按次序进行赋值,那在下面values处就应该插入所有字段数据,空的需要用NULL表示

5.6.1.3 插入借阅表中数据
insert into 借阅(借书证号,图书编号,借阅日期)
values('T201','0001',to_date('2022-04-10','yyyy-mm-dd'));

5.6.2 数据的修改和删除

5.6.2.1 为编号为0002的图书填上作者和出版单位
update 图书
set 作者='ZHANG',出版单位='高等教育'
where 图书编号='0002';
5.6.2.2 将所有图书单价上调5%
update 图书
set 单价=单价 * 1.05;
5.6.2.3 将书名包含‘计算机’的书分类号改为’TP38’
update 图书 set 分类号='TP38'
where 书名 like '%计算机%';
5.6.2.4 删除借书证号以S开头的所有读者信息和借阅信息
delete from 借阅
where 借书证号 like 'S%';
delete from 读者
where 借书证号 like 'S%';

5.7 用SQL的QL语句完成查询

5.7.1 列出图书馆中所有藏书的书名及出版单位

select 书名,出版单位
from 图书;

5.7.2 查询工厂所有借阅了图书的读者姓名和职称

使用带有in谓词的嵌套子查询(这里采用DISTINCT目的是消除取值重复的行,对应书本P.92)

select distinct 姓名,职称
from 读者 
where 借书证号 in(select 借书证号
              from 借阅) AND 单位='工厂';

或使用等值连接查询(对应书本P.99)

select 姓名,职称 
FROM 读者,借阅 
where 读者.借书证号=借阅.借书证号 and 单位='工厂';

未选定行表示查询无结果

5.7.3 查询藏书中比高等教育出版社所有图书单价更高的书籍

select  * from 图书
where 单价>ALL(select 单价
             from 图书
             where 出版单位='高等教育');

5.7.4 查询各出版社图书的最高价、最低价和平均价格

这里在查询中使用了聚集函数,同时GROUP BY子句表示按出版单位进行分组

select 出版单位,MAX(单价),MIN(单价),AVG(单价)
from 图书 GROUP BY 出版单位;

5.7.5 列出当前至少借阅了2本图书的读者及所在单位

由于WHERE子句中是不能用聚集函数作为条件表达式的,所以采用HAVING子句

select 姓名,单位 from 读者
where 借书证号 in (select 借书证号
               from 借阅
               group by 借书证号
               having count(*)>=2);

5.8 用SQL的DDL语句创建视图、索引

5.8.1 建立各单位当前借阅图书情况的简单统计视图,视图中包括单位名称,借书人数和借阅人次

create view 统计(单位,人数,人次)
as select 单位,count(distinct 读者.借书证号),
count(读者.借书证号)
from 读者,借阅  
where 读者.借书证号=借阅.借书证号 group by 单位;

5.8.2 对该视图进行查询

select * from 统计;

5.8.3 按出版社为图书表建立一个索引

索引建立在该表的出版单位这一列上,排序次序是降序

create index 图书表 on 图书(出版单位 desc);

展示索引

MySQL使用如下命令

SHOW INDEX FROM 图书;

Oracle使用如下命令

select * from user_indexes where table_name = '图书';

*5.9 以自己的用户登录数据库,建立员工表,其结构同scott用户的员工表emp(补充)

Oracle公司第一个程序员叫scott,他养的猫叫tiger

装好库之后默认是锁定的,需要解锁才能使用

首先切换到system用户下

connect system/123456

导入scott.sql脚本(可以在oracle的安装目录下查找rdbms下的admin文件夹),例如我本机的路径,导入就可以写成

@E:\Application\Oracle19c\rdbms\admin\scott.sql

其次解锁用户

alter user scott account unlock;

修改scott密码为tiger

alter user scott  identified by tiger; 

再用scott用户登陆

Connect scott/tiger

查找emp表

select * from emp;

在Oracle19c中下应该是有emp表的,这里应该是链接失败了,笔者在另一台电脑成功查找出了emp表,但这里我们选择自己创建

在scott用户下创建

Connect scott/tiger
--建立表 和删除表;
create table emp
(
  empno    INT(4) not null,
  ename    VARCHAR(10),
  job      VARCHAR(9),
  mgr      INT(4),
  hiredate DATE,
  sal      decimal(7,2),
  comm     decimal(7,2),
  deptno   INT(2)
) engine=InnoDB charset=utf8;

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902,'1980-12-17', 800, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-06-13', 3000, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-06-13', 1100, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

再次查询emp表此时可以成功查询

最后再以自己的用户登录数据库,建立员工表,其结构同scott用户的员工表emp

Grant all privileges on emp to B19030417;
Connect B19030417/b19030417
create table 员工表 as select * from scott.emp;

自此,对SQL语言的初探索到此结束


文章作者: Alex Lee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex Lee !
评论
  目录