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

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 用户下的所有表。如下所示:

 

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

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

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

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

小结:

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

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

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

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

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

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

Oracle10g安装

下载

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

运行XP系统

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

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

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

VMware 安装使用参考

导入Oracle安装包到XP

方式一:VMware tools

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

方式二:共享文件夹

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

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

点击‘添加’按钮:

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

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

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

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

安装Oracle

进入 Oracle 解压目录:

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

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

继续下一步:

点击安装:

点击‘口令管理’:

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

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

进入‘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 服务端的安装已经完成。

使用

客户端连接Oracle

instantclient连接Oracle

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

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

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

SQL*Plus: Release 11.2.0.4.0 Production on Wed Feb 20 22:10:54 2019

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


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 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.0\db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

ORCL =
  (DESCRIPTION =
    # 修改 HOST 值为当前系统 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

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

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

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

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

Navicat连接Oracle

1、点击下载Navicat

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

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

基本查询

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 表名

1、查询语法
SELECT 列名 别名,列名 别名,... FROM 表名

2、别名用法
SELECT DISTINCT *|列名 FROM 表名

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

4、四则运算

空值

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

注意:

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

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

    例:

连接符

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

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

例:

条件查询和排序

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

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

1、非空和空的限制
--查询工资大于 1500 并且 有奖金的员工
SELECT * FROM EMP WHERE SAL>1500 AND COMM IS NOT NULL

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

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

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

--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')

--例:查询员工编号是 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,...)

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

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

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

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

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

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

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

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

SELECT * FROM EMP ORDER BY COMM NULLS LAST

6、结果排序

函数

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

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

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

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

1、字符函数
--四舍五入
SELECT ROUND(45.926,2) FROM DUAL

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

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

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


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


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

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

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

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

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

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

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

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

6、条件表达式

多行函数

SELECT COUNT(*) 记录数 FROM EMP

1、统计记录数
--例:查询最低月薪
SELECT MIN(SAL) 月薪 FROM EMP

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

3、最大值
--例:查询员工平均月薪
SELECT AVG(SAL) 平均月薪 FROM EMP

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

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

--过滤分组数据
--例:查询出部门平均工资大于 2000 的部门
SELECT DEPTNO 部门编号,AVG(SAL) 部门平均工资 FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>2000

--WHERE 和 HAVING 的区别:
--    最大区别在于:WHERE 后面不能有组函数,如:WHERE AVG(SAL)>2000 是错误的

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 客户端,插入数据正常。

posted @ 2019-02-19 20:06  zze  阅读(556)  评论(0编辑  收藏  举报