当前位置:首页 > 问答 > 正文

Oracle数据库里怎么弄个scott用户还有那些表该咋建和用

的经典来源是Oracle数据库早期版本自带的演示脚本,在旧版的Oracle(例如Oracle 10g、11g)中,数据库安装介质或默认安装后通常会包含一个名为 scott.sql(有时也可能是 utlsampl.sql)的脚本文件,这个脚本的唯一目的就是创建scott用户和那些著名的示例表,虽然在新版Oracle(如12c, 18c, 19c, 21c)中默认不再提供此脚本,但Oracle官方文档中仍然会提及这些示例方案,并且网络上可以很容易找到这个脚本的原始内容,以下操作就是基于这个经典脚本的核心逻辑。

创建scott用户

你需要以具有高级权限的用户身份登录数据库,通常我们使用 sys 用户或 system 用户,打开SQL*Plus或SQL Developer等工具,连接数据库。

第一步是创建用户,核心命令是 CREATE USER

来源脚本中的命令大致是这样的: CREATE USER scott IDENTIFIED BY tiger;

这句话的意思是:创建一个用户,用户名是“scott”,密码是“tiger”,为什么是scott和tiger?没有特别深奥的原因,据说是因为当时Oracle公司里有一位名叫Bruce Scott的早期员工,他养了一只猫,猫的名字叫Tiger,于是这个经典的组合就流传下来了。

光创建用户还不够,新用户就像一个新开的银行账户,里面既没钱也没有办理任何业务的权利,所以需要给它一些基本的权限,让它能够登录数据库、创建表格、操作数据等。

来源脚本中会接着执行授权命令,主要是: GRANT CONNECT, RESOURCE TO scott;

CONNECT 权限允许scott用户连接到数据库。RESOURCE 权限允许scott用户在自己的模式(可以理解为自己的地盘)里创建表、视图、存储过程等数据库对象,在一些非常旧的脚本中,可能还会看到 GRANT UNLIMITED TABLESPACE TO scott;,这是允许scott用户无限使用表空间(存储数据的地方),但在新版本中,RESOURCE 角色通常已经包含了足够的权限。

创建经典的表并插入数据

创建好用户并授权后,需要切换到scott用户来建表,使用命令 CONNECT scott/tiger; 即可切换。

接下来就是创建那几张著名的表:部门表(DEPT)和员工表(EMP),通常还会包括工资等级表(SALGRADE)和奖金表(BONUS),这些表的结构设计巧妙,数据之间有关联,非常适合演示基本的SQL查询,特别是多表连接查询。

  1. 创建部门表(DEPT) 部门表通常包含部门编号、部门名称和部门所在地三个字段,来源脚本中的建表语句类似: CREATE TABLE dept (deptno NUMBER(2) PRIMARY KEY, dname VARCHAR2(14), loc VARCHAR2(13)); 这里创建了一个名为dept的表,有三个列:deptno(数字类型,是主键),dname(部门名称,字符串),loc(地点,字符串),主键保证了每个部门的编号是唯一的。

    建好表结构后,需要往里面添加数据,脚本中会使用 INSERT INTO 语句插入几条固定的记录: INSERT INTO dept VALUES (10, 'ACCOUNTING', 'NEW YORK'); INSERT INTO dept VALUES (20, 'RESEARCH', 'DALLAS'); INSERT INTO dept VALUES (30, 'SALES', 'CHICAGO'); INSERT INTO dept VALUES (40, 'OPERATIONS', 'BOSTON'); 这样就有了四个部门。

  2. 创建员工表(EMP) 员工表是核心,字段较多,包括员工编号、姓名、职位、上级经理编号、入职日期、工资、奖金、所在部门编号等,它通过“部门编号(DEPTNO)”与DEPT表关联,来源脚本中的建表语句类似: CREATE TABLE emp (empno NUMBER(4) PRIMARY KEY, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2) REFERENCES dept(deptno)); 注意最后一个字段 deptno,它后面跟了 REFERENCES dept(deptno),这表示它是一个外键,指向了DEPT表的DEPTNO主键,这就建立了两个表之间的约束关系,确保员工所属的部门必须是DEPT表中真实存在的部门。

    同样,之后会插入一系列员工记录, INSERT INTO emp VALUES (7369, 'SMITH', 'CLERK', 7902, TO_DATE('1980-12-17', 'YYYY-MM-DD'), 800, NULL, 20); INSERT INTO emp VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('1981-2-20', 'YYYY-MM-DD'), 1600, 300, 30); (会插入十多名员工的数据,包括著名的KING, BLAKE, CLARK, JONES等)

  3. 创建其他表

    • SALGRADE表:存储工资等级范围,用于演示非等值连接。 建表:CREATE TABLE salgrade (grade NUMBER, losal NUMBER, hisal NUMBER); 插入数据:包括从1到5共五个工资等级。
    • BONUS表:一个空表,结构类似EMP表的某些字段,有时用于演示。 建表:CREATE TABLE bonus (ename VARCHAR2(10), job VARCHAR2(9), sal NUMBER, comm NUMBER);

    所有数据插入完毕后,务必执行 COMMIT; 命令提交事务,使所有更改永久保存到数据库。

基本使用示例

表建好后,就可以用scott用户登录进行各种SQL练习了,举几个最经典的例子:

  1. 简单查询SELECT * FROM emp; -- 查看所有员工信息。 SELECT ename, sal FROM emp WHERE sal > 2000; -- 查询工资超过2000的员工姓名和工资。

  2. 多表连接查询(这是scott模式的核心价值)SELECT e.ename, e.job, d.dname, d.loc FROM emp e, dept d WHERE e.deptno = d.deptno; 这个查询将员工表(EMP)和部门表(DEPT)连接起来,显示每个员工的姓名、职位以及他所在的部门名称和地点,通过 WHERE e.deptno = d.deptno 这个条件将两个表关联起来。

  3. 子查询SELECT ename FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE dname = 'SALES'); 查询所有在“SALES”部门工作的员工姓名,先通过子查询找出部门名称为'SALES'的部门编号,再用这个编号去EMP表里找员工。

  4. 分组统计SELECT deptno, AVG(sal) FROM emp GROUP BY deptno; 计算每个部门的平均工资。

在新版Oracle中的注意事项

如果你使用的是Oracle 12c及以后的版本,由于引入了“可插拔数据库”(PDB)的概念,你需要在连接时注意,默认可能连接到CDB(容器数据库)的根容器,而普通用户通常创建在PDB中,你需要先连接到具体的PDB(比如ORCLPDB)再执行上述操作,或者在使用SQL*Plus连接时使用类似 sqlplus sys/password@localhost:1521/ORCLPDB as sysdba 的命令指定PDB服务名。

在Oracle中重建scott/tiger演示方案的过程就是:用管理员账号创建用户并授权 -> 切换至新用户 -> 依次执行建表和插入数据的SQL语句,这套简单的方案是无数Oracle初学者的起点,其表结构设计至今仍是学习SQL语法的绝佳范例。

Oracle数据库里怎么弄个scott用户还有那些表该咋建和用