目录
目录
第一章 达梦数据库的概述
1、通用性
2、高性能
3、高可用
4、跨平台
5、高可扩展
第二章 达梦数据库常用对象管理
一、表空间管理
1.创建表空间
2.修改表空间
3.删除表空间
二 、用户管理
三 、权限管理
四、模式管理
第三章 数据操作
一、 数据插入
二 、数据更新
三 、数据删除
第四章 达梦数据库查询与操作
一、 单表查询
二 、多表查询
1.连接查询
2.子查询
第五章 达梦数据库高级对象管理
一 、视图管理
1.创建视图
2.修改视图
3.删除视图
第一章 达梦数据库的概述
达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管 理系统,简称DM,它具有如下特点:
1、通用性
达梦数据库管理系统兼容多种硬件体系,可运行于X86、X64、SPARC、
POWER等硬件体系之上。DM各种平台上的数据存储结构和消息通信结构完全一 致,使得DM各种组件在不同的硬件平台上具有一致的使用特性。
达梦数据库管理系统产品实现了平台无关性,支持Windows系列、各版本Linux(2.4及2.4以上内核)、Unix、Kylin、AIX、Solaris等各种主流操作系统。达梦数据库的服务器、接口程序和管理工具均可在32位/64位版本操作系统 上使用。2、高性能
支持列存储、数据压缩、物化视图等面向联机事务分析场景的优化选项;
通过表级行存储、列存储选项技术,在同一产品中提供对联机事务处理和联机 分析处理业务场景的支持;
3、高可用
可配置数据守护系统(主备),自动快速故障恢复,具有强大的容灾处理能力。4、跨平台
跨平台,支持主流软硬件体系(支持windows、Linux、中标麒麟、银河麒麟 等操作系统),支持主流标准接口。
5、高可扩展
支持拓展软件包和多种工具,实现海量数据分析处理、数据共享集群(DSC)和 无共享数据库集群(MPP)等扩展功能。
第二章 达梦数据库常用对象管理
一、表空间管理
1.创建表空间
2.修改表空间
3.删除表空间
二 、用户管理
1.规划用户 以字符开始 长度为1~128个字符 规划用户的权限 规划用户存储位置 规划用户密码安全和资源管理
创建用户:使用create user语句创建用户
如:create user TEST identified by "dameng123";
修改用户:
alter user TEST identified by "Dameng123";
删除用户:
drop user TEST;
2.数据库管理员(DBA):每个数据库至少需要一个DBA来管理,DBA可能是一个团队,也可能是一个人。在不同的数据库系统中,数据库管理员的职责可能也会有比较大的区别,总体而言,数据库管理员的职责主要包括以下任务:
(1)评估数据库服务器所需的软、硬件运行环境
(2)安装和升级DM服务器
(3)数据库结构设计
(4)监控和优化数据库的性能
(5)计划和实施备份与故障恢复。 数据库安全员不能对用户数据进行增、删、改、查,也不能执行普通的 DDL 操作如创建表、视图等。他们只负责制定安全机制,将合适的安全标记应用到主体和客体,通过这种方式可以有效的对DBA 的权限进行限制,DBA 此后就不能直接访问添加有安全标记的数据,除非安全员给DBA 也设定了与之匹配的安全标记,DBA 的权限受到了有效的约束。数据库安全员也可以创建和删除新的安全用户,向这些用户授予和回收安全相关的权限。
三 、权限管理
系统权限
权限名称 | 说明 |
CREATE TABLE | 创建表 |
ALTER DATABASE | 修改数据库 |
CREATE TABLESPACE | 创建表空间 |
ALTER TABLESPACE | 修改表空间 |
DROP TABLESPACE | 删除表空间 |
CREATE USER | 创建用户 |
CREATE VIEW | 创建视图 |
CREATE PROCEDURE | 创建存储过程/函数 |
CREATE ROLE | 创建角色 |
CREATE SCHEMA | 创建模式 |
四、模式管理
模式定义:模式是一个特定的对象集合,在概念上可将其看作是包含表、视图、索引等若干对象的对象集
模式对象:表、视图、约束、索引、序列、触发器、存储过程/函数、包、同 义词、类、域
模式与用户之间的关系: 当系统建立一个用户时,会自动生成一个对应的模式 用户还可以建立其他模式
约束:数据库约束是为了保证数据的完整性(正确性)而实现的一套机制 约束分为两类:行级和表级,处理机制是一样
常见的约束类型
NOT NULL 、UNIQUE 、PRIMARY KEY 、FOREIGN KEY 、CHECK
第三章 数据操作
一、 数据插入
用SQL语句插入数据
语句: INSERT[INTO]表名[(字段名1,字段名2,...)] VALUES(值1 ,值2,...)[,(值1,值2,...),...];
简化格式(不带字段名): INSERT INTO表名VALUES(值1,值2,...,值n);
基本格式(带字段名): INSERT INTO 表名(字段名1,字段名2,…) VALUES(值1,值2,…);
问题一: 表名后圆括号中的列名可省略吗?
答:若提供值的个数及顺序与表中的列名及顺序相同,就可以。
问题二: 对于不允许为空值且未设置默认值的列,在插入数据时能否被忽略?
答:不能2.关于INSERT语句的赋值问题
(值1,值2,…)中的值:可以是常量、变量、函数、表达式,及NULL、0、DEFAULT等;
字符串常量:使用英文单引号'将字符串括起来,用来标识这是一个字符串,如'abc';
日期时间常量:使用英文单引号'将其括起来,如'2021-01-26'; 数值常量:不需要使用任何符号标识,直接书写数字即可,如1000;
变量、函数、表达式、NULL、0、DEFAULT:不需要使用任何符号标识,直接书写即可;
字符串常量是区分大小写的:如'abc'、'ABC'、'Abc'是不一样的。3.关于空、空串、空格串的说明
NULL:空、空值,表示值未知、不确定的值;
'':空串,表示空字符串,一个字符都没有;
' ':空格串,表示含有空格的字符串,有一个或多个空格;
'0' :只有一个数字0的字符串;
0:取值为数值0。
二 、数据更新
1.用SQL语句修改数据
(1)格式:UPDATE 表名 SET 字段名1 = 值1[,字段名2 = 值2,……] [WHERE 条件表达式] ;
(2)格式1:(基本格式) UPDATE 表名 SET 字段名1 = 值1 WHERE 条件表达式;
(3)格式2:(无条件格式) UPDATE 表名 SET 字段名1 = 值1;
三 、数据删除
1.用SQL语句删除数据
(删除表中的某一条或者某几条记录,需要使用WHERE子句来指定删除记录的条件:条件成立,删除;条件不成立,不删除。)
(1)格式:DELETE FROM 表名 [WHERE 条件表达式] ;
(2)格式1:(基本格式) DELETE FROM 表名 WHERE 条件表达式;
(3)格式2:(无条件格式) DELETE FROM 表名;
(4)格式3: (清空表) TRUNCATE [TABLE] 表名 ;
【例1】删除表TBL_Bookinfo中姓名为李四的记录 DELETE FROM TBL_Bookinfo WHERE author='李四'; 【例2】删除表TBL_Bookinfo中图书编号为“TP312BA/52”的记录 DELETE FROM TBL_Bookinfo WHERE BookID='TP312BA/52';
2.用SQL语句清空数据
DELETE FROM 表名和TRUNCATE [TABLE] 表名的区别
DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句。
DELETE语句后面可以跟WHERE子句,通过指定WHERE子句中的条件表达式只删除满足条件的部分记录,而TRUNCATE语句只能用于删除表中的所有记录。
使用TRUNCATE语句删除表中的数据,再向表中添加记录时,自动增加字段的默认初始值重新由1开始,使用DELETE语句删除表中所有记录,再向表中添加记录时,自动增加字段的值为删除时该字段的最大值加1。
使用DELETE语句时,每删除一条记录都会在日志中记录,而使用TRUNCATE语句时,不会在日志中记录删除的内容,因此TRUNCATE语句的执行效率比DELETE语句高。
(无条件格式)DELETE FROM 表名;
(清空表)TRUNCATE [TABLE] 表名 ;
【例3】删除表TBL_Bookinfo中所有记录 DELETE FROM TBL_Bookinfo ; 【例4】清空表TBL_User表中所有记录 TRUNCATE TABLE TBL_User;
第四章 达梦数据库查询与操作
一、 单表查询
1.基础查询
(主语句)SELECT [DISTINCT] *|{字段名1, 字段名2, 字段名3,……} FROM 表名
(子语句)[WHERE 条件表达式1] [GROUP BY 字段名 [HAVING 条件表达式2]] [ORDER BY 字段名[ASC|DESC]] [LIMIT [OFFSET,] 记录数];
1.2.最基本的SQL查询语句 语法:
SELECT *|{字段名1, 字段名2, 字段名3,……}FROM 表名
特点:SQL语言是一种非过程化的结构查询语言,简洁 只要请求:查什么?从哪里查?即可返回结果
查询指定表中的所有记录的所有列
【例1】从TBL_Bookinfo 表查询所有图书的记录内容
select * from TBL_Bookinfo;
查询指定的列:将指定的列放在选择列表中
【例2】查询TBL_Bookinfo 表中所有图书的BookID,ISBN, BookName
select BookID,ISBN,BookName from TBL_Bookinfo;
变列标题的显示 语法:字段名 AS 标题名 或 字段名 标题名
【例3】查询TBL_Bookinfo 表中所有图书的BookID,ISBN, BookName
方法一:
select BookID as 索取号, ISBN as 标准编号, BookName as 书名
from TBL_Bookinfo;
方法二:
select BookID 索取号, ISBN 标准编号, BookName 书名
from TBL_Bookinfo;
2.条件查询
(主语句)SELECT [DISTINCT] *|{字段名1, 字段名2, 字段名3,……} FROM 表名
(子语句) [WHERE 条件表达式1] [GROUP BY 字段名 [HAVING 条件表达式2]] [ORDER BY 字段名
[ASC|DESC]] [LIMIT [OFFSET,] 记录数];
比较条件的使用
运算符 | 示例 |
>= | 表示大于等于比较 |
> | 表示大于比较 |
< | 表示小于比较 |
<= | 表示小于等于比较 |
>、!= | 表示不等于比较 |
【例1】在TBL_Bookinfo 表中查询所有“清华大学出版社”出版的书
select * from TBL_Bookinfo where Publisher='清华大学出版社';
【例2】在TBL_Bookinfo 表查询95年及95年以后出版的书
select * from TBL_Bookinfo where PublishDate> ='1995-1-1';
比较条件的组合使用
运算符 | 描述 |
AND | 逻辑与,操作数全部为真,则结果为1,否则为0 |
OR | 逻辑或,操作数中只要有一个为真,则结果为1,否则为0 |
NOT | 逻辑非,操作数为0,则结果为1,操作数为1,则结果为0 |
【例3】查询不是“清华大学出版社”出版的书。
select * from TBL_Bookinfo where not Publisher='清华大学出版社';
【例4】查询所有“清华大学出版社”或“电子工业出版社”出版的书
select * from TBL_Bookinfo
where Publisher='清华大学出版社' or Publisher='电子工业出版社';
【例5】在TBL_Bookinfo 表查询页数在200至400之间、同时出版社为“清华大学出版社”的书
select * from TBL_Bookinfo
where Pagecount>=200 and Pagecount<=400 and Publisher='清华大学出版社'
BETWEEN关键字
运算符 | 示例 |
BETWEEN…AND… | 在指定的闭区间范围内 |
NOT BETWEEN…AND… | 不在指定的闭区间范围内 |
一般用于数值和日期型数据
注意:between... and... 是包含边界的
【例6】从TBL_Bookinfo表中检索1990年出版的图书信息。
select * from TBL_Bookinfo
where PublishDate between '1990-01-01' and '1990-12-31';
IN关键字
函数名 | 描述 |
IN() | 在给定的集合内 |
NOT IN() | 不在给定的集合内 |
【例7】从TBL_Bookinfo表中检索出索取号为'TB11/46', 'TG/71','TG38-62/12'的图书信息。
select * from TBL_Bookinfo
where BookID in ('TB11/46 ','TG/71','TG38-62/12');
#等价于
select * from TBL_Bookinfo
where BookID=' TB11/46 ' or BookID=' TG/71' or BookID=' TG38-62/12';
3.高级查询
SELECT [DISTINCT] *|{字段名1, 字段名2, 字段名3,……} FROM 表名 [WHERE 条件表达式1] [GROUP BY 字段名 [HAVING 条件表达式2]] [ORDER BY 字段名 [ASC|DESC]]
> [LIMIT [OFFSET,] 记录数];
DISTINCT关键字
实际应用中,出于对数据的分析需求,有时需要去除查询记录中重复的数据。可使用DISTINCT(去重复值子句)去除重复记录(消除重复行,只保留一条)。
语法:DISTINCT 字段名1 [, 字段名2 ]…
【例1】在TBL_Bookinfo表中检索所有的出版社
select Publisher from TBL_Bookinfo;
select distinct Publisher from TBL_Bookinfo;
ORDER BY 子句
语法:ORDER BY 字段名 [ASC|DESC]
说明:ASC 升序,DESC 降序,缺省值为升序
【例2】按出版日期的升序检索TBL_Bookinfo表的记录
select * from TBL_Bookinfo order by PublishDate asc;
【例3】按出版社的降序检索TBL_Bookinfo表的记录
select * from TBL_Bookinfo order by Publisher desc;
关于空值NULL排序问题:
1、ASC方式,排序列为NULL的元组(记录、行)最先显示,
2、DESC方式,排序列为NULL的元组(记录、行)最后显示;多字段排序 (多重排序) 语法:ORDER BY 字段名1 [ASC | DESC] [, 字段名2 [ASC | DESC]]…
LIMIT 关键字 SQL中提供了一个关键字LIMIT(限量子句),可以限定记录的数量,也可以指定查询从哪一条记录开始(通常用于分页)。
语法:LIMIT [偏移量,] 记录数
【例4】按出版社的降序和出版日期的升序检索TBL_Bookinfo表的记录
select * from TBL_Bookinfo order by Publisher desc, PublishDate asc;
【例5】查询借阅表中第6-10行记录。
select * from TBL_BorrowInfo limit 5,5;
【例6】从TBL_BookInfo表中检索出最厚的三本书的书名、出版社及页数。
select BookName ,Publisher ,PageCount from TBL_BookInfo
order by PageCount desc limit 3; -- limit 0,3
计算列(计算列由函数、字段名、运算符等组成的表达式构成)
【例7】显示每本书至今的年限
1、显示出版日期
SELECT PublishDate FROM TBL_Bookinfo; #直接字段
2、显示出版日期的年份
SELECT YEAR(PublishDate) FROM TBL_Bookinfo; #计算列
3、计算图书至2022年的年限
SELECT 2022-YEAR(PublishDate) FROM TBL_Bookinfo; #计算列
4、计算图书至今的年限
SELECT YEAR(NOW())-YEAR(PublishDate) FROM TBL_Bookinfo; #函数的嵌套
常用聚合函数
函数 | 描述 |
COUNT(字段名) | 返回参数字段的数量,参数可以使用*,即COUNT(*) |
SUM(字段名) | 返回参数字段之和 |
AVG(字段名) | 返回参数字段的平均值 |
MAX(字段名) | 返回参数字段的最大值 |
MIN(字段名) | 返回参数字段的最小值 |
说明:1、COUNT()、SUM()、AVG()、MAX()、MIN()
函数中可以在字段名前添加DISTINCT,表示对不重复的记录进行相关操作;
2、COUNT(*),表示统计符合条件的所有记录(包含NULL);其他聚合函数都不能使用*,不统计字段中的空值(NULL)。
【例8】从TBL_Bookinfo 表查询图书的总数
select COUNT(*) from TBL_Bookinfo; #包含NULL
select COUNT(bookid) from TBL_Bookinfo; #bookid为主键,非空,计算准确
select COUNT(Publisher) from TBL_Bookinfo; #去除NULL,不准确
select COUNT(*) as 总册数 from TBL_Bookinfo; #改变列标题
【例9】查询最厚、最薄的图书页数
select MAX(PageCount) from TBL_Bookinfo; #最厚
select MIN(PageCount) from TBL_Bookinfo; #最薄
select MAX(PageCount),MIN(PageCount) from TBL_Bookinfo; #合
#列标题起别名
select MAX(PageCount) 最大页数,MIN(PageCount) 最小页数 from TBL_Bookinfo;
要提示:select查询内容,group by、having、order by 子句是聚合函数允许出现的地方,在where
子句中不能使用聚合函数。
【例 10】显示页数最多图书的书名和页数
select BookName,PageCount from TBL_Bookinfo
where PageCount=MAX(PageCount); #错误号1111
4.分组查询
SELECT完整语句格式
(主语句)SELECT [DISTINCT] *|{字段名1, 字段名2, 字段名3,……} FROM 表名
(子语句) [WHERE 条件表达式1]
[GROUP BY 字段名 [HAVING 条件表达式2]] [ORDER BY 字段名 [ASC|DESC]] [LIMIT
[OFFSET,] 记录数];
GROUP BY子句 语法:GROUP BY 字段名
【例1】从TBL_Bookinfo 表查询出各出版社的图书册数
select Publisher ,COUNT(*) from TBL_Bookinfo
group by Publisher;
【例2】查询各出版社最厚的书的页数
select Publisher,MAX(PageCount) from TBL_Bookinfo
group by Publisher;
【例3】显示各出版社在1990年以后出版的图书册数
select Publisher,COUNT(*) from tbl_bookinfo
where PublishDate>='1990-01-01' group by Publisher;
HAVING子句
SELECT [DISTINCT] 字段列表 FROM 数据表名
[WHERE 条件表达式]
GROUP BY 字段名 [ASC | DESC][, …]
HAVING 条件表达式
【例4】从TBL_Bookinfo 表查询出各出版社的图书册数在2册以上的图书册数。
#1.分组统计
select publisher,count(*) from TBL_Bookinfo
group by publisher;
#2.分组统计筛选
select publisher ,count(*) from TBL_Bookinfo
group by publisher having count(*)>2;
HAVING子句与WHERE的区别
WHERE子句是在分组前对数据进行筛选,在它后面不可以使用聚合函数。
HAVING子句对分组统计后的结果进行筛选,在它后面使用聚合函数。
【例5】从TBL_Bookinfo 表查询出1990年以后各出版社的图书册数在2册以上的图书册数
select publisher ,count(*) from TBL_Bookinfo
where year(PublishDate)>=1990
group by publisher
having count(*)>2;
GROUP BY自带排序*
语法:GROUP BY 字段名[ASC | DESC]
【例6】按图书分类编号分类汇总图书册数
select ClassId, COUNT(*) from TBL_Bookinfo group by ClassId;# 默认按ClassId升序分组排序
GROUP BY多重分组*
语法:GROUP BY 字段名1 [ASC | DESC] [, 字段名2 [ASC | DESC] …]
从TBL_ User 表中统计各班的人数
select class 班级, count(*) 人数 from tbl_user group by class;
从TBL_ User 表中统计男女生人数
select sex 性别, count(*) 人数 from tbl_user group by sex;
二 、多表查询
1.连接查询
(1)内连接INNER JOIN ON即最常见的等值连接,使用=连接两列数据,所有能够匹配的结果都会被显示出来,语法如下:
SELECT 输出项 FROM 表1 [INNER] JOIN 表2 ON 表2.公共列=表1.公共列;
ON用于指定内连接的连接条件。在不设置ON时,与交叉连接等价。
升级到三表查询,语法如下:
SELECT 输出项 FROM 表1 [INNER] JOIN 表2 ON 表2.公共列=表1.公共列 [INNER] JOIN 表3 ON
表3.公共列=表1|2.公共列;
(2)左外连接LEFT JOIN
ON关键字左侧的表的所有数据均显示,关键字右侧的表匹配内容显示,无对应内容使用NULL填充
(3)右外连接RIGHT JOIN
ON关键字右侧的表的所有数据均显示,关键字左侧的表匹配内容显示,无对应内容使用NULL填充
(4)交叉 连接CROSS
JOIN交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积即行数的乘积,并没有实际应用的意义2.子查询
一条SELECT语句嵌套在另一条语句内部,即为子查询。它可以嵌套在SELECT、DELETE、INSERT INTO、CREATE TALBE等语句中。
嵌套查询:一条SELECT语句嵌套在另一条SELECT语句内部所构成的查询。首先会执行内层查询(子查询),然后将返回的结果作为外层查询(主查询)的过滤条件(筛选行)或数据源。
(1)子查询按出现的位置分类:where子查询、from子查询 where
(2)通常情况下,where子查询的语句都可以写成连接查询的语句 子查询作为表
表子查询(FROM子查询)*:子查询的返回结果用于FROM数据源,它是一个符合二维表结构的数据,可以是一行一列、一列多行、一行多列或多行多列。
语法:SELECT 输出项 FROM (SELECT子查询) [AS] 别名;
第五章 达梦数据库高级对象管理
一 、视图管理
视图的优点 简化查询语句 日常开发中,我们可以将经常使用的查询定义为视图,从而使用户避免大量重复的操作。 可提高安全性
通过视图用户只能查询和修改他们所能见到的数据,数据库中的其他数据则既看不到也取不到。 逻辑数据独立性
视图可以帮助用户屏蔽真实表结构变化带来的影响。
1.创建视图
CREATE OR REPLACE VIEW [模式名.]视图名 AS
SELECT语句
[WITH CHECK OPTION];
【例1】建立一个名为v_book_1的视图 ,功能是从图书表中查询书名中包含有“工程数学”的所有记录。
create view v_book_1
as
select * from library00.TBL_BookInfo where BookName like '%工程数学%';
select bookid,isbn,bookname,author from library00.TBL_BookInfo where BookName like '%工程数学%';
#查询
select * from v_book_1;
【例2】在library00模式下建立一个名为v_book_class的视图 ,功能是查询出图书的索取号,书名,出版社,类别名称。
create view library00.v_book_class
as
select a.BookID, a.BookName, a.PublishDate, b.ClassName
From library00.BL_Bookinfo as a
inner join library00.TBL_BookClass as b
on a.ClassID= b.ClassID;
#查询
select * from library00. v_book_class;
2.修改视图
【例3】修改上述【例2】的视图,多查询一个图书作者。
create or replace view library00.v_book_class
as
select a.BookID, a.BookName, a.PublishDate, a.Author, b.ClassName
from library00.TBL_BookInfo as a
inner join library00.TBL_BookClass as b
on a.ClassID= b.ClassID;
#查询
select * from library00.v_book_class;
用SQL语句为view_book1视图插入一条数据:('TB11/6','高等工程数学方法','胡映电','电子工业出版社','1998-07-15','T')
insert into view_book1 values ('TB11/6','788-3-45-3','高等工程数学方法','胡映电','电子工业出版社','1998-07-15','T');
select * from view_book1 where bookid='TB11/6';
#查询
select * from view_book1;
3.删除视图
DROP VIEW [IF EXISTS] [模式名.]视图名1 [,视图名2,…];
例如:
DROP VIEW library00.v_book_class;