Oracle数据库入门指南 – wiki基地


Oracle数据库入门指南:从零开始,掌握关系型数据库巨头

欢迎来到Oracle数据库的世界!如果你正在寻找一个强大、稳定、功能丰富的数据库管理系统(DBMS)的入门路径,那么Oracle无疑是一个极佳的选择。作为企业级应用中最广泛使用的数据库之一,掌握Oracle技能将为你打开广阔的职业机会。

这篇指南将带你从零开始,逐步深入Oracle数据库的核心概念、安装、连接以及最基本的SQL操作。我们力求详细,涵盖入门者需要了解的关键点,助你迈出坚实的第一步。

第一章:认识Oracle数据库及其核心概念

1.1 什么是数据库?什么是关系型数据库?

在深入Oracle之前,我们先要理解数据库的基本概念。

数据库 (Database):可以理解为一个有组织的、可存储、可管理、可检索的数据集合。它就像一个巨大的电子文件柜,但比文件柜更智能,能让你高效地查找、更新和管理数据。

数据库管理系统 (DBMS):是用于创建、管理和使用数据库的软件。它提供了一个接口,让你通过特定的语言(如SQL)与数据库交互,而无需关心数据存储在磁盘上的物理细节。常见的DBMS有Oracle, MySQL, SQL Server, PostgreSQL等。

关系型数据库 (RDBMS – Relational Database Management System):是基于关系模型的数据库。关系模型由E.F. Codd博士提出,其核心思想是使用二维的“表”(Table)来组织数据。表由行(Row,也称为记录或元组)和列(Column,也称为字段或属性)组成。不同的表可以通过共同的列建立关系,从而表示数据之间的复杂联系。SQL(Structured Query Language)是操作关系型数据库的标准语言。

1.2 Oracle数据库的地位与特点

Oracle数据库是Oracle公司开发的一款高度成熟的企业级关系型数据库管理系统。它以其卓越的性能、稳定性、可伸缩性、安全性以及丰富的功能集而闻名于世。Oracle数据库在金融、电信、政府、航空等对数据可靠性和处理能力要求极高的行业中占据主导地位。

Oracle数据库的主要特点:

  • 高性能 (High Performance):通过各种优化技术(如查询优化器、缓存管理、并行处理等)提供快速的数据访问和处理能力。
  • 高可用性 (High Availability):提供多种技术(如RAC – Real Application Clusters、Data Guard)确保数据库在硬件故障或灾难发生时仍能持续对外提供服务。
  • 可伸缩性 (Scalability):能够随着数据量和用户并发数的增长而平滑扩展,支持从小型应用到超大型数据仓库的需求。
  • 安全性 (Security):提供完善的身份验证、权限控制、审计等机制,保护数据不被未经授权的访问和篡改。
  • 可移植性 (Portability):支持多种操作系统平台(Unix, Linux, Windows等)。
  • 分布式特性 (Distributed Capabilities):支持跨多个物理地点的数据库进行协作。
  • 丰富的开发工具和接口 (Rich Development Tools & Interfaces):提供PL/SQL(Oracle的过程化扩展语言)、Java、.NET等多种开发接口和工具,便于应用开发。

1.3 Oracle数据库的体系结构(简化版)

理解Oracle的体系结构对于入门非常重要。Oracle数据库的体系结构可以分为数据库 (Database)数据库实例 (Database Instance) 两大部分。

  • 数据库 (Database):指的是存储在磁盘上的物理文件集合。这些文件主要包括:
    • 数据文件 (Data Files):存储实际的用户数据和元数据。
    • 控制文件 (Control Files):包含维护数据库一致性所需的关键信息,如数据文件和日志文件的位置、数据库的检查点信息等。
    • 联机重做日志文件 (Online Redo Log Files):记录数据库的所有更改。这些日志用于恢复数据库,保证事务的持久性。
  • 数据库实例 (Database Instance):是指在服务器内存中运行的一组进程和共享内存区域(SGA – System Global Area)。当你启动数据库时,其实是启动了一个数据库实例。这个实例负责管理和访问磁盘上的数据库文件。
    • 共享内存区域 (SGA):是数据库实例的核心内存结构,由多个内存池组成,供所有连接到实例的用户进程共享。重要的SGA组件包括:
      • 数据库缓冲区缓存 (Database Buffer Cache):缓存从数据文件中读取的数据块,减少磁盘I/O。
      • 共享池 (Shared Pool):缓存SQL语句、数据字典信息、存储过程等,提高SQL执行效率。
      • 重做日志缓冲区 (Redo Log Buffer):缓存生成的重做日志信息,然后由LGWR进程写入联机重做日志文件。
    • 后台进程 (Background Processes):是数据库实例启动时启动的一组进程,负责管理数据库的各个方面。重要的后台进程包括:
      • DBWn (Database Writer):负责将数据库缓冲区缓存中的脏数据块写入数据文件。
      • LGWR (Log Writer):负责将重做日志缓冲区中的内容写入联机重做日志文件。
      • SMON (System Monitor):负责数据库的实例恢复(如系统崩溃后的恢复)。
      • PMON (Process Monitor):负责用户进程失败后的清理工作。
      • CKPT (Checkpoint):负责通知DBWn写入数据块,更新控制文件和数据文件头,标记检查点位置。

简单来说: 数据库是静态的物理文件,存储数据;数据库实例是动态的内存和进程,管理和访问这些文件。一个数据库可以由一个或多个实例来访问(如RAC环境),但对于初学者来说,通常是一个数据库对应一个实例。

1.4 Schema(模式)

Schema在Oracle中是一个非常重要的概念。它不是一个独立的物理实体,而是数据库中属于特定用户的所有数据库对象的集合。当你创建一个用户时,Oracle会为这个用户自动创建一个同名的Schema。这个Schema包含了该用户创建的所有表、视图、索引、存储过程等对象。

理解Schema有助于管理权限和组织数据库对象。你可以通过指定 schema_name.object_name 来访问其他用户Schema下的对象(如果你有相应的权限)。

第二章:安装与连接Oracle数据库

对于初学者,最容易上手的方式是使用Oracle Database Express Edition (XE)Oracle Cloud Free Tier。完整版的Oracle数据库安装和配置相对复杂。

2.1 获取Oracle数据库

  • Oracle Database XE: 这是Oracle提供的免费版本,功能相对精简,但足以满足学习和开发需求。它有版本限制(如11g XE、18c XE、21c XE),通常有CPU、内存和存储空间的限制。访问Oracle官网下载页面搜索”Database Express Edition”。
  • Oracle Cloud Free Tier: Oracle云提供了永久免费的服务层级,包括两个Always Free的数据库实例。这是体验最新版本Oracle数据库(如自治数据库Autonomous Database)及其云服务的好方法。访问Oracle Cloud官网注册。
  • Docker镜像: 如果你熟悉Docker,Oracle也提供了官方数据库镜像,可以非常方便地快速启动一个数据库实例进行测试。

推荐: 对于本地学习,建议优先选择Oracle Database XE。安装相对简单,资源占用可控。

2.2 安装过程概述 (以XE版为例)

具体的安装步骤会因版本和操作系统而异,但大体流程如下:

  1. 下载安装包: 从Oracle官网下载对应操作系统的XE安装包。
  2. 解压/挂载: 如果是zip包,解压;如果是ISO或dmg,挂载。
  3. 运行安装程序: 双击运行安装文件(如setup.exe)。
  4. 同意许可协议: 阅读并同意Oracle的许可条款。
  5. 选择安装位置: 选择数据库文件的存放路径。确保有足够的磁盘空间。
  6. 设置数据库密码: 设置SYSSYSTEM等管理用户的密码。请牢记这些密码! 特别是SYSTEM用户,它是你初期管理数据库的关键。
  7. 确认安装信息: 检查安装路径、端口号(通常是1521用于监听器,5500/5560用于管理界面)等信息。
  8. 开始安装: 等待安装程序复制文件、配置数据库实例、创建服务等。
  9. 完成安装: 安装成功后,会提示数据库已准备就绪。记下提供给你的连接信息(主机名、端口、SID/Service Name)。

注意: 详细的安装步骤请参考对应版本Oracle Database XE的官方安装文档。

2.3 连接到Oracle数据库的工具

安装好数据库后,你需要客户端工具来连接和操作它。

  • SQL*Plus: 这是Oracle自带的命令行工具,历史悠久,功能强大,适合执行脚本和管理任务,但对于初学者来说界面不太友好。
  • SQL Developer: Oracle官方提供的免费图形化工具(GUI)。功能全面,易于使用,强烈推荐初学者使用。
  • SQL*Loader: 用于批量加载数据到数据库表的命令行工具。
  • Data Pump (expdp/impdp): 用于数据库导出/导入的命令行工具,用于数据迁移和备份恢复。
  • 第三方工具: 如Toad, PL/SQL Developer等,通常是商业软件,功能更强大,但对于入门学习并非必需。

推荐: 下载并安装 SQL Developer。它是跨平台的(Java编写),功能强大且免费。

2.4 使用SQL Developer连接数据库

  1. 下载并安装SQL Developer: 从Oracle官网下载并解压即可运行,无需复杂安装。确保你的电脑安装了Java Development Kit (JDK)。
  2. 打开SQL Developer: 运行sqldeveloper.exe (Windows) 或 sqldeveloper.sh (Linux/macOS)。
  3. 创建新的数据库连接:
    • 在左侧的“Connections”面板,右键点击“Connections”,选择“New Connection…”。
    • 填写连接信息:
      • Connection Name: 给你的连接起一个名字,方便识别(如 MyOracleXE)。
      • Username: 输入数据库用户(例如 SYSTEM)。
      • Password: 输入该用户的密码(安装时设置的)。
      • Connection Type: 通常选择 Basic
      • Role: 通常保持 default 或选择 SYSDBA 如果以SYS用户连接(但通常建议用SYSTEM学习)。
      • Hostname: 数据库服务器的主机名或IP地址。如果是本机安装的XE,通常是 localhost127.0.0.1
      • Port: 数据库监听器的端口,XE默认通常是 1521
      • Service Name: Oracle 10g及以后版本推荐使用Service Name。XE的默认Service Name通常是 XE。如果是较老的版本或使用SID,则填写 SID(XE的默认SID通常也是 XE)。
    • 测试连接: 点击“Test”按钮。如果连接成功,状态会显示“Success”。
    • 保存连接: 点击“Save”按钮保存连接配置。
    • 连接: 点击“Connect”按钮即可打开一个工作表(Worksheet),你可以在这里输入并执行SQL命令。

第三章:SQL基础入门——与Oracle交互的语言

SQL是与关系型数据库交互的标准语言。无论你使用Oracle、MySQL还是SQL Server,大部分基础SQL语法是通用的。Oracle在标准SQL基础上有一些自己的扩展(如PL/SQL)。

本章将介绍最常用的SQL命令,让你能够创建表、插入数据、查询数据、更新数据和删除数据。

3.1 SQL语句的类型

SQL语句大致可以分为几类:

  • DDL (Data Definition Language):数据定义语言,用于定义数据库对象(表、视图、索引等)的结构。主要命令有 CREATE, ALTER, DROP, TRUNCATE, RENAME
  • DML (Data Manipulation Language):数据操作语言,用于操作表中的数据。主要命令有 INSERT, SELECT, UPDATE, DELETE, MERGE
  • DCL (Data Control Language):数据控制语言,用于控制用户对数据库对象的访问权限。主要命令有 GRANT, REVOKE
  • TCL (Transaction Control Language):事务控制语言,用于管理数据库事务。主要命令有 COMMIT, ROLLBACK, SAVEPOINT

作为初学者,我们将重点学习DDL和DML。

3.2 创建表 (CREATE TABLE)

表是存储数据的基本单元。在使用SQL Developer连接到数据库后,你可以在工作表中输入以下DDL语句来创建一个简单的表。

假设我们要创建一个存储员工信息的表 employees

“`sql
— 删除同名表(如果存在),方便重复创建
DROP TABLE employees;

— 创建 employees 表
CREATE TABLE employees (
employee_id NUMBER(6), — 员工ID,数字类型,最多6位
first_name VARCHAR2(20), — 名,变长字符串,最多20字节
last_name VARCHAR2(25) CONSTRAINT emp_last_name_nn NOT NULL, — 姓,变长字符串,最多25字节,非空约束
email VARCHAR2(25) CONSTRAINT emp_email_uk UNIQUE, — 邮箱,变长字符串,最多25字节,唯一约束
phone_number VARCHAR2(20), — 电话号码,变长字符串,最多20字节
hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL, — 入职日期,日期类型,非空约束
job_id VARCHAR2(10) CONSTRAINT emp_job_nn NOT NULL, — 职位ID,变长字符串,非空约束
salary NUMBER(8, 2), — 薪水,数字类型,总共8位,小数点后2位
commission_pct NUMBER(2, 2), — 奖金比例,数字类型,总共2位,小数点后2位
manager_id NUMBER(6), — 经理ID,数字类型
department_id NUMBER(4), — 部门ID,数字类型

-- 定义主键约束:employee_id 列是主键,唯一标识每一行
CONSTRAINT emp_employee_id_pk PRIMARY KEY (employee_id)

);

— 可以在SQL Developer中选中上面的语句,点击工具栏的”Run Statement”(绿色三角形)或按F5执行。
— 执行成功后,你应该能在左侧Schema浏览器中看到新创建的 employees 表。
“`

解释:

  • CREATE TABLE table_name (...):创建名为 table_name 的表。
  • column_name data_type [constraint]:定义表的列。
    • column_name:列的名称。
    • data_type:列存储的数据类型(如 NUMBER, VARCHAR2, DATE)。
    • constraint:可选的约束条件,用于保证数据的完整性和一致性。
  • 常用数据类型:
    • NUMBER(p, s): 数字类型。p 是总位数(精度),s 是小数点后位数(刻度)。NUMBER 不指定精度和刻度时可以存储任意大小的数字。
    • VARCHAR2(size): 变长字符串,size 是最大字节数。
    • CHAR(size): 定长字符串,size 是字符数。不足时末尾用空格填充。
    • DATE: 存储日期和时间信息。
    • TIMESTAMP: 存储更精确的时间信息(包含毫秒/纳秒)。
    • CLOB: 存储大型字符数据(如文章)。
    • BLOB: 存储大型二进制数据(如图片、文件)。
  • 常用约束:
    • NOT NULL: 该列的值不能为NULL。
    • UNIQUE: 该列的值在表中必须是唯一的。
    • PRIMARY KEY: 主键,用于唯一标识表中的每一行。一个表只能有一个主键,主键列的值必须唯一且非空。
    • FOREIGN KEY: 外键,用于建立表与表之间的关系。外键列的值必须匹配另一个表(主表)中主键列的值,或者为NULL。这维护了参照完整性。

3.3 插入数据 (INSERT)

向表中添加新的行(记录)。

“`sql
— 插入一条完整的记录
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id)
VALUES (100, ‘Steven’, ‘King’, ‘SKING’, ‘515.123.4567’, TO_DATE(’17-JUN-2003′, ‘DD-MON-YYYY’), ‘AD_PRES’, 24000, NULL, NULL, 90);

— 插入另一条记录,可以不指定列名列表(但必须按照表定义的顺序提供所有列的值)
INSERT INTO employees
VALUES (101, ‘Neena’, ‘Kochhar’, ‘NKOCHHAR’, ‘515.123.4568’, TO_DATE(’21-SEP-2005′, ‘DD-MON-YYYY’), ‘AD_VP’, 17000, NULL, 100, 90);

— 只插入部分列的值(必须指定列名列表)
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id, salary)
VALUES (102, ‘Lex’, ‘De Haan’, ‘LDEHAAN’, TO_DATE(’13-JAN-2001′, ‘DD-MON-YYYY’), ‘AD_VP’, 17000);

— 使用 & 符号提示输入值 (SQL*Plus或SQL Developer的脚本模式下)
— INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id, salary)
— VALUES (&employee_id, ‘&first_name’, ‘&last_name’, ‘&email’, TO_DATE(‘&hire_date’, ‘DD-MON-YYYY’), ‘&job_id’, &salary);

— 执行INSERT、UPDATE、DELETE等DML操作后,数据更改默认不会立即永久保存到数据库文件,
— 需要使用COMMIT命令提交事务,或者使用ROLLBACK命令撤销更改。
— 学习阶段,每次操作后可以习惯性地COMMIT。
COMMIT;

— 插入失败的例子(违反PRIMARY KEY约束,ID 100已存在)
— INSERT INTO employees (employee_id, last_name, hire_date, job_id)
— VALUES (100, ‘Smith’, TO_DATE(’01-JAN-2023′, ‘DD-MON-YYYY’), ‘IT_PROG’); — 会报错

— 插入失败的例子(违反NOT NULL约束,last_name不能为空)
— INSERT INTO employees (employee_id, first_name, hire_date, job_id)
— VALUES (103, ‘John’, TO_DATE(’01-JAN-2023′, ‘DD-MON-YYYY’), ‘IT_PROG’); — 会报错

— 插入失败的例子(违反UNIQUE约束,email SKING已存在)
— INSERT INTO employees (employee_id, last_name, email, hire_date, job_id)
— VALUES (104, ‘Doe’, ‘SKING’, TO_DATE(’01-JAN-2023′, ‘DD-MON-YYYY’), ‘IT_PROG’); — 会报错
“`

解释:

  • INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...):向指定列插入对应的值。
  • INSERT INTO table_name VALUES (value1, value2, ...):向所有列插入值,值的顺序必须与表定义的列顺序一致。
  • TO_DATE(string, format):Oracle函数,将字符串转换为DATE类型。'DD-MON-YYYY' 是日期格式模板。

3.4 查询数据 (SELECT)

查询是数据库操作中最频繁、最重要的一项。SELECT 语句用于从一个或多个表中检索数据。

“`sql
— 查询表中所有列和所有行
SELECT * FROM employees;

— 查询指定列的所有行
SELECT employee_id, first_name, last_name, salary FROM employees;

— 查询时使用列的别名
SELECT employee_id AS “员工编号”, first_name || ‘ ‘ || last_name AS “全名”, salary “月薪”
FROM employees; — 使用双引号定义包含空格的别名,或者直接使用不包含空格的别名(不推荐包含中文)

— 查询时进行简单计算
SELECT employee_id, salary, salary * 12 AS “年薪”
FROM employees;

— 查询不重复的值 (DISTINCT)
— 假设我们有一些重复的job_id,使用DISTINCT可以只显示一次
SELECT DISTINCT job_id FROM employees;

— 查询满足特定条件的行 (WHERE)
— 查询部门ID为90的所有员工
SELECT * FROM employees WHERE department_id = 90;

— 查询薪水高于10000的员工
SELECT first_name, last_name, salary FROM employees WHERE salary > 10000;

— 结合多个条件 (AND, OR, NOT)
— 查询部门ID为90且薪水高于20000的员工
SELECT * FROM employees WHERE department_id = 90 AND salary > 20000;

— 查询职位是’AD_PRES’或’AD_VP’的员工
SELECT * FROM employees WHERE job_id = ‘AD_PRES’ OR job_id = ‘AD_VP’;

— 使用IN操作符简化OR条件
SELECT * FROM employees WHERE job_id IN (‘AD_PRES’, ‘AD_VP’);

— 查询不是部门90的员工
SELECT * FROM employees WHERE NOT department_id = 90;
— 或者使用 <> 或 !=
SELECT * FROM employees WHERE department_id <> 90;

— 查询某个范围内的值 (BETWEEN)
— 查询薪水在10000到15000之间的员工 (包含边界)
SELECT * FROM employees WHERE salary BETWEEN 10000 AND 15000;

— 模式匹配 (LIKE)
— 查询姓氏以’K’开头的员工 (‘%’代表任意长度的字符,’_’代表一个字符)
SELECT * FROM employees WHERE last_name LIKE ‘K%’;
— 查询姓氏第二个字母是’o’的员工
SELECT * FROM employees WHERE last_name LIKE ‘_o%’;
— 查询姓氏包含’ch’的员工
SELECT * FROM employees WHERE last_name LIKE ‘%ch%’;

— 检查是否为NULL (IS NULL, IS NOT NULL)
— 查询没有奖金提成的员工
SELECT * FROM employees WHERE commission_pct IS NULL;
— 查询有奖金提成的员工
SELECT * FROM employees WHERE commission_pct IS NOT NULL;

— 对查询结果排序 (ORDER BY)
— 按薪水从低到高排序 (ASC是升序,默认)
SELECT first_name, last_name, salary FROM employees ORDER BY salary ASC;
— 按入职日期从晚到早排序 (DESC是降序)
SELECT first_name, last_name, hire_date FROM employees ORDER BY hire_date DESC;
— 按多个列排序:先按部门ID升序,再按薪水降序
SELECT department_id, first_name, last_name, salary
FROM employees
ORDER BY department_id ASC, salary DESC;

— 限制返回的行数(Oracle特有,12c及以上版本推荐用 FETCH FIRST/NEXT)
— 查询薪水最高的前5名员工
SELECT first_name, last_name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS ONLY; — 12c及以上版本
— 11g及以前版本常用ROWNUM伪列
— SELECT * FROM (SELECT first_name, last_name, salary FROM employees ORDER BY salary DESC) WHERE ROWNUM <= 5;

— 聚合函数 (COUNT, SUM, AVG, MIN, MAX)
— 计算员工总数
SELECT COUNT(*) FROM employees;
— 计算所有员工的总薪水
SELECT SUM(salary) FROM employees;
— 计算所有员工的平均薪水
SELECT AVG(salary) FROM employees;
— 查询最高薪水
SELECT MAX(salary) FROM employees;
— 查询最低薪水
SELECT MIN(salary) FROM employees;

— 分组数据 (GROUP BY)
— 按职位统计员工人数
SELECT job_id, COUNT(*) FROM employees GROUP BY job_id;
— 按部门计算平均薪水
SELECT department_id, AVG(salary)
FROM employees
WHERE department_id IS NOT NULL — 排除部门ID为NULL的员工
GROUP BY department_id
ORDER BY department_id;

— 分组后过滤 (HAVING)
— 找出员工人数大于等于3的部门
SELECT department_id, COUNT()
FROM employees
GROUP BY department_id
HAVING COUNT(
) >= 3;

— 结合WHERE, GROUP BY, HAVING, ORDER BY
— 找出平均薪水高于10000,且员工总数大于等于2的部门,并按平均薪水降序排列
SELECT department_id, AVG(salary) AS “平均薪水”, COUNT() AS “员工人数”
FROM employees
WHERE department_id IS NOT NULL AND salary IS NOT NULL — 可选:排除NULL值影响计算
GROUP BY department_id
HAVING AVG(salary) > 10000 AND COUNT(
) >= 2
ORDER BY AVG(salary) DESC; — 也可以使用别名 ORDER BY “平均薪水” DESC;

— 简单表连接 (JOIN)
— 假设我们还有一个 departments 表 (department_id, department_name)
— CREATE TABLE departments (department_id NUMBER(4) PRIMARY KEY, department_name VARCHAR2(30) NOT NULL);
— INSERT INTO departments VALUES (90, ‘Executive’); COMMIT;
— 查询员工及其所在部门的名称 (内连接 – INNER JOIN)
— 找出 employees 和 departments 表中 department_id 匹配的行
SELECT e.first_name, e.last_name, d.department_name
FROM employees e — 给 employees 表起别名 e
INNER JOIN departments d ON e.department_id = d.department_id; — 给 departments 表起别名 d,指定连接条件

— 左外连接 (LEFT OUTER JOIN)
— 查询所有员工,即使他们没有对应的部门
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.department_id;

— 右外连接 (RIGHT OUTER JOIN)
— 查询所有部门,即使部门中没有员工
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON e.department_id = d.department_id;

— 全外连接 (FULL OUTER JOIN)
— 查询所有员工和所有部门,无论它们是否匹配
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.department_id;

— 自连接 (Self Join)
— 查询员工及其经理的名字 (employees 表中的 manager_id 关联到 employee_id)
SELECT e.first_name AS “员工名”, m.first_name AS “经理名”
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id; — 员工表的manager_id连接到经理表的employee_id
“`

解释:

  • SELECT column1, column2, ... FROM table_name:选择要显示的列。* 表示所有列。
  • WHERE condition:过滤行,只返回满足条件的行。
  • ORDER BY column [ASC|DESC]:对结果集进行排序。
  • GROUP BY column:将具有相同值的行分组。
  • HAVING condition:在 GROUP BY 后对分组进行过滤。
  • JOIN:连接多个表,根据它们之间的关系组合数据。

3.5 更新数据 (UPDATE)

修改表中现有记录的值。

“`sql
— 将员工ID为100的薪水提高10%
UPDATE employees
SET salary = salary * 1.10
WHERE employee_id = 100;

— 将部门ID为90的所有员工的 job_id 改为 ‘AD_ASST’,并设置奖金比例为0.10
UPDATE employees
SET job_id = ‘AD_ASST’, commission_pct = 0.10
WHERE department_id = 90;

— 更新后,不要忘记COMMIT提交更改
COMMIT;

— 撤销最近一次未提交的更改
— ROLLBACK;
“`

解释:

  • UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition:更新满足 WHERE 条件的行的指定列的值。
  • 如果省略 WHERE 子句,将会更新表中的所有行(请务必小心!)。

3.6 删除数据 (DELETE)

从表中删除记录。

“`sql
— 删除员工ID为102的记录
DELETE FROM employees
WHERE employee_id = 102;

— 删除部门ID为90的所有员工记录
DELETE FROM employees
WHERE department_id = 90;

— 删除表中所有记录 (不删除表结构)
— DELETE FROM employees; — 请谨慎使用!

— 删除后,不要忘记COMMIT提交更改
COMMIT;

— 撤销最近一次未提交的删除
— ROLLBACK;
“`

解释:

  • DELETE FROM table_name WHERE condition:删除满足 WHERE 条件的行。
  • 如果省略 WHERE 子句,将删除表中的所有行。
  • TRUNCATE TABLE table_name; 也可以删除表中所有数据,但它是DDL命令,执行速度更快,且不能回滚。DELETE 是DML,可以回滚。TRUNCATE 会释放表占用的空间,而 DELETE 可能不会立即释放。

3.7 删除表 (DROP TABLE)

删除整个表,包括表结构和所有数据。

“`sql
— 删除 employees 表
DROP TABLE employees; — 请谨慎使用!

— DROP TABLE 是DDL命令,默认会立即生效,不能回滚。
“`

解释:

  • DROP TABLE table_name:删除指定的表。

3.8 事务控制 (COMMIT, ROLLBACK)

在Oracle(以及大多数关系型数据库)中,一系列DML操作(INSERT, UPDATE, DELETE, MERGE)被视为一个事务。事务是一个原子操作单元,要么全部成功并持久化到数据库(提交),要么全部失败并撤销所有更改(回滚)。

  • COMMIT;: 提交事务。将当前事务中的所有更改永久保存到数据库。
  • ROLLBACK;: 回滚事务。撤销当前事务中自上次 COMMITROLLBACK 以来的所有更改。
  • SAVEPOINT savepoint_name;: 设置保存点。允许你在事务中设置一个标记,可以回滚到这个标记点,而不是回滚整个事务。

“`sql
— 启动一个事务 (在SQL Developer中执行DML语句时,通常会自动开始一个新事务)

INSERT INTO employees (…) VALUES (…); — 插入第一条记录

SAVEPOINT after_insert1; — 设置保存点

UPDATE employees SET … WHERE …; — 更新记录

— 假设发现更新有问题,只想撤销更新,保留插入
ROLLBACK TO after_insert1;

— 假设插入和更新都没问题,或者只想撤销全部并重新开始
— ROLLBACK;

— 如果一切顺利,提交所有更改
COMMIT;
“`

理解事务对于保证数据的完整性和一致性至关重要。

第四章:进阶概念(对初学者的拓展)

掌握了基本的SQL操作后,你可以进一步了解一些Oracle特有的或更高级的概念。

4.1 视图 (VIEW)

视图是一个虚拟的表,它不存储实际数据,而是基于存储在其他表中的数据生成。视图可以看作是一个存储的查询。

作用:

  • 简化复杂查询: 将复杂的JOIN或过滤操作封装在视图中。
  • 安全性: 可以限制用户只能访问视图中暴露的列和行,而不是直接访问底层表。
  • 数据独立性: 可以在一定程度上隐藏底层表的结构变化。

“`sql
— 创建一个显示部门90员工基本信息的视图
CREATE VIEW executive_employees_v AS
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE department_id = 90;

— 像查询普通表一样查询视图
SELECT * FROM executive_employees_v WHERE salary > 20000;

— 删除视图
DROP VIEW executive_employees_v;
“`

4.2 序列 (SEQUENCE)

序列是一个数据库对象,用于生成唯一的连续数字序列。这在为主键列生成唯一值时非常有用。

“`sql
— 创建一个序列,从1开始,每次递增1
CREATE SEQUENCE employee_id_seq
START WITH 105 — 从105开始 (假设我们当前最大ID是104)
INCREMENT BY 1
NOCACHE; — 不缓存序列值,保证严格顺序(可能影响性能)

— 在INSERT语句中使用序列获取下一个值
INSERT INTO employees (employee_id, last_name, hire_date, job_id)
VALUES (employee_id_seq.NEXTVAL, ‘Chen’, TO_DATE(’10-FEB-2024′, ‘DD-MON-YYYY’), ‘IT_PROG’);

— 获取当前会话中序列的当前值 (通常用于插入后获取新生成的主键值)
— SELECT employee_id_seq.CURRVAL FROM dual; — dual是Oracle的虚拟表,用于执行不带表的SELECT语句

COMMIT;

— 删除序列
DROP SEQUENCE employee_id_seq;
“`

4.3 索引 (INDEX)

索引是一种数据库对象,可以加快对表中数据的检索速度,类似于书本的目录。它通过创建指向表数据的指针来实现快速查找。

作用:

  • 提高查询性能: 特别是在大型表上进行 WHERE 条件过滤或 JOIN 操作时。
  • 加速排序: ORDER BY 操作可能受益于索引。

注意:

  • 索引会占用额外的磁盘空间。
  • INSERT, UPDATE, DELETE 操作会变慢,因为在修改数据时,数据库还需要同时维护索引。
  • Oracle在创建 PRIMARY KEYUNIQUE 约束时会自动创建索引。

“`sql
— 创建一个基于 last_name 列的索引
CREATE INDEX emp_last_name_idx ON employees (last_name);

— Oracle通常能自动利用合适的索引,无需在查询中显式指定。

— 删除索引
DROP INDEX emp_last_name_idx;
“`

4.4 PL/SQL (Procedural Language/SQL)

PL/SQL是Oracle对标准SQL的过程化扩展。它允许你在SQL语句中嵌入过程化结构,如变量、常量、条件控制(IF-THEN-ELSE)、循环(LOOP)、异常处理等。

PL/SQL常用于编写:

  • 匿名块 (Anonymous Blocks):一次性执行的PL/SQL代码块。
  • 存储过程 (Stored Procedures):存储在数据库中、可重复调用的程序。
  • 函数 (Functions):存储在数据库中、可重复调用并返回单个值的程序。
  • 触发器 (Triggers):在特定数据库事件(如INSERT、UPDATE、DELETE)发生时自动执行的PL/SQL代码块。

学习PL/SQL将使你能够编写更复杂的数据库逻辑和应用程序。

“`sql
— 简单的匿名PL/SQL块
SET SERVEROUTPUT ON; — 在SQL Developer中,需要开启Server Output才能看到DBMS_OUTPUT.PUT_LINE的输出

BEGIN
DBMS_OUTPUT.PUT_LINE(‘Hello from PL/SQL!’);
END;
/ — / 符号表示PL/SQL块结束并执行
“`

第五章:学习资源与进阶方向

入门只是开始,数据库的世界广阔而深邃。以下是一些推荐的学习资源和进阶方向:

5.1 官方资源

  • Oracle官方文档: 这是最权威、最完整的资源。刚开始可能觉得复杂,但遇到问题时查阅非常有效。搜索”Oracle Database Documentation”,找到对应版本。
  • Oracle Live SQL: Oracle提供的免费在线平台,无需安装数据库即可练习SQL和PL/SQL。
  • Oracle技术社区: 官方论坛,可以提问和交流。
  • Oracle Learning Library / Oracle University: 提供官方培训课程(部分免费,部分收费)。

5.2 第三方资源

  • 书籍: 经典的Oracle数据库入门、SQL、PL/SQL书籍。
  • 在线课程: Udemy, Coursera, edX等平台有大量关于SQL和Oracle数据库的课程。
  • 技术博客和网站: 许多DBA和开发者会分享Oracle相关的知识和经验,如Oracle-Base (英文), Ask Tom (Oracle官方专家博客,英文)。
  • YouTube等视频平台: 有很多演示和讲解视频。

5.3 进阶方向

掌握了基础SQL和Oracle基本概念后,可以根据自己的兴趣和职业规划选择进阶方向:

  • 深入SQL: 学习更高级的SQL特性,如窗口函数、分析函数、递归查询(Recursive Subquery Factoring – WITH子句)、高级连接等。
  • PL/SQL编程: 学习编写存储过程、函数、包、触发器,掌握异常处理、游标等。
  • 数据库管理 (DBA): 学习数据库的安装、配置、备份恢复、性能调优、故障排除、安全管理等。
  • 数据库设计: 学习如何进行有效的数据建模,设计高性能、易于维护的数据库结构。
  • 特定Oracle技术: 学习RAC(高可用集群)、Data Guard(灾难恢复)、Partitioning(分区)、Advanced Compression(高级压缩)等企业级特性。
  • Oracle Cloud数据库服务: 学习Autonomous Database、Exadata Cloud Service等Oracle云上的数据库解决方案。

总结

恭喜你阅读到这里!你已经对Oracle数据库有了初步的认识,了解了其核心概念,掌握了安装和连接方法,并且学习了最基础也是最重要的SQL操作——DDL和DML。

请记住,学习数据库最好的方法是实践! 安装Oracle XE或使用Oracle Cloud Free Tier,打开SQL Developer,动手创建表,插入、查询、更新、删除数据。尝试不同的WHERE条件、JOIN方式、GROUP BY分组。多加练习,遇到问题查阅文档或搜索答案。

数据库是许多IT应用的基石,掌握Oracle数据库技能将为你未来的学习和职业发展奠定坚实的基础。祝你学习顺利,享受探索数据库世界的乐趣!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部