Oracle(1)之虚拟机下安装与简单使用

时间:2022-08-22 22:48:40

Oracle介绍与安装

简介

Oracle 数据库系统是美国 ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器 (CLIENT/SERVER) 或 B/S 体系结构的数据库之一。比如 SliverStream 就是基于数据库的一种中间件。Oracle 数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。

体系结构

数据库:database

Oracle 的数据库是数据的物理存储。这就包括(数据文件 ORA 和 DBF、控制文件、联机日志、参数文件)。其实 Oracle 数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看做 Oracle 就只有一个大数据库。

实例:instance

一个 Oracle 实例(Oracle Instance)有一系列的后台进程(Background Processes)和内存结构(Memory Structures) 组成。一个数据库可以有 n 个实例。

数据文件:dbf

数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正的存储是在某一个或多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。

表空间

表空间是 Oracle 对物理数据库上相关数据文件( ORA 或 DBF 文件)的逻辑映射。一个数据库在逻辑上被分为一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间(称之为 system 表空间)。

每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。

用户

用户是在实例下建立的。不同实例中可以建相同名字的用户。

表的数据,是由用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或多个数据文件中。

由于 Oracle 的数据库不是普通的概念,Oracle 是有用户和表空间对数据进行管理和存放的。但是表不是由表空间去查询的,而是由用户去查询。因为不同用户可以在同一个表空间建立同一个名字的表!这里区分就是用户了。

SCOTT 用户和 HR 用户:

Oracle 为了让学习者更好的进行学习,在安装成功后,也创建了初始的用户,其中 SCOTT 与 HR 就是初始的普通用户。这些用户下面都默认存在了表结构,我们重点掌握 SCOTT 用户下的所有表。如下所示:

Oracle(1)之虚拟机下安装与简单使用Oracle(1)之虚拟机下安装与简单使用

一个数据库一般有一个 orcl 实例,也可以有多个实例。

有了数据库实例,就可以创建表空间。

Oracle 数据库是通过表空间来存储物理表的,一个数据库实例可以有 N 个表空间,一个表空间下可以有 N 张表。

要想在表空间下建表,必须先建立用户,让用户关联该表空间,接下来用户就可以在所关联的表空间下建表。

小结:

1、一个用户只能属于一个表空间。

2、同一个数据库用例中,用户名是不能重复的。

3、不同用户中可以创建同名的表。

4、表空间创建后需要创建用户后才能使用,因为任何数据库对象都需要建立在一个数据用户上。

5、连接 dba 权限的用户可以直接访问其他用户的数据库对象,否则需要相关用户授权。

6、访问其他用户的数据库对象是时需要加上对象所属用户的用户名。

Oracle10g安装

下载

32 位 XP 系统镜像下载Oracle 10G 下载

运行XP系统

解压上述系统镜像,如下:

Oracle(1)之虚拟机下安装与简单使用

双击 .vmx 后缀文件即可在 VMware 中打开:

Oracle(1)之虚拟机下安装与简单使用

选中,点击右边框中的‘开启此虚拟机’,此时虚拟机就会运行 xp 系统,如下:

Oracle(1)之虚拟机下安装与简单使用

VMware 安装使用参考

导入Oracle安装包到XP

方式一:VMware tools

如果安装了 VMware tools,则可直接将 Oracle 安装包拖入虚拟机进行导入:

Oracle(1)之虚拟机下安装与简单使用

方式二:共享文件夹

虚拟机关闭状态选中 XP 系统,点击‘编辑虚拟机设置’:

Oracle(1)之虚拟机下安装与简单使用

选中‘选项’栏位,做如下勾选:

Oracle(1)之虚拟机下安装与简单使用

点击‘添加’按钮:

Oracle(1)之虚拟机下安装与简单使用

选中 Oracle 安装包所在目录,确定,再次运行 XP,打开我的电脑:

Oracle(1)之虚拟机下安装与简单使用

进入网络驱动器下的 ‘Shared Folders’:

Oracle(1)之虚拟机下安装与简单使用

即可看到共享目录下的 Oracle 安装包,将其复制到 XP 桌面,解压:

Oracle(1)之虚拟机下安装与简单使用

解压工具下载,同样可以通过共享文件夹方式导入安装。

安装Oracle

进入 Oracle 解压目录:

Oracle(1)之虚拟机下安装与简单使用

点击 ‘setup.exe’ 启动 Oracle 安装程序:

Oracle(1)之虚拟机下安装与简单使用

输入数据库口令,我这里输入‘root’,点击下一步:

Oracle(1)之虚拟机下安装与简单使用

继续下一步:

Oracle(1)之虚拟机下安装与简单使用

点击安装:

Oracle(1)之虚拟机下安装与简单使用

点击‘口令管理’:

Oracle(1)之虚拟机下安装与简单使用

解除用户‘SCOTT’,‘HR’的锁定,设置‘SCOTT’的口令为‘tiger’,‘HR’的口令为‘hr’,确定。

Oracle(1)之虚拟机下安装与简单使用

点击退出会弹出如下页面:

Oracle(1)之虚拟机下安装与简单使用

进入‘C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN’目录下,编辑文件如下:

# listener.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\listener.ora
# Generated by Oracle configuration tools. SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
) LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
# HOST 值修改为当前系统 ip
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.161.130)(PORT = 1521))
)
)

listener.ora

# tnsnames.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools. ORCL =
(DESCRIPTION =
# 修改 HOST 值为Oracle所在主机 ip
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.161.130)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
) EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

tnsnames.ora

按顺序重启下面两个服务:

Oracle(1)之虚拟机下安装与简单使用

至此 Oracle 服务端的安装已经完成。

使用

客户端连接Oracle

instantclient连接Oracle

点击进入官网下载 instantclient 客户端:

Oracle(1)之虚拟机下安装与简单使用

解压到同一目录,命令行下进入该目录,通过 sqlplus 连接:

C:\install\dev\instantclient_11_2>sqlplus scott/tiger@192.168.202.133:/orcl

SQL*Plus: Release 11.2.0.4. Production on Wed Feb  :: 

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

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1. - Production
With the Partitioning, OLAP and Data Mining options SQL>

plsqldeveloper连接Oracle

1、点击下载安装包

2、安装完成后打开安装目录,新建 config 文件夹,放入如下配置文件:

# tnsnames.ora Network Configuration File: C:\oracle\product\10.2.\db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools. ORCL =
(DESCRIPTION =
# 修改 HOST 值为当前系统 ip
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.161.130)(PORT = ))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
) EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

tnsnames.ora

3、将该目录配入环境变量:

Oracle(1)之虚拟机下安装与简单使用

4、打开软件,做如下配置:

Oracle(1)之虚拟机下安装与简单使用

5、重启客户端,以 SCOTT 用户登录:

Oracle(1)之虚拟机下安装与简单使用

6、显示如下界面即登录成功:

Oracle(1)之虚拟机下安装与简单使用

Navicat连接Oracle

1、点击下载Navicat

2、安装完成后打开,作如下配置:

Oracle(1)之虚拟机下安装与简单使用

3、重启Navicat,新建Oracle连接:

Oracle(1)之虚拟机下安装与简单使用

基本查询

SQL简介

结构化查询语言(Structured Query Language)简称 SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存取方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

  • DML(数据库操作语言):其语句包括动词 INSERT、UPDATE 和 DELETE。它们分别用于添加、修改和删除表中的行。
  • DDL(数据库定义语言):其语句包括动词 CREATE 和 DROP。在数据库中创建新表或删除表(CREATE TABLE 和 DROP TABLE);为表加入索引等。DDL 包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
  • DCL(数据库控制语言):它的通过 GRANT 或 REVOKE 语句获得许可,确定单个用户和用户组队数据库对象的访问。某些 RDBMS 可用 GRANT 或 REVOKE 控制对表单个列的访问。
  • DQL(数据库查询语言):它的语句基本结构是由 SELECT 子句、FROM 子句、WHERE 子句组成的查询块。

SELECT语句的语法格式和示例

SELECT *|列名 FROM 表名

Oracle(1)之虚拟机下安装与简单使用

1、查询语法

SELECT 列名 别名,列名 别名,... FROM 表名

Oracle(1)之虚拟机下安装与简单使用

2、别名用法

SELECT DISTINCT *|列名 FROM 表名

Oracle(1)之虚拟机下安装与简单使用

3、去重

--查询每个雇员的年薪
SELECT ENAME 员工名称,SAL*12 年薪 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

4、四则运算

空值

  • 空值是无效的,未指定的,未知的或不可预知的值。
  • 空值不是空格或者 0。

注意:

  • 包含 NULL 的表达式结果都为 NULL,如:
    SELECT ENAME,12*NULL FROM EMP

    Oracle(1)之虚拟机下安装与简单使用

    例:

  • 空值永远不等于空值,如:
    SELECT * FROM EMP WHERE NULL=NULL -- WHERE 结果为假,所以查不到数据

    Oracle(1)之虚拟机下安装与简单使用

    例:

连接符

字符串的连接使用‘||’。

SELECT ('编号是:' || EMPNO || '的员工,姓名是' || ENAME || ',工作是:' || JOB) 连接符使用 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

例:

条件查询和排序

--查询能得到奖金的员工
SELECT * FROM EMP WHERE COMM IS NOT NULL

Oracle(1)之虚拟机下安装与简单使用

--查询未得到奖金的员工
SELECT * FROM EMP WHERE COMM IS NULL

Oracle(1)之虚拟机下安装与简单使用

1、非空和空的限制

--查询工资大于 1500 并且 有奖金的员工
SELECT * FROM EMP WHERE SAL>1500 AND COMM IS NOT NULL

Oracle(1)之虚拟机下安装与简单使用

--查询工资大于 1500 或者 有奖金的员工
SELECT * FROM EMP WHERE SAL>1500 OR COMM IS NOT NULL

Oracle(1)之虚拟机下安装与简单使用

--查询工资不大于 1500 并且 没有奖金的员工
SELECT * FROM EMP WHERE NOT(SAL>1500) AND COMM IS NOT NULL

Oracle(1)之虚拟机下安装与简单使用

2、且(AND)、或(OR)和非(NOT)条件

--例:查询工资在1500-3000的员工
SELECT * FROM EMP WHERE SAL>=1500 AND SAL<=3000
--也可以通过 BETWEEN AND 实现
SELECT * FROM EMP WHERE SAL BETWEEN 1500 AND 3000

Oracle(1)之虚拟机下安装与简单使用

--BETWEEN AND 不仅可以用在数值之间,也可以用在日期之间
--例:查询1981-1-1到1981-12-31号入职的员工
SELECT * FROM EMP WHERE HIREDATE BETWEEN to_date('1/1/1981 00:00:00', 'dd/MM/yyyy hh24:mi:ss') AND to_date('31/12/1981 00:00:00', 'dd/MM/yyyy hh24:mi:ss')

Oracle(1)之虚拟机下安装与简单使用

--例:查询员工编号是 7369、7499、7521 的员工信息
--如果使用之前的做法可以使用 OR 关键字
SELECT * FROM EMP WHERE EMPNO IN (7369,7499,7521)
--实际上,此时制定了查询范围,那么 SQL 可以使用 IN 关键字
-- 语法:WHERE 列名 IN(值1,值2,值3,...)
-- WHERE 列名 NOT IN(值1,值2,值3,...)

Oracle(1)之虚拟机下安装与简单使用

--其中的值不仅可以是数值类型,还可以是字符串
--例:查询员工姓名是 'SMITH'、'ALLEN'、'WARD' 的员工信息
SELECT * FROM EMP WHERE ENAME IN('SMITH','ALLEN','WARD')

Oracle(1)之虚拟机下安装与简单使用

3、范围限制

--模糊查询,即:输入一个关键字,把符合的内容全部查询出来,在 SQL 中使用 LIKE 关键字完成
-- 在 LIKE 中主要使用以下两种通配符:
-- "%":可以匹配任意长度的内容。
-- "_":可以匹配一个长度的内容。
--例:查询出姓名中第二个字符为 'M' 的员工
SELECT * FROM EMP WHERE ENAME LIKE '_M%'

Oracle(1)之虚拟机下安装与简单使用

--例:查询出姓名中包含字符 'M' 的员工
SELECT * FROM EMP WHERE ENAME LIKE '%M%'

Oracle(1)之虚拟机下安装与简单使用

4、模糊查询

--Oracle 中不等号的用法有两种形式 "<>" 和 "!="
--查询员工编号不是 7369 的员工
SELECT * FROM EMP WHERE EMPNO <> 7369
--或
SELECT * FROm EMP WHERE EMPNO != 7369

Oracle(1)之虚拟机下安装与简单使用

5、不等号

--使用 ORDER BY 对结果进行排序
--例:查询员工的工资从低到高
SELECT * FROM EMP ORDER BY SAL

Oracle(1)之虚拟机下安装与简单使用

--如果存在多个排序字段可用 ',' 分隔
SELECT * FROM EMP ORDER BY SAL ASC,HIREDATE DESC

Oracle(1)之虚拟机下安装与简单使用

--注意:ORDER BY 语句要放在 SQL 的最后执行

--排序中的空值问题
--查询员工的奖金从低到高
--NULLS FIRST:将空值放在前面
--NULLS LAST:将空值放在后面
SELECT * FROM EMP ORDER BY COMM NULLS FIRST

Oracle(1)之虚拟机下安装与简单使用

SELECT * FROM EMP ORDER BY COMM NULLS LAST

Oracle(1)之虚拟机下安装与简单使用

6、结果排序

函数

  • 函数可以没有参数,但必须要有返回值。
  • 函数的类型可以分为单行和多行函数。
单行函数
--字符串连接
-- 字符串的连接可以使用 CONCAT 函数也可以使用 '||'
SELECT CONCAT('HELLO ',' ORACLE') STR FROM DUAL
SELECT 'HELLO ' || ' ORACLE' STR FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

--字符串截取
-- 使用 SUBSTR ,第一个参数是源字符串,第二个参数是开始索引,第三个参数是截取长度,开始的索引使用 1 和 0 效果相同
SELECT SUBSTR('HELLO',0,1) STR1,"SUBSTR"('HELLO',1,1) STR2 FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

--获取字符串长度
-- 使用 LENGTH,仅有一个源字符串参数
SELECT LENGTH('HELLO') LENGTH FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

--字符串替换
-- 使用 REPLACE ,第一个参数是源字符串,第二个参数是被替换的字符串,第三个是替换字符串
SELECT REPLACE('HELLO','L','X') STR FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

1、字符函数

--四舍五入
SELECT ROUND(45.926,2) FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

--小数位截断
SELECT TRUNC(45.926,2) FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

--求余
SELECT MOD(9,4) FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

2、数值函数

例:查询员工进入公司的周数
SELECT ENAME 名字,ROUND((SYSDATE-HIREDATE)/7) 周数 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

例:获取两个时间段中的月数
SELECT ENAME 名字,ROUND("MONTHS_BETWEEN"(SYSDATE,HIREDATE)) 月数 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

例:获取几个月后的日期
SELECT ADD_MONTHS(SYSDATE,3) as "3个月后的日期" FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

3、日期函数

--TO_CHAR :转换为字符
-- 转换日期
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:mi:ss') 当前时间 FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

--    转换数值
SELECT TO_CHAR(12) FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

--TO_NUMBER :转换为数字
SELECT TO_NUMBER('') FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

--TO_DATE :将字符转换为日期
SELECT TO_DATE('2019-1-2','yyyy-mm-dd') FROM DUAL

Oracle(1)之虚拟机下安装与简单使用

4、转换函数

--例:查询所有员工的年薪
SELECT ENAME 名字,SAL*12+COMM 年薪 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

--    我们会发现很多员工的年薪是空的,原因是很多员工的奖金为 NULL ,null 和任何数值计算都是 null,这是我们可以使用 nvl 处理。
SELECT ENAME 名字,NVL(COMM,0) 奖金, SAL*12+NVL(COMM,0) 年薪 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

5、空值处理

--例:根据 10 号部门的工资显示税率
-- 使用 DECODE 函数
SELECT
ENAME 名字,
SAL 月薪,
DECODE(
TRUNC(SAL/2000,0),
0,0.00,
1,0.09,
2,0.20,
3,0.30,
4,0.40,
5,0.42,
6,0.44,
0.45
) TAX_RATE
FROM EMP
WHERE DEPTNO=10
-- 使用 CASEWHEN
SELECT
ENAME 名字,
SAL 月薪,
CASE
TRUNC(SAL/2000,0)
WHEN 0 THEN 0.00
WHEN 1 THEN 0.09
WHEN 2 THEN 0.20
WHEN 3 THEN 0.30
WHEN 4 THEN 0.40
WHEN 5 THEN 0.42
WHEN 6 THEN 0.44
ELSE 0.45 END TAX_RATE
FROM EMP
WHERE DEPTNO=10

Oracle(1)之虚拟机下安装与简单使用

6、条件表达式

多行函数

SELECT COUNT(*) 记录数 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

1、统计记录数

--例:查询最低月薪
SELECT MIN(SAL) 月薪 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

2、最小值

--例:查询最高月薪
SELECT MAX(SAL) 月薪 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

3、最大值

--例:查询员工平均月薪
SELECT AVG(SAL) 平均月薪 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

4、平均值

--例:查询所有员工月薪总和
SELECT SUM(SAL) 月薪总和 FROM EMP

Oracle(1)之虚拟机下安装与简单使用

5、求和

--分组查询
--例:查询每个部门的人数
SELECT DEPTNO 部门编号,COUNT(*) 人数 FROM EMP GROUP BY DEPTNO

Oracle(1)之虚拟机下安装与简单使用

--过滤分组数据
--例:查询出部门平均工资大于 2000 的部门
SELECT DEPTNO 部门编号,AVG(SAL) 部门平均工资 FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>2000 --WHERE 和 HAVING 的区别:
-- 最大区别在于:WHERE 后面不能有组函数,如:WHERE AVG(SAL)>2000 是错误的

Oracle(1)之虚拟机下安装与简单使用

6、分组查询

补充

plsql中文乱码解决

1、查看服务端编码:

select userenv('language') from dual;

我实际查到的结果为: 'AMERICAN_AMERICA.ZHS16GBK'

2、执行下面语句查看客户端编码:

select * from V$NLS_PARAMETERS;

查看第一行中 PARAMETER 列中值为 NLS_LANGUAGE 的行对应的 VALUE 项是否与第一步得到的值相同。

如果不是,则需要设置环境变量,否则就会因为 plsql 客户端使用的编码和服务端编码不一致,导致插入中文乱码。

3、设置环境变量:

变量名:NLS_LANG
变量值:第一步查询到的值,我这里是 AMERICAN_AMERICA.ZHS16GBK

4、重启 plsql 客户端,插入数据正常。