news 2025/12/22 10:21:51

国产数据库技术:DM数据库学习实践心得

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
国产数据库技术:DM数据库学习实践心得

目录

  1. 引言:国产数据库的发展背景与学习意义

  2. DM数据库基础认知

  3. DM数据库安装与环境配置实践

  4. DM数据库实例管理与核心配置

  5. DM数据库备份与还原机制及实操

  6. DM数据库函数体系与应用场景

  7. SQL语句查询与优化实践

  8. DM SQL程序设计思路与实现步骤

  9. DM数据库实操问题解决案例分析

  10. 学习总结与未来展望

1 引言:国产数据库的发展背景与学习意义

在数字经济飞速发展的当下,数据库作为信息系统的核心基础设施,其安全性、自主性与可控性直接关系到国家数据安全与产业发展命脉。长期以来,国外数据库产品在国内市场占据主导地位,存在技术壁垒、数据泄露风险以及供应链卡脖子等问题。在此背景下,国产数据库迎来了政策扶持与市场需求双重驱动的发展黄金期,成为保障国家信息安全、推动数字经济自主可控发展的关键支撑。

《国产数据库技术》课程以达梦数据库(DM Database)为核心教学载体,系统讲授了国产数据库的架构设计、核心功能、实操应用及问题解决等内容。达梦数据库作为国内领先的自主研发数据库产品,具有完全自主知识产权,在性能、安全性、兼容性等方面均达到国际先进水平,广泛应用于政务、金融、能源、交通等关键领域。通过本课程的学习,我不仅掌握了DM数据库的核心技术与实操技能,更深刻认识到国产数据库发展的重要性与紧迫性。本文将结合课程所学与实践操作,从多个维度梳理DM数据库的学习心得,总结实践经验与思考感悟。

2 DM数据库基础认知

在深入实操之前,对DM数据库的基础架构与核心特性进行系统认知,是后续学习的重要前提。DM数据库采用C/S(客户端/服务器)架构,支持集中式与分布式部署,能够满足不同规模业务场景的需求。其核心架构主要包括服务器端核心模块、客户端工具以及接口组件三大部分:服务器端核心模块负责数据存储、事务管理、查询优化等核心功能;客户端工具提供可视化的操作界面,方便用户进行数据库管理与维护;接口组件则支持多种编程语言与开发框架,为应用开发提供灵活的集成能力。

从核心特性来看,DM数据库具有以下显著优势:一是高性能,采用多线程并发处理、查询优化器、索引优化等技术,能够高效处理大规模数据查询与事务处理请求;二是高安全性,支持细粒度的权限控制、数据加密、审计日志等安全机制,符合国家信息安全等级保护相关标准;三是高兼容性,兼容SQL92标准,支持多种主流数据库的语法与数据迁移工具,降低了用户从国外数据库迁移的成本;四是高可靠性,提供完善的备份还原机制、故障恢复能力以及集群部署方案,保障数据的完整性与业务的连续性。

此外,DM数据库还支持多种数据类型,包括数值型、字符型、日期时间型、大对象型等,能够满足不同业务场景的数据存储需求。同时,其提供的存储引擎支持行存储与列存储两种模式,行存储适用于频繁更新的业务场景,列存储则适用于大规模数据分析场景,为用户提供了灵活的存储选择。

3 DM数据库安装与环境配置实践

DM数据库的安装与环境配置是后续所有实操的基础,其安装过程涉及操作系统环境检查、安装包准备、参数配置等多个环节,任何一个环节出现问题都可能导致安装失败或后续功能异常。结合课程学习与实践操作,我将详细梳理DM数据库在Windows与Linux两种主流操作系统下的安装流程与配置要点。

3.1 安装前环境检查与准备

在安装DM数据库之前,首先需要对操作系统环境进行检查,确保满足安装要求。对于Windows系统,推荐使用Windows 10及以上版本,内存不低于4GB,硬盘空间不低于10GB;对于Linux系统,推荐使用CentOS 7及以上版本,内核版本不低于3.10,内存不低于4GB,硬盘空间不低于10GB,同时需要关闭防火墙与SELinux,避免影响数据库服务的正常启动与访问。

其次,需要准备DM数据库安装包。可以从达梦官方网站下载对应的安装包,根据操作系统类型选择32位或64位版本。需要注意的是,下载的安装包需要进行解压,Linux系统下还需要赋予安装脚本可执行权限。此外,对于Linux系统,还需要安装必要的依赖库,如glibc、libstdc++等,否则可能导致安装过程中出现依赖缺失错误。

3.2 Windows系统下安装与配置

Windows系统下的DM数据库安装采用图形化界面,流程相对简单,具体步骤如下:

  1. 解压安装包,双击“setup.exe”启动安装程序,进入安装向导界面,点击“下一步”。

  2. 阅读许可协议,勾选“我接受”,点击“下一步”。

  3. 选择安装类型,包括“典型安装”“服务器安装”“客户端安装”“自定义安装”四种。“典型安装”包含服务器、客户端及常用工具,适合新手;“自定义安装”可根据需求选择组件,适合有特定需求的场景。此处选择“典型安装”,点击“下一步”。

  4. 选择安装路径,默认路径为“C:\dmdbms”,建议修改为非系统盘路径,如“D:\dmdbms”,点击“下一步”。

  5. 确认安装信息,点击“安装”,等待安装完成。

  6. 安装完成后,勾选“初始化数据库实例”,点击“完成”,进入数据库实例初始化向导。

数据库实例初始化是关键环节,具体配置要点如下:

  1. 选择实例类型,包括“单实例”“主备实例”“读写分离实例”,此处选择“单实例”,点击“下一步”。

  2. 设置数据库名与实例名,默认数据库名为“DMDB”,实例名为“DMSERVER”,可根据需求修改,点击“下一步”。

  3. 设置端口号,默认端口号为5236,若该端口被占用,需修改为其他未占用端口,点击“下一步”。

  4. 选择数据文件存储路径,建议与安装路径分开,如“D:\dmdata”,点击“下一步”。

  5. 设置页大小、簇大小与日志文件大小。页大小默认8KB,簇大小默认16KB,日志文件大小默认256MB,可根据业务需求调整,点击“下一步”。

  6. 设置数据库管理员(SYSDBA)密码,密码需满足复杂度要求,如“Dm@123456”,点击“下一步”。

  7. 确认初始化信息,点击“完成”,等待实例初始化完成。

实例初始化完成后,可通过“DM服务管理器”启动数据库服务。启动成功后,打开“DM管理工具”,输入服务器地址、端口号、用户名(SYSDBA)及密码,点击“连接”,若连接成功,则说明Windows环境下的DM数据库安装与配置完成。

3.3 Linux系统下安装与配置

Linux系统下的DM数据库安装可采用图形化界面或命令行方式,此处重点介绍命令行方式,步骤如下:

  1. 解压安装包:使用命令“unzip dm8_20230808_x86_rh6_64.zip”解压安装包,得到“dm8_20230808_x86_rh6_64.iso”文件。

  2. 挂载ISO文件:创建挂载目录“/mnt/dm”,使用命令“mount -o loop dm8_20230808_x86_rh6_64.iso /mnt/dm”进行挂载。

  3. 创建用户与用户组:DM数据库不建议使用root用户安装,需创建专用用户,如“dmdba”。使用命令“groupadd dinstall”创建用户组,“useradd -g dinstall dmdba”创建用户,“passwd dmdba”设置用户密码。

  4. 创建安装目录:使用命令“mkdir -p /dm/dmdbms”创建安装目录,并用“chown -R dmdba:dinstall /dm”修改目录权限。

  5. 切换用户并启动安装程序:使用命令“su - dmdba”切换到dmdba用户,进入挂载目录“cd /mnt/dm”,执行安装脚本“./DMInstall.bin -i”,进入命令行安装向导。

  6. 选择语言:输入“1”选择中文,回车。

  7. 接受许可协议:输入“y”,回车。

  8. 选择安装类型:输入“1”选择典型安装,回车。

  9. 确认安装路径:默认路径为“/dm/dmdbms”,直接回车确认。

  10. 确认安装信息:输入“y”,回车,等待安装完成。

  11. 安装完成后,根据提示切换到root用户执行脚本“/dm/dmdbms/script/root/root_installer.sh”,完成系统配置。

Linux系统下的实例初始化可通过“dminit”工具完成,具体命令如下:

cd /dm/dmdbms/bin ./dminit path=/dm/dmdata dbname=DMDB instance_name=DMSERVER port_num=5236 page_size=8 extent_size=16 log_size=256 user_name=SYSDBA password=Dm@123456

参数说明:path为数据文件存储路径,dbname为数据库名,instance_name为实例名,port_num为端口号,page_size为页大小,extent_size为簇大小,log_size为日志文件大小,user_name为管理员用户名,password为管理员密码。

实例初始化完成后,需注册并启动数据库服务,命令如下:

// 切换到root用户 su - root // 注册服务 /dm/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /dm/dmdata/DMDB/dm.ini // 启动服务 systemctl start DmServiceDMSERVER.service // 查看服务状态 systemctl status DmServiceDMSERVER.service

若服务状态显示“active (running)”,则说明服务启动成功。之后可通过“dmgrate”工具或“DM管理工具”远程连接数据库,验证安装与配置效果。

3.4 安装与配置常见问题解决

在DM数据库安装与配置过程中,我遇到了多个常见问题,通过查阅资料与课程学习,总结了相应的解决方法:

  1. Linux系统下安装时提示“依赖库缺失”:解决方法为安装对应的依赖库,CentOS系统可通过“yum install glibc-devel libstdc++-devel”命令安装。

  2. 实例初始化失败,提示“端口被占用”:解决方法为使用“netstat -anp | grep 5236”命令查看占用端口的进程,杀死该进程或修改实例端口号。

  3. Windows系统下数据库服务启动失败:检查实例初始化配置是否正确,特别是数据文件路径与权限设置;若路径包含中文或特殊字符,需重新初始化实例,修改路径为纯英文路径。

  4. 远程连接数据库失败:检查防火墙是否关闭,Linux系统可通过“systemctl stop firewalld.service”命令关闭防火墙;同时确认数据库实例端口号是否正确,服务器地址是否可达。

4 DM数据库实例管理与核心配置

数据库实例是DM数据库的核心运行单元,负责处理客户端请求、管理数据存储与事务处理等工作。实例管理主要包括实例的启动与停止、状态监控、参数配置等内容,合理的实例管理与参数配置能够有效提升数据库性能与稳定性。

4.1 实例的启动与停止

DM数据库实例的启动与停止可通过服务管理器、命令行工具等多种方式实现,不同操作系统下的操作方式略有差异。

在Windows系统下,可通过“DM服务管理器”可视化工具进行操作:打开“DM服务管理器”,选中对应的实例服务(如DmServiceDMSERVER),点击“启动”“停止”或“重启”按钮即可完成相应操作。也可通过命令行方式操作,命令如下:

// 启动服务 net start DmServiceDMSERVER // 停止服务 net stop DmServiceDMSERVER

在Linux系统下,主要通过命令行方式操作,除了前文提到的systemctl命令外,还可通过“dmctl”工具进行实例的启动与停止,命令如下:

// 切换到dmdba用户 su - dmdba // 进入bin目录 cd /dm/dmdbms/bin // 启动实例 ./dmctl start /dm/dmdata/DMDB/dm.ini // 停止实例 ./dmctl stop /dm/dmdata/DMDB/dm.ini // 重启实例 ./dmctl restart /dm/dmdata/DMDB/dm.ini

需要注意的是,停止实例时,若存在未提交的事务,数据库会先回滚这些事务,再关闭实例,因此可能需要一定时间。在生产环境中,建议在停止实例前先确认没有活跃事务,避免数据丢失或损坏。

4.2 实例状态监控

实时监控实例状态是保障数据库正常运行的重要手段,DM数据库提供了多种监控工具与视图,方便用户查看实例的运行状态、性能指标等信息。

在可视化工具方面,“DM管理工具”提供了丰富的监控功能:连接数据库后,在“实例”节点下可查看实例的基本信息,如版本号、运行状态、启动时间等;在“性能监控”节点下,可查看CPU使用率、内存使用率、磁盘I/O、会话数、事务数等性能指标,还可生成性能报表,帮助用户分析数据库运行状况。

在命令行方面,可通过“dmctl”工具查看实例状态,命令如下:

./dmctl status /dm/dmdata/DMDB/dm.ini

此外,DM数据库还提供了系统视图,用户可通过查询系统视图获取详细的实例运行信息,常用的系统视图包括:

  1. V$INSTANCE:查看实例的基本信息,如实例名、数据库名、运行状态、启动时间等。

  2. V$SESSION:查看当前活跃会话信息,包括会话ID、用户名、客户端地址、执行的SQL语句等。

  3. V$TRANSACTION:查看当前活跃事务信息,包括事务ID、状态、开始时间等。

  4. V$RESOURCE_USAGE:查看系统资源使用情况,如CPU、内存、磁盘I/O等。

例如,查询实例基本信息的SQL语句如下:

SELECT INSTANCE_NAME, DB_NAME, STATUS, START_TIME FROM V$INSTANCE;

4.3 核心参数配置

DM数据库的核心参数存储在dm.ini文件中,这些参数直接影响数据库的性能与稳定性。根据参数的生效方式,可分为静态参数与动态参数:静态参数修改后需要重启实例才能生效,动态参数修改后无需重启实例即可生效。

常用的核心参数如下:

  1. INSTANCE_NAME:实例名,静态参数,用于标识数据库实例。

  2. PORT_NUM:端口号,静态参数,数据库实例的监听端口。

  3. BUFFER:数据缓冲区大小,动态参数,用于缓存数据块,提升查询性能,建议根据服务器内存大小调整,一般设置为内存的20%-30%。

  4. LOG_BUFFER:日志缓冲区大小,动态参数,用于缓存事务日志,减少磁盘I/O,建议设置为16MB-64MB。

  5. MAX_SESSIONS:最大会话数,动态参数,用于限制同时连接数据库的会话数量,默认值为100,可根据业务需求调整。

  6. CHECKPOINT_INTERVAL:检查点间隔,动态参数,用于控制数据库将脏数据写入磁盘的频率,默认值为60秒,可根据业务的读写频率调整。

修改参数的方式主要有两种:一是直接编辑dm.ini文件,适合修改静态参数;二是通过SQL语句修改,适合修改动态参数,SQL语句格式如下:

// 修改动态参数 ALTER SYSTEM SET BUFFER = 2048 SPFILE; // 查看参数值 SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM V$PARAMETER WHERE PARA_NAME = 'BUFFER';

需要注意的是,参数配置需结合业务场景与服务器硬件配置,避免盲目调整。例如,若将数据缓冲区设置过大,可能导致操作系统内存不足;若设置过小,则会增加磁盘I/O,降低查询性能。在修改参数后,建议监控数据库性能变化,根据实际效果进行优化。

5 DM数据库备份与还原机制及实操

数据是企业的核心资产,数据库备份与还原是保障数据安全的关键手段。DM数据库提供了完善的备份与还原机制,支持全量备份、增量备份、日志备份等多种备份方式,能够满足不同场景下的数据保护需求。通过课程学习与实践操作,我系统掌握了DM数据库备份与还原的核心原理与实操方法。

5.1 备份与还原核心原理

DM数据库的备份本质上是将数据库中的数据与日志以特定格式存储到备份文件中的过程,还原则是将备份文件中的数据与日志恢复到数据库中的过程。根据备份时数据库的运行状态,可分为联机备份与脱机备份:联机备份是在数据库实例运行状态下进行的备份,不影响业务的正常运行;脱机备份是在数据库实例停止状态下进行的备份,适用于数据量较大、对备份性能要求较高的场景。

全量备份是对数据库中所有数据的完整备份,备份文件较大,但还原速度快;增量备份是基于上一次全量备份或增量备份,仅备份新增或修改的数据,备份文件较小,节省存储空间,但还原时需要先还原全量备份,再依次还原增量备份;日志备份是对数据库事务日志的备份,能够记录数据库的所有变更操作,通过日志备份可以将数据库恢复到任意时间点,提升数据恢复的灵活性。

DM数据库的还原过程分为三个阶段:数据文件还原、日志重演、数据库恢复。数据文件还原是将备份文件中的数据恢复到数据文件中;日志重演是将备份后产生的事务日志重新执行,确保数据的一致性;数据库恢复是将数据库状态恢复到正常运行状态。

5.2 备份实操:全量、增量与日志备份

DM数据库的备份可通过“DM管理工具”与命令行工具“dmrman”实现,此处重点介绍命令行方式,操作更灵活,适合自动化脚本编写。

5.2.1 脱机全量备份

脱机全量备份需要先停止数据库实例,操作步骤如下:

// 停止实例(Linux系统) su - root systemctl stop DmServiceDMSERVER.service // 使用dmrman工具进行脱机全量备份 su - dmdba cd /dm/dmdbms/bin ./dmrman RMAN> BACKUP DATABASE '/dm/dmdata/DMDB/dm.ini' FULL TO BACKUP_FULL_20240520 BACKUPSET '/dm/dmbak/BACKUP_FULL_20240520'; RMAN> EXIT; // 启动实例 su - root systemctl start DmServiceDMSERVER.service

参数说明:FULL表示全量备份,TO指定备份名,BACKUPSET指定备份文件存储路径。

5.2.2 联机全量备份

联机全量备份无需停止实例,可在业务运行过程中进行,命令如下:

-- 连接数据库 ./disql SYSDBA/Dm@123456:5236 -- 执行联机全量备份 BACKUP DATABASE FULL TO BACKUP_FULL_ONLINE_20240520 BACKUPSET '/dm/dmbak/BACKUP_FULL_ONLINE_20240520'; -- 退出 EXIT;

5.2.3 增量备份

增量备份需基于上一次全量备份或增量备份,此处以基于全量备份的增量备份为例,命令如下:

-- 联机增量备份 BACKUP DATABASE INCREMENT BASE ON BACKUPSET '/dm/dmbak/BACKUP_FULL_20240520' TO BACKUP_INCR_20240521 BACKUPSET '/dm/dmbak/BACKUP_INCR_20240521';

参数说明:INCREMENT表示增量备份,BASE ON指定基础备份集路径。

5.2.4 日志备份

日志备份可分为手动日志备份与自动日志备份,手动日志备份命令如下:

-- 手动备份日志 BACKUP LOG DATABASE TO LOG_BACKUP_20240520 BACKUPSET '/dm/dmbak/LOG_BACKUP_20240520';

自动日志备份需要配置日志备份策略,通过修改dm.ini文件中的参数实现:

-- 启用自动日志备份 ALTER SYSTEM SET ARCH_INI = 1 SPFILE; -- 重启实例使参数生效(静态参数) systemctl restart DmServiceDMSERVER.service

之后需要创建归档配置文件dmarch.ini,配置日志备份路径与方式,示例如下:

[ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dm/dmarch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 10240

参数说明:ARCH_TYPE为归档类型,LOCAL表示本地归档;ARCH_DEST为归档文件存储路径;ARCH_FILE_SIZE为单个归档文件大小;ARCH_SPACE_LIMIT为归档空间限制。

5.3 还原实操:全量还原与时间点还原

DM数据库的还原同样可通过“DM管理工具”与“dmrman”工具实现,此处以命令行方式为例,介绍常见的还原场景。

5.3.1 脱机全量还原

脱机全量还原适用于数据库完全损坏或数据丢失的场景,步骤如下:

// 停止实例 su - root systemctl stop DmServiceDMSERVER.service // 使用dmrman工具进行脱机全量还原 su - dmdba cd /dm/dmdbms/bin ./dmrman RMAN> RESTORE DATABASE '/dm/dmdata/DMDB/dm.ini' FROM BACKUPSET '/dm/dmbak/BACKUP_FULL_20240520'; RMAN> RECOVER DATABASE '/dm/dmdata/DMDB/dm.ini' FROM BACKUPSET '/dm/dmbak/BACKUP_FULL_20240520'; RMAN> RECOVER DATABASE '/dm/dmdata/DMDB/dm.ini' UPDATE DB_MAGIC; RMAN> EXIT; // 启动实例 su - root systemctl start DmServiceDMSERVER.service

步骤说明:RESTORE命令用于还原数据文件,RECOVER命令用于重演日志,UPDATE DB_MAGIC命令用于更新数据库魔数,确保数据库正常启动。

5.3.2 联机时间点还原

联机时间点还原适用于需要将数据库恢复到特定时间点的场景,需结合全量备份与日志备份,步骤如下:

-- 1. 连接数据库,设置数据库为还原模式 ./disql SYSDBA/Dm@123456:5236 ALTER DATABASE MOUNT; -- 2. 还原全量备份 RESTORE DATABASE FROM BACKUPSET '/dm/dmbak/BACKUP_FULL_20240520'; -- 3. 重演日志到指定时间点(例如2024-05-20 14:30:00) RECOVER DATABASE UNTIL TIME '2024-05-20 14:30:00' FROM BACKUPSET '/dm/dmbak/LOG_BACKUP_20240520'; -- 4. 恢复数据库为正常模式 ALTER DATABASE OPEN; -- 5. 退出 EXIT;

需要注意的是,时间点还原需确保日志备份文件完整,且指定的时间点在全量备份之后。

5.4 备份与还原常见问题解决

在备份与还原实践过程中,我遇到了以下常见问题,并总结了相应的解决方法:

  1. 脱机备份失败,提示“实例未停止”:解决方法为确保数据库实例已完全停止,可通过“systemctl status DmServiceDMSERVER.service”命令检查实例状态。

  2. 联机备份失败,提示“权限不足”:解决方法为确保执行备份操作的用户具有BACKUP权限,可通过“GRANT BACKUP TO SYSDBA;”命令授予权限。

  3. 还原时提示“备份集损坏”:解决方法为检查备份集文件是否完整,若备份集损坏,需重新进行备份;也可通过“dmrman”工具的“CHECK BACKUPSET”命令检查备份集完整性。

  4. 时间点还原失败,提示“日志文件缺失”:解决方法为确保日志备份文件完整,且覆盖了指定的时间点;若日志文件缺失,需重新进行日志备份,或调整时间点为日志覆盖的范围。

6 DM数据库函数体系与应用场景

函数是DM数据库的重要组成部分,用于实现特定的计算逻辑与数据处理功能。DM数据库提供了丰富的函数,包括数值函数、字符函数、日期时间函数、聚合函数、系统函数等,覆盖了大部分数据处理场景。掌握函数的用法,能够大幅提升SQL语句的编写效率与数据处理能力。

6.1 常用函数分类与用法

6.1.1 数值函数

数值函数用于对数值型数据进行计算,常用的数值函数包括:

  1. ABS(x):返回x的绝对值。示例:SELECT ABS(-10) FROM DUAL; 结果:10。

  2. ROUND(x, n):将x四舍五入到小数点后n位,n默认值为0。示例:SELECT ROUND(3.14159, 2) FROM DUAL; 结果:3.14。

  3. CEIL(x):返回大于等于x的最小整数。示例:SELECT CEIL(3.2) FROM DUAL; 结果:4。

  4. FLOOR(x):返回小于等于x的最大整数。示例:SELECT FLOOR(3.8) FROM DUAL; 结果:3。

  5. MOD(x, y):返回x除以y的余数。示例:SELECT MOD(10, 3) FROM DUAL; 结果:1。

6.1.2 字符函数

字符函数用于对字符型数据进行处理,常用的字符函数包括:

  1. CONCAT(s1, s2):连接两个字符串s1与s2。示例:SELECT CONCAT('DM', 'Database') FROM DUAL; 结果:DMDatabase。

  2. LENGTH(s):返回字符串s的长度。示例:SELECT LENGTH('达梦数据库') FROM DUAL; 结果:5。

  3. SUBSTR(s, start, length):从字符串s的start位置开始,截取length个字符,start从1开始计数。示例:SELECT SUBSTR('DMDatabase', 2, 3) FROM DUAL; 结果:MDB。

  4. TRIM(s):去除字符串s两端的空格。示例:SELECT TRIM(' DM DB ') FROM DUAL; 结果:DM DB。

  5. UPPER(s):将字符串s转换为大写。示例:SELECT UPPER('dmdb') FROM DUAL; 结果:DMDB。

  6. LOWER(s):将字符串s转换为小写。示例:SELECT LOWER('DMDB') FROM DUAL; 结果:dmdb。

6.1.3 日期时间函数

日期时间函数用于对日期时间型数据进行处理,常用的日期时间函数包括:

  1. SYSDATE():返回当前系统日期与时间。示例:SELECT SYSDATE() FROM DUAL; 结果:2024-05-20 15:30:20。

  2. DATEADD(date, n, type):在日期date上增加n个指定类型的时间单位,type可取值为YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。示例:SELECT DATEADD('2024-05-20', 1, 'DAY') FROM DUAL; 结果:2024-05-21。

  3. DATEDIFF(date1, date2, type):计算date1与date2之间的时间差,单位为type指定的类型。示例:SELECT DATEDIFF('2024-05-20', '2024-05-18', 'DAY') FROM DUAL; 结果:2。

  4. TO_CHAR(date, format):将日期时间型数据转换为指定格式的字符串。示例:SELECT TO_CHAR(SYSDATE(), 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; 结果:2024-05-20 15:35:40。

  5. TO_DATE(s, format):将字符串s转换为日期时间型数据。示例:SELECT TO_DATE('2024-05-20 16:00:00', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; 结果:2024-05-20 16:00:00。

6.1.4 聚合函数

聚合函数用于对一组数据进行聚合计算,返回单个结果值,常用的聚合函数包括:

  1. SUM(x):计算一组数值的总和。示例:SELECT SUM(salary) FROM employee; 结果:所有员工工资的总和。

  2. AVG(x):计算一组数值的平均值。示例:SELECT AVG(salary) FROM employee; 结果:所有员工工资的平均值。

  3. MAX(x):返回一组数据中的最大值。示例:SELECT MAX(salary) FROM employee; 结果:员工中的最高工资。

  4. MIN(x):返回一组数据中的最小值。示例:SELECT MIN(salary) FROM employee; 结果:员工中的最低工资。

  5. COUNT(x):统计一组数据的行数,x为*时统计所有行数,x为列名时统计非空值的行数。示例:SELECT COUNT(*) FROM employee; 结果:员工总数。

6.1.5 系统函数

系统函数用于获取数据库系统信息,常用的系统函数包括:

  1. USER():返回当前登录用户的用户名。示例:SELECT USER() FROM DUAL; 结果:SYSDBA。

  2. DB_NAME():返回当前数据库的名称。示例:SELECT DB_NAME() FROM DUAL; 结果:DMDB。

  3. INSTANCE_NAME():返回当前数据库实例的名称。示例:SELECT INSTANCE_NAME() FROM DUAL; 结果:DMSERVER。

  4. VERSION():返回当前DM数据库的版本号。示例:SELECT VERSION() FROM DUAL; 结果:DM Database Server 64 V8。

6.2 函数应用场景实例

为了更好地理解函数的应用,结合实际业务场景,举例说明函数的综合使用:

6.2.1 场景一:员工信息统计

现有employee表,包含员工ID(emp_id)、姓名(emp_name)、部门(dept)、工资(salary)、入职时间(hire_date)等字段,需完成以下统计需求:

  1. 统计每个部门的员工总数、平均工资、最高工资、最低工资。

  2. 统计入职时间在2020年1月1日之后的员工数量。

  3. 查询员工姓名的拼音首字母(假设姓名为中文,使用SUBSTR函数截取每个字的首字母,此处仅为示例,实际中文转拼音需结合特定函数或工具)。

6.2.2 场景二:订单数据处理

现有order表,包含订单ID(order_id)、客户ID(cust_id)、订单金额(amount)、订单时间(order_time)等字段,需完成以下数据处理需求:

  1. 计算每个客户的订单总金额,并按总金额降序排序。

  2. 查询2024年5月的订单数量,并按日期分组。

  3. 对订单金额进行四舍五入,保留1位小数,并计算平均订单金额。

6.3 自定义函数的创建与使用

除了系统提供的函数外,DM数据库还支持用户创建自定义函数,以满足特定的业务需求。自定义函数的创建使用CREATE FUNCTION语句,语法如下:

CREATE OR REPLACE FUNCTION 函数名(参数1 类型, 参数2 类型, ...) RETURN 返回类型 AS 变量声明; BEGIN 函数体; RETURN 返回值; EXCEPTION 异常处理; END;

示例:创建一个自定义函数,计算两个数的乘积:

CREATE OR REPLACE FUNCTION CALC_PRODUCT(a INT, b INT) RETURN INT AS result INT; BEGIN result := a * b; RETURN result; EXCEPTION WHEN OTHERS THEN RETURN NULL; END; /

调用自定义函数:

SELECT CALC_PRODUCT(5, 6) FROM DUAL; -- 结果:30

需要注意的是,自定义函数的参数类型与返回类型需明确指定,函数体中需包含RETURN语句返回结果;若函数执行过程中出现异常,可通过EXCEPTION块进行处理。创建自定义函数后,可通过DROP FUNCTION语句删除函数:

DROP FUNCTION CALC_PRODUCT;

7 SQL语句查询与优化实践

SQL语句是与DM数据库交互的核心方式,掌握高效的SQL查询技巧与优化方法,能够显著提升数据查询效率,减少数据库资源占用。在课程学习过程中,我系统学习了SQL查询的基础语法、复杂查询的编写方法,并通过实践掌握了SQL优化的核心思路与技巧。

7.1 SQL查询基础与复杂查询编写

7.1.1 基础查询

基础查询是SQL查询的基础,主要使用SELECT语句实现,语法如下:

SELECT 列名1, 列名2, ... FROM 表名 WHERE 条件表达式 GROUP BY 列名 HAVING 聚合条件 ORDER BY 列名 [ASC/DESC];

示例:查询employee表中部门为“技术部”且工资大于5000的员工信息,按工资降序排序:

SELECT emp_id, emp_name, salary, hire_date FROM employee WHERE dept = '技术部' AND salary > 5000 ORDER BY salary DESC;

7.1.2 连接查询

连接查询用于查询多个表中的数据,DM数据库支持内连接、左连接、右连接、全连接等多种连接方式:

  1. 内连接(INNER JOIN):只返回两个表中匹配条件的记录。示例:查询员工信息及其所属部门的信息(employee表与dept表通过dept_id关联):

  2. 左连接(LEFT JOIN):返回左表中的所有记录,以及右表中匹配条件的记录,右表中无匹配记录时返回NULL。示例:查询所有员工信息及其所属部门信息,若员工无所属部门则部门信息为NULL:

  3. 右连接(RIGHT JOIN):与左连接相反,返回右表中的所有记录,以及左表中匹配条件的记录,左表中无匹配记录时返回NULL。

  4. 全连接(FULL JOIN):返回两个表中的所有记录,无匹配记录时返回NULL。

7.1.3 子查询

子查询是嵌套在主查询中的查询语句,用于实现复杂的查询逻辑,可分为单行子查询、多行子查询、相关子查询等:

  1. 单行子查询:返回单个结果值的子查询,常用的比较运算符有=、>、<等。示例:查询工资高于平均工资的员工信息:

  2. 多行子查询:返回多个结果值的子查询,常用的运算符有IN、ANY、ALL等。示例:查询部门为“技术部”或“销售部”的员工信息:

  3. 相关子查询:子查询的执行依赖于主查询的结果,每执行一次主查询,子查询都会重新执行一次。示例:查询每个部门中工资最高的员工信息:

7.1.4 分页查询

分页查询用于在大量数据中按页获取数据,DM数据库支持使用ROW_NUMBER()函数实现分页,语法如下:

SELECT * FROM (SELECT 列名1, 列名2, ..., ROW_NUMBER() OVER (ORDER BY 排序列) AS row_num FROM 表名 WHERE 条件) t WHERE t.row_num BETWEEN 起始行 AND 结束行;

示例:查询employee表中第11-20条员工信息,按入职时间降序排序:

SELECT * FROM (SELECT emp_id, emp_name, dept, hire_date, ROW_NUMBER() OVER (ORDER BY hire_date DESC) AS row_num FROM employee) t WHERE t.row_num BETWEEN 11 AND 20;

7.2 SQL优化核心思路与技巧

SQL优化的核心目标是减少数据库的I/O操作、提升查询效率,其核心思路是通过分析SQL语句的执行计划,找出性能瓶颈,然后采取相应的优化措施。以下是我总结的SQL优化技巧:

7.2.1 合理使用索引

索引是提升查询效率的重要手段,能够加快数据查找速度。但索引并非越多越好,过多的索引会增加数据插入、更新、删除的开销。优化建议:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/12 14:54:20

Flipper Zero终极指南:一键解锁Amiibo模拟完整攻略

Flipper Zero终极指南&#xff1a;一键解锁Amiibo模拟完整攻略 【免费下载链接】Flipper Playground (and dump) of stuff I make or modify for the Flipper Zero 项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper 还在为心仪的Amiibo玩具价格望而却步吗&…

作者头像 李华
网站建设 2025/12/12 14:53:48

Katana爬虫框架:解锁学术数据采集的实用工具

面对海量学术文献&#xff0c;你是否还在为手动下载论文、处理动态页面而烦恼&#xff1f;Katana爬虫框架正是为解决这些痛点而生&#xff0c;它不仅能高效爬取学术论文&#xff0c;还能自动化完成文献收集&#xff0c;是现代研究者的必备工具。 【免费下载链接】katana 下一代…

作者头像 李华
网站建设 2025/12/12 14:49:07

突破性AI绘图革命:4-bit量化让普通电脑畅享专业级图像生成

Nunchaku团队联合MIT韩松实验室推出的nunchaku-flux.1-krea-dev模型&#xff0c;通过创新的SVDQuant技术实现4-bit量化压缩&#xff0c;让16GB显存的笔记本电脑也能流畅运行原本需要24GB显存的12B参数FLUX.1-Krea-dev模型&#xff0c;开启AI创作的"算力普惠化"时代。…

作者头像 李华
网站建设 2025/12/12 14:44:29

【光照】UnityURP中的[HDR贴图]

HDR贴图的概念与特性HDR(高动态范围)贴图是Unity URP中用于存储超出标准0-1范围光照信息的特殊纹理格式。与普通LDR(低动态范围)贴图相比&#xff0c;HDR贴图能够存储更广范围的亮度值&#xff0c;通常使用16位或32位浮点精度而非8位整数精度。HDR贴图主要分为两类&#xff1a;…

作者头像 李华
网站建设 2025/12/12 14:40:29

猕猴桃目标检测_yolo13-seg-DWR_模型训练与优化

1. 猕猴桃目标检测_yolo13-seg-DWR_模型训练与优化 1.1. 引言 猕猴桃作为经济价值较高的水果&#xff0c;其种植过程中的果实检测与计数对产量评估和种植管理至关重要。&#x1f60a; 随着深度学习技术的快速发展&#xff0c;基于计算机视觉的目标检测方法在农业领域展现出巨…

作者头像 李华
网站建设 2025/12/12 14:29:13

XGW-9000 系列高端新能源电站边缘网关产品需求文档(PRD)V2

XGW-9000 系列高端新能源电站边缘网关产品需求文档&#xff08;PRD&#xff09; 1. 文档概述 1.1 文档目的与范围 本产品需求文档&#xff08;PRD&#xff09;详细描述了 XGW-9000 系列高端新能源电站边缘网关的功能特性、技术要求和用户体验设计。文档旨在为研发、测试、设计等…

作者头像 李华