在数据库中,我们可以把对象分为两类:模式对象(Schema Objects) 和 非模式对象(Non-Schema Objects)。
模式对象:属于某个特定用户(Schema)的,比如表、视图、索引。
非模式对象:全局的,不属于某一个特定用户,比如表空间、用户、角色。
原理:表是数据库中最基础的存储单元,由行(记录)和列(字段)组成。
按用途分为:用户表(用户创建和维护)和系统表(Dm Server创建和维护,不能丢)
按类型分为:索引组织表、堆表、分区表、外部表、临时表,达梦默认索引组织表,orcale默认堆表
DCA考试需要会建表、导入SQL
数据类型是可表示的集。
字符类型:CHAR类型、CHARACTER类型(与CHAR相同,为了兼容性好)、VARCHAR类型(变长字符串,用多少分多少字节,用法类似CHAR,节省空间)、VRACHAR2类型(与VRACHAR类型)
数值类型:NUMERIC类型、DECIMAL类型、DEC类型(达梦常用)、NUMBER类型(这些数据类型相似)
# 在dmuser创建表t2,里面的数值精度为1,也就是小数位占1位,总长度为3位,整数位只能为1位
CREATE TABLE dmuser.t2(c1 dec(3,1));# 记得写;这样才是一个完整的SQL语句,而且为英文状态的;
# 得提交事务,不然会锁超时
commit;
位串数据类型、日期时间数据类型、大字段数据类型
在模式下或在用户下创建表
在某个模式下创建表,即按照题目要求的模式来创建表;
在某个用户下创建表,即在这个用户自动创建的模式下床建表;
在SQL语句中,不带模式名建表,默认建在SYSDBA下,因为当前在SYSDBA用户下。
如下图,在U_DMSALM模式下新建表
填写表名、列名、数据类型、精度、标度、是否为空、是否为主键、唯一性约束、外键约束
建好表后列的顺序是无法更改的,之后添加列会在最后添加,不会在中间插入
单行或多行插入数据均可以,也可以指定列插入数据,不指定列插入数据时,需要注意插入的个数与列的个数一致,否则会失败。
下面用DDL语句演示:
多行插入数据:
INSERT INTO DMSALM.EMP(EMPNO, ENAME, HIREDATE, COMM, DEPTNO) VALUES
('1001', '马学铭','2008-05-30',NULL,'101'),
('1002', '程擎武','2012-03-27',NULL,'101'),
('1003', '郑吉群','2010-12-27',NULL,'101'),
('2001', '李慧军','2010-05-15',NULL,'201'),
('2002', '常鹏程','2011-08-06',NULL,'201');
Commit;
补充说明:建表时,主键(Primary Key)用于唯一标识一行,外键(Foreign Key)用于连接两张表,Check 约束用于限制字段的取值(比如成绩必须 0-100)。
ID自增:可以用 IDENTITY(1,1) 实现类似 MySQL 的自增。
表名大小写:不加双引号建的表,查询时不区分大小写;加双引号建的表,查询时必须带双引号且严格区分大小写。
修改数据:
UPDATE dmuser.t_userinfo SET email='hengxin@dameng.com',username = 'hengxin12' WHERE userid = 2;
删除数据:
# DELETE 删除数据时一定要带WHERE条件,不然会删除整张表
DELETE FROM dmuser.t_userinfo WHERE userid = 1;
图形化可直接操作,不过多演示,别忘记点保存。
当多表往里导入时,注意导入顺序,因为有外键,否则会失败。
可以用执行脚本的方式导入插入数据
点击执行脚本图标:
考试时的SQL脚本存放在/opt/soft目录下,具体视题目而定,直接点击里面的SQL执行即可
如果导入的数据导错了,怎么清空表,只保留表结构:
# 清空U_DMSALM模式下的SALARY表
TRUNCATE TABLE U_DMSALM.SALARY;
为了保证数据的完整性和一致性。分为:列级和表级。
常见的约束类型:
**主键约束:**唯一标识符、不能为空,会自动勾选非空,建主键时会自动有唯一索引
**外键约束:**跨表引用完整性、可以为空,一个表的外键一定是另一张表的主键,在导表的时候,有外键时先导外键的那张表,注意导入SQL顺序
**唯一约束:**字段值唯一、可以为空
**检查约束:**限制值范围或逻辑、可以为空
**默认值约束:**自动填充未指定值、可以为空
**非空约束:**禁止为NULL、不能为空
创建表的时候可以添加约束
原理:视图本质上是一段被保存下来的 SQL 查询语句。它不占物理存储空间,每次查询视图时,底层数据库都会动态执行那段 SQL。
作用:一是简化复杂的查询(把多表 JOIN 隐藏起来);二是提高安全性(可以只给用户看某些字段,隐藏工资、密码等敏感字段)。
基于单表的查询,不含聚合或复杂逻辑
包含多表连接、子查询、聚合函数(如 JOIN、SUM())
物化视图本质是预先计算并存储查询结果的物理表,并通过定期或实时刷新来保持与基表的数据同步。
包含物化视图表(MTAB开头)和物化视图,物化视图存储数据,系统在创建物化视图时,会自动创建物化视图和物化视图表。
提升复杂查询性能、降低实时计算开销、支持离线数据分析。
应用于数仓环境,相当于把数据查询好放入,下次直接调用
物化视图刷新:
增量刷新(FAST):根据表上数据更改记录增量刷新
完全刷新(COMPLETE):会删除表中所有记录,根据物化视图定义,重新生成物化视图数据
默认(FORCE):当快速刷新可用时用快速刷新,否则用完全刷新
刷新时机:
定时刷新:START WITH…NEXT,start with指定首次刷新时间,next指定自动刷新的间隔
手工刷新(默认):ON DEMAND,分为 REFRESH、DBMS_MVIEW
自动刷新:ON COMMIT,提交时自动刷新
从不刷新:NEVER REFRESH
创建物化视图的语法:
CREATE MATERIALIZED VIEW 模式名.物化视图名 build immediate refresh on demand force AS SQL;
动态性能视图是以 V$ 或 G$ 开头的视图,是数据库运行时生成的虚拟表,用于实时监控数据库实例的状态、性能和资源使用情况。
数据存储在内存中,由数据库实例动态更新。
# 系统中所有动态性能视图
SELECT * FROM v$dynamic_table;
#数据缓冲池,记录缓冲池页结构的信息
SELECT * FROM v$buffer;
#数据文件信息
SELECT * FROM v$datafile;
#sql缓冲区中执行计划
SELECT * FROM v$cachepln;
#会话信息
SELECT * FROM v$sessions;
#阻塞情况
SELECT * FROM v$trxwait;
基本语法:
CREATE VIEW 视图名 AS SQL;
**视图有效性:**视图依赖于基表,视图有效性可通过SF_VIEW_EXPIRED函数来检查
视图删除:
drop view if exists v_empnum;
视图更新:
类似于书籍的目录,一种数据库对象,通过指针加速查询速度,为有序序列。
索引与表相互独立,且占用存储空间。索引能大幅提升 SELECT 查询速度,但是会拖慢 INSERT 和 UPDATE 的速度(因为每次写数据,不仅要写表,还要重新维护索引)。所以不要什么字段都建索引。
聚簇索引(CLUSTER):一个表只有一个聚簇索引,不会在索引那栏显示出来
非聚簇索引(NOT PARTIAL):唯一/非唯一(普通二级索引)索引、函数索引、组合索引、全局索引和分区索引
自动创建索引:定义主键或唯一约束时,数据库会自动在相应列上创建唯一索引
手动创建索引:使用CREATE INDEX语句可以手动在指定列创建索引
-- 创建单列索引 CREATE INDEX IDX_SCORE ON SCORES(SCORE); -- 创建复合索引 (多用这个,效率更高) CREATE INDEX IDX_STU_NAME_CLASS ON STUDENTS(STUDENT_NAME, CLASS_NAME);
失效/有效:默认为有效,无效的索引需要重建
可见/不可见:默认为可见,对执行计划可见;不可见的索引则执行计划不会选择该索引
原理:序列是一个计数器,专门用来生成不重复的数字。它不受事务回滚的影响(即使你插数据失败回滚了,序列的数值也会继续往下走,不会回退)。
序列是数据库中生成唯一、有序数字序列的对象,通常用于为表的主键列自动提供唯一值。
满足唯一性、有序性(递增或递减)、高效性
可以自动生成数值,无需手动插入。
CREATE SEQUENCE 模式名.序列名 INCREMENT BY 增量 START WITH 起始值 MAXVALUE 最大值 MINVALUE 最小值;
也可以直接在图形化工具中创建,更简洁。
应用场景:通常用来生成表的主键 ID。
CREATE SEQUENCE SEQ_SCORE_ID START WITH 1 INCREMENT BY 1; INSERT INTO SCORES (SCORE_ID, STUDENT_ID) VALUES (SEQ_SCORE_ID.NEXTVAL, 1001);
原理:触发器是一段在特定事件(插入/更新/删除)发生时自动执行的 PL/SQL 代码。
作用:常用于审计日志(谁什么时候改了表)、或者复杂的业务约束(比如更新分数时,自动更新总成绩)
CREATE OR REPLACE TRIGGER TRG_BEFORE_INSERT
BEFORE INSERT ON SCORES -- 插入数据前触发
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('即将插入一条新成绩');
END;
慎用触发器!因为触发器容易产生“级联触发”(A表触发了B表,B表又触发了C表),导致排查死锁和性能问题非常困难。
原理:给数据库对象起一个别名。
作用:屏蔽对象的真实位置。比如你是普通用户,你想查别的用户的一张表,如果不建同义词,你必须写 模式名.表名;建了公有同义词后,你直接写 表名 就可以查到了。
CREATE PUBLIC SYNONYM SYN_SCORES FOR EXAM.SCORES; SELECT * FROM SYN_SCORES;
同义词分为公共同义词(所有用户都能用)和私有同义词(只能自己用)。一般开发环境使用私有同义词隔离风险。
在图形化中新建模式:
创建用户会自动生成同名的模式,如下图所示,创建U_DMSALM用户会自动生成U_DMSALM模式
一个模式只能属于一个用户,一个用户下可以有多个模式
如下图:我创建了DMSALM模式,可以将模式拥有者选择为U_DMSALM,U_DMSALM本身已有U_DMSALM模式,它目前拥有2个模式
在模式属性中可以看到模式名和模式拥有者
点开U_DMSALM模式查看属性,可以看到DDL语句,使用DDL语句创建模式与图形化创建方式的效果一致
CREATE SCHEMA DMSALM AUTHORIZATION "U_DMSALM";
一组权限的集合,用于简化权限管理;通过角色,批量回收和分配权限。
可以赋予角色权限、系统权限、对象权限。
grant授予权限 revoke取消权限
系统权限:控制数据库级操作,创建/删除表等DDL语句
对象权限:控制对特定对象的操作,SELECT、INSERT
点击角色右键新建角色,赋予角色系统权限:创建表、视图、存储过程、索引的权限
CREATE PROCEDURE/SEQUENCE/TRIGGER/SCHEMA/ROLE/SYNONYM/MATERIALIZED VIEW,分别为创建存储过程、创建序列、创建触发器、创建模式、创建角色、创建同义词、创建物化视图
常用资源设置项含义:
**口令有效期:**密码多少天后过期
**口令等待期:**密码修改后,多少天内不能再次修改
**口令宽限期:**密码过期后,用户在多少天内仍可登录
**口令变更次数:**密码必须修改过N次后,才能使用过去用过的旧密码
**口令锁定期:**登录失败达到上限后,账号会被锁定多少分钟
**非活跃用户锁定期:**用户连续多少天没有登录,账号被自动锁定
**登录失败次数:**连续登录失败多少次后,账号被锁定
例题:为用户创建默认的资源配置文件PRO_SALM,要求密码必须修改过 3 次后,才能使用过去用过的密码;并且如果用户超过90天未登录或是登录失败超过5次,则锁定该账号。
可以在用户这里统一修改资源限制,不用一个个修改,便于管理
命令行方式用disql登录时,当密码中带有@这个特殊字符时,登录失败该怎么办:
1、可以加上“ ”,比如可以写为"Dameng@123"
2、可以加上‘“ ”’,比如可以写为“‘Dameng@123’”;这里’ '表示转义符
3、可以加上\“ \”,比如可以写为\“Dameng@123\”;这里\表示转义符
赋予用户创建表、视图、索引的权限
这些对象和具体的某个用户/表无关,属于数据库层面全局控制的。
**物理存储:**由多个数据文件组成
一个表空间可以包括一个或多个数据库文件
一个数据文件只能归属于一个表空间
**逻辑存储结构:**由多个表空间组成,表空间由一个或多个数据文件组成
页(操作系统块)—>簇(不可以跨数据文件)—>段(可以跨数据文件)—>表空间(多个数据文件组成)—>数据库
原理:表空间是达梦数据库中逻辑存储的最高层。一个数据库可以有多个表空间,一个表空间对应一个或多个操作系统上的.DBF数据文件。
作用:数据库管理员(DBA)可以通过表空间来控制数据存放在哪个磁盘分区,或者控制磁盘空间的使用上限。
建表时,如果你不指定表空间,表会默认放在 MAIN 或 SYSTEM 表空间中。在金融/大企业生产环境中,必须区分开:系统表放 SYSTEM,业务数据表放 TS_DATA,索引单独放 TS_INDEX(为了提高IO读写效率)。
作为逻辑容器,用于组织和管理数据库对象的物理存储
1、预定表空间
SYSTEM表空间、ROLL表空间、TEMP表空间、MAIN表空间,由数据库系统自动管理,SYSTEM表空间、ROLL表空间、TEMP表空间不允许脱机。
2、新建表空间
通过图形化界面创建
右键 新建表空间
添加数据文件,1个表空间最多有256个数据文件
写入数据文件的名字,根据考试要求添加数据文件个数,修改文件大小,是否打开自动扩充,扩充尺寸大小,扩充上限大小,注意单位为M,考试如果给G,记得换算单位,1G=1024M
在生产中,所有数据文件的属性最好保持一致
表空间能容纳的数据量为所有数据文件的上限值之和,最大为20G
对MAIN表空间进行脱机,无法查询到他下面的表,但并不影响访问其他的表空间
不影响对别的表的查询
查看表空间属性里有DDL语句,这是用命令行方式可以创建表空间
CACHE表示放入普通内存中
create tablespace TSAL datafile
'/home/dmdba/dmdbms/data/DMSALM/TSAL_02.DBF' size 512 autoextend on next 32 maxsize 10240, '/home/dmdba/dmdbms/data/DMSALM/TSAL_01.DBF' size 512 autoextend on next 32 maxsize 10240 CACHE = NOMAL;
原理:用户是登录数据库的凭证。在达梦(及 Oracle)中,用户 = 模式(Schema)。你创建一个用户,系统就自动给你生成了一个同名的模式,你建的表默认就在你的模式里。
CREATE USER EXAM IDENTIFIED BY "Exam123456" DEFAULT TABLESPACE TS_EXAM_DATA;
达梦有 SYSDBA(系统管理员,权限最高)和 SYSAUDITOR(审计员,专门看日志,不能改数据)。这体现了职责分离的安全标准。
原理:创建了用户不给他赋权限,他什么都做不了(连 SELECT 都查不了)。
权限分为:系统权限(能不能建表、能不能建视图)和对象权限(能不能查某张表、能不能改某张表)。
-- 系统权限 GRANT CREATE TABLE TO EXAM; -- 对象权限 GRANT SELECT, UPDATE ON STUDENTS TO EXAM;
普通用户连登录数据库的权限都没有,必须由管理员(SYSDBA)执行 GRANT CONNECT TO 用户名 赋予登录权限。
原理:假如公司有 10 个开发人员,每个开发人员都需要这 10 个权限。如果你去一个个赋权,会疯掉。
角色就是权限的集合。你先建一个“开发者角色”,把 10 个权限给角色,然后把角色一次性赋予 10 个开发人员。以后权限有变动,只需改角色,10 个人的权限自动一起变动。
CREATE ROLE ROLE_DEV; GRANT CREATE TABLE, CREATE VIEW TO ROLE_DEV; GRANT ROLE_DEV TO EXAM; -- 把角色给用户
角色大大简化了 DBA 管理权限的工作量,考试中常考“为什么需要角色”,答案就是方便统一赋权和统一回收。
由关键字BEGIN开始,以关键字EXCEPTION或END结束。
可执行部分是核心部分,由SQL语句和流程控制语句构成。
1、支持的SQL语句包括:
数据查询语句(SELECT)
数据操纵语句(INSERT / DELETE / UPDATE)
游标定义及操纵语句(DECLARE CURSOR / OPEN / FETCH / CLOSE)
事务控制语句(COMMIT / ROLLBACK / SAVEPOINT)
动态SQL执行语句(EXECUTE IMMEDIATE)
流程控制语句(条件判断(IF THEN)、循环控制(LOOP))
自治事务(PRAGMA AUTONOMOUS_TRANSACTION)
执行部分也可以嵌套匿名块。
2、流程控制语句包括:
条件判断:
IF-THEN-ELSEIF-ELSE、CASE-WHEN、SWITCH
循环控制:
FOR-LOOP
DECLARE
a=10 int
BEGIN
FOR I IN REVERSE 1..a LOOP
PRINT I;
a:=I-1;
END LOOP;
END;
/
LOOP+EXIT WHEN、WHILE-LOOP、REPEAT-UNTIL、FORALL、CONTINUE
顺序控制:
GOTO、NULL
是一种预定义的错误控制机制,当程序遇到错误时,转向特定处理逻辑。使用户遇到错误时弹出的错误解释更清晰。
以EXCEPTION关键字开始,WHEN THEN子句用于处理未被显示捕获的异常.
异常处理语法:
DECLARE --声明部分 BEGIN --执行部分 EXCEPTION --异常处理部分开始 WHEN exception_name1 THEN --处理exception_name1的代码 WHEN exception_name2 THEN --处理exception_name2的代码 ... END;
创建存储过程的语法:
-- 目标:创建一个函数,根据传入的课程名,返回该课程的最高分,并处理异常。
CREATE OR REPLACE FUNCTION FUNC_GET_MAX_SCORE (
p_course_name IN VARCHAR2 -- 传入参数:课程名
)
RETURN NUMBER -- 返回值类型:数字
AS
-- 变量声明
v_max_score NUMBER(5,2);
v_course_id INT;
BEGIN
-- 1. 先在 COURSES 表里找对应的课程 ID
BEGIN
SELECT COURSE_ID INTO v_course_id
FROM COURSES
WHERE COURSE_NAME = p_course_name;
EXCEPTION
-- 如果没有找到该课程,直接抛出自定义错误
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, '错误:系统中不存在名为 ' || p_course_name || ' 的课程!');
END;
-- 2. 根据找到的课程 ID,查询最高分
SELECT MAX(SCORE) INTO v_max_score
FROM SCORES
WHERE COURSE_ID = v_course_id;
-- 3. 返回值
RETURN NVL(v_max_score, 0); -- 如果最高分是空值,返回 0
EXCEPTION
-- 通用的兜底异常处理
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('发生未预料的系统错误:' || SQLERRM);
RETURN -1; -- 发生系统错误时返回 -1 作为异常标记
END;
/
-- 调用测试:
SELECT FUNC_GET_MAX_SCORE('高等数学') FROM DUAL;
CREATE OR REPLACE FUNCTION 模式名.存储过程名
(传入的参数名1 参数类型1 , 传入的参数名2 参数类型2,...)
RETURN 返回值类型(DEC()、VARCHAR)
AS
--变量声明
变量名1 变量类型1;
变量名2 变量类型2;
BEGIN
--代码块
[
SELECT 表名1.字段名1,表名2.字段名2,...
INTO 变量名1,变量名2, --将查询的结果分别存入变量中
FROM 模式名.表名
JOIN 模式名.表名 ON 主键和外键相同
WHERE 字段值1 = 传入的参数名1 AND 字段值2 = 传入的参数名2;
IF 返回需要满足的条件
RETURN 值;
ELSE
RETURN 值;
ENDIF;
--异常处理部分
EXCEPTION
WHEN OTHRES THEN
PRINT();
RETURN ...; --最好替换为:DBMS_OUTPUT.PUT_LINE();
]
END;
/
#调用函数
select 模式名.存储过程名(输入参数值,输入参数值,...);
文章
阅读量
获赞
