达梦数据库简明开发指南-V10.docx
目 录前言1第 1 章 达梦数据库开发概述21.1 预备知识21.2 达梦数据库的模式21.3 基于达梦的应用开发41.4 其他的开发环境7第 2 章 数据查询与操作92.1 浏览数据库对象92.2 使用查询访问数据112.3 增加、修改和删除数据292.4 事务控制32第 3 章 使用数据库对象373.1 使用数据类型373.2 创建和使用表383.3 使用视图493.4 使用序列523.5 使用同义词54第 4 章 使用存储过程564.1 存储过程概述564.2 创建与使用独立的过程和函数564.3 创建和使用包634.4 使用变量和常量664.5 程序控制流694.6 使用复合数据结构734.7 使用游标来访问数据集754.8 使用集合和数组804.9 错误与异常处理84第 5 章 使用触发器885.1 设计触发器885.2 创建和使用触发器90第 6 章 如何发布达梦数据库应用程序956.1 发布概述956.2 准备环境956.3 做好计划:处理数据库对象的依赖性966.4 导出数据库对象976.5 数据导出1006.6 脚本执行1046.7 环境确认1046.8 安装脚本的归档105前言本指南是为了对 DM 数据库感兴趣,希望使用 DM 进行应用开发却又不太了解 DM 数据库的应用开发人员而编写的。文中介绍了 DM 数据库的基本概念和客户端工具,如何使用 SQL 和PL/SQL 来操纵 DM 数据库以及如何发布达梦数据库的应用程序。本文的读者应该对关系数据库的基础理论有基本的了解,那么接下来就可以随着本文开始使用 DM 进行应用开发的旅程了。在阅读完本文后,您将已经可以在 DM 上规划自己的应用,建立相应合适的数据库对象并操纵对象数据,并最终发布自己的应用脚本。当然,DM 的功能远远不止本文所列,如果希望对 DM 应用开发有更全面和更深的理解,推荐您继续阅读。您 可 以 在 达 梦 数 据 库 有 限 公 司 的 官 网 上 下 载 到 所 有 相 关 用 户 文 档105第 1 章 达梦数据库开发概述1.1 预备知识本文是使用 DM 进行应用开发的入门级指南,针对的读者是刚开始使用 DM 数据库进行 应用开发的技术人员,通过阅读本文能创建并维护用 DM 产品开发的数据库应用程序和组件。当然,作为数据库应用开发人员,读者应该已经具备应用开发的基本能力,包括如何实现应用逻辑所要求的数据模型,如何实现具有指定功能的访问和操纵应用数据的功能模块等。用户只能通过客户端程序访问 DM 数据库,SQL 语言是访问 DM 数据库的最基本接口。本文将会介绍 DM 产品包中包含的Manager 和 Disql 两个客户端工具,它们让用户可以不需要编写任何应用程序即可以运行 SQL 语句,应用开发人员可以使用这两个工具来测试应用 程序中的 SQL 语句。DM 还支持 PL/SQL,作为第三代语言,PL/SQL 具有比SQL 语言更加强大的功能,且与 SQL 语言契合紧密,可以在 PL/SQL 程序中调用 SQL 语言。这样,PL/SQL 就能够实现表、索引、视图、触发器等各种数据库对象的定义以及对象数据的操纵。通过使用 DM 的模式和权限机制,PL/SQL 还能够安全地隐藏客户端程序的实现。因此,我们推荐用户在客户端程序中尽可能使用 PL/SQL 子程序来进行数据库访问。本文介绍的内容主要包含但不仅仅止于如下:n 使用达梦数据库进行应用开发涉及的基本概念和客户端工具n 使用数据库定义语言 DDL 建立 DM 数据库对象,使用数据库操纵语言 DML 对数据库对象数据进行增、删、改、查n 使用 DDL、DML、查询、事务控制语句编写 PL/SQL 子程序以及存储过程n 通过实例展示如何发布一个达梦数据库应用程序1.2 达梦数据库的模式1.2.1 模式对象模式是 DM 数据库的逻辑单位。一个模式可包含许多数据库对象,同时每一个模式对应一个用户。通常每个用户都有一个同名的模式对应,即用户是该模式的拥有者。当使用用户名和密码连接到数据库上时,即可以访问同名模式的所有对象。通常模式包含表、视图、索引、触发器和序列等对象。n 表,是数据库存储数据的基本单位。用户能向表中插入、更新和删除数据,且能查询自己感兴趣的数据。每个表都包含若干行记录,每个记录又包含若干列,每个列可以为不同的数据类型,如 INT、VARCHAR、DATE 等。n 索引,索引是一个重要的模式对象,其对于提升数据访问效率有很大作用。索引通常是基于表上的一个或多个列,索引的维护是自动的,无需用户操心。n 视图,出于业务逻辑和安全性的考虑,用户可能需要建立一些视图。视图是基于一个或多个表的虚表。n 序列,如果在一个应用程序中,表的每行记录必须被唯一标记出来,这时我们可以使用序列,生成一组连续的、唯一的整数用来标记表的每一行记录。n 同义词,相当于模式对象的别名。同义词使应用可以更安全、更便利地引用数据库对象。n 存储过程,通常是 PL/SQL 的代码块。这些代码块存储在数据库中,可以被客户端调用,完成的特殊的功能。n 触发器,可以触发一段程序代码的执行。当满足触发器设定的执行条件或时间时,自动运行这段程序。触发器可以基于表,视图等。1.2.2 模式示例安装 DM 时,如果选择安装示例库,系统会自动安装一个名为 BOOKSHOP 的示例库。该示例库中,默认数据库名称为 DAMENG,默认实例名为 DMSERVER。示例库 BOOKSHOP 模拟武汉代理图书的某销售公司,该公司欲建立在线购物平台来拓展其代理产品的销售渠道,该在线购物平台支持网上产品信息浏览、订购等服务(仅限同城内销售及送货)。该实例库是很经典的应用。示例库中已创建了 RESOURCES、PERSON、PRODUCTION、PURCHASING、SALES、OTHER这 6 个模式和相关的表,并在表中插入了一些初始数据。以下是几个在示例库中建立一些模式对象的例子。CREATE INDEX IND1 ON PURCHASING.VENDOR (VENDORID);CREATE UNIQUE INDEX IND2 ON PURCHASING.VENDOR (ACCOUNTNO, NAME);例1-1 假设具有DBA 权限的用户在PURCHASING 表中,以VENDORID 为索引列建立索引IND1,以 ACCOUNTNO,NAME 为索引列建立唯一索引 IND2。CREATE VIEW PURCHASING.VENDOR_EXCELLENT ASSELECT VENDORID, ACCOUNTNO, NAME, ACTIVEFLAG, CREDIT FROM PURCHASING.VENDORWHERE CREDIT = 1;例 1-2 对 VENDOR 表创建一个视图,名为 VENDOR_EXCELLENT,保存信誉等级为 1 的供应商,列名有:VENDORID,ACCOUNTNO,NAME,ACTIVEFLAG。CREATE OR REPLACE PROCEDURE RESOURCES.PROC_1(A IN OUT VARCHAR) AS TOTAL_NUM INT;BEGINSELECT COUNT(*) INTO TOTAL_NUM FROM RESOURCES.EMPLOYEE; DBMS_OUTPUT.PUT_LINE(TOTAL_NUM);例 1-3 创建一个简单的存储过程,统计并打印 RESOURCES.EMPLOYEE 表中雇员的人数。END;SET SCHEMA OTHER;CREATE OR REPLACE TRIGGER DEPT_DEL_UPD_CASCADE AFTER DELETE OR UPDATE ON OTHER.DEPTTAB FOR EACH ROW BEGINIF DELETING THENDELETE FROM OTHER.EMPTAB WHERE DEPTNO = :OLD.DEPTNO;ELSEUPDATE OTHER.EMPTAB SET DEPTNO = :NEW.DEPTNO WHERE DEPTNO = :OLD.DEPTNO;END IF;END;例 1-4 表 OTHER.DEPTTAB 和表 OTHER.EMPTAB 为引用表和被引用表的关系。 表 OTHER.DEPTTAB 为被引用表,其主关键字为 DEPTNO 列,表 OTHER.EMPTAB 为引用表。我们可以建立一个触发器来实现在删除被引用表 OTHER.DEPTTAB 的行时级联删除表 OTHER.EMPTAB 中的对应行。1.3 基于达梦的应用开发本节将介绍 SQL 和 PL/SQL 这两种数据访问语言,介绍 DM 数据库提供的两种开发工具DM 管理工具和 DISQL。并提供一个实例介绍如何连接到达梦数据库。1.3.1 SQL 与 PL/SQL 语言作为数据库应用开发人员,读者应该已经对结构化查询语言即 SQL 语言有一定的了解。 SQL 是专为数据库二建立的操作命令集,是一种功能齐全的数据库语言,它通过声明获取数据所需要的条件来描述问题。用户可以使用 SQL 语句查询表获取数据,创建或修改对象以及执行管理任务。当运行一条 SQL 语句时,SQL 语言编译器会自动解析并访问数据库,去执行需要完成的任务。程序式 SQL 语言,又称为 PL/SQL,是对 SQL 语言的扩展。它集成了面向过程语言的过程结构和强大的数据库操作,为设计复杂的数据库应用提供了功能强大、健壮可靠的设计语言。PL/SQL 允许声明常量和变量、定义存储过程和函数、使用集合和对象类型、捕获运行时异常、以及函数、包、存储过程和触发器的创建等。更多的 SQL 和PL/SQL 使用信息可以参考DM_SQL。1.3.2 图形管理器(DM 管理工具)DM 管理工具(Manager)是一个访问 DM 数据库实例的图形化工具。用户可以使用Manager 进行数据库对象的管理,也可以同时进行 SQL 和 PL/SQL 的开发。在安装 DM 数据库时同时选择安装客户端工具,在安装完成后就可以使用 Manager。JAVA VERSION在运行 DM 管理工具之前,需要保证当前运行环境中已安装有 Java 1.6 以上的版本,可以通过输入以下命令来查看:JAVA VERSION "1.6.0_22"JAVA(TM) SE RUNTIME ENVIRONMENT (BUILD 1.6.0_22-B04)JAVA HOTSPOT(TM) CLIENT VM (BUILD 17.1-B03, MIXED MODE, SHARING)会有类似下面的输出:启动管理工具:1. linux 环境下:(1) 点击 Application 按钮(Gnome)或者 K 按钮(KDE)。(2) 选择达梦数据库 客户端 DM 管理工具2. windows 环境下:(1) 点击开始按钮,选择所有程序。(2) 选择达梦数据库 客户端 DM 管理工具Manager 的主要工作界面如下图,提供有导航栏和工作区。更多的管理工具使用信息请参看管理工具的联机帮助。1.3.3 命令行工具(DISQL)达梦 DISQL 是用来与达梦数据库进行交互的命令行客户端工具。在 DISQL 中,可以运行SQL 语句和 DISQL 命令。SQL 语句在 DISQL 中执行完后,都被保存在一个特定的内存区域中。用户可以通过上下键查找到这些保存在内存中的 SQL 语句,并可以进行修改,然后再次执行。除了 SQL 语句,还可以在DISQL 中执行命令,它们可以被用来对输出的结果进行格式化显示,也有一些 DISQL命令可以实现屏显内容导出、定义本地变量等特定功能。关于 DISQL 支持的命令的具体介绍,请参看DM_DBA1.3.4 如何连接到达梦用户可以通过 DM 客户端工具连接达梦数据库,本节介绍如何通过图形管理器 Manager和命令行工具 DISQL 连接 DM 数据库。n 通过 MANAGER 工具连接数据库Manager 工具是一个图形界面客户端工具,用户可以通过它访问达梦数据库。本小节假设 Manager 工具已经安装在您的系统中,主要说明如何启动并连接到达梦数据库。如果没有安装,参见DM 安装手册。使用 1.3.2 节中介绍的步骤打开Manager 的主界面,之后可通过如下步骤连接和退出达梦数据库。Ø 导航窗口,点击新建连接,出现登陆界面。在登陆界面上输入主机名、端口、用户名、口令,点击确定,连接到达梦数据库。Ø 导航窗口,点击断开连接,退出与达梦数据库连接。n 通过 DISQL 连接数据库DISQL 是一个用来访问达梦数据库的命令行客户端工具。本小节说明如何启动 DISQL 并连接达梦数据库。连接到达梦数据库的步骤:1. 打开命令行提示工具。2. 在命令行提示工具中输入 disql,然后按下回车键,DISQL 启动,并提示输入用户名。3. 输入用户名并回车,DISQL 提示输入密码。4. 输入密码并回车,连接到达梦数据库。连接成功后,便进入到 DISQL 环境,在 SQL>提示下,你可以输入并运行 DISQL 命令、SQL 语句、PL/SQL 语句等。输入 exit 命令并按回车,则退出 DISQL。DISQL V7.1.2.157-BUILD(2013.08.26-33558TRUNC)用户名:登录用户名密码:登录密码服务器LOCALHOST:5236:处于普通打开状态使用普通用户登录登录使用时间: 7.916(毫秒)SQL>SELECT COUNT(*) FROM RESOURCES.EMPLOYEE;例 1-5 启动 DISQL,连接达梦数据,运行一个 SELECT SQL 语句,然后退出 DISQL。用户输入使用粗体。行号COUNT(*)18已用时间: 0.459(毫秒). 执行号:150.SQL>EXIT1.4 其他的开发环境本节介绍可以用来开发基于 DM 数据库的应用程序的其他环境和语言,这部分内容并非本文的主要关注部分,需要详细了解的可以参看DM_PROGRAM。n DPIDPI(Dameng Programming Interface)提供了访问 DM 数据库的最直接途径。其实现参考了Microsoft ODBC3.0 标准,函数功能以及调用过程与 ODBC3.0 十分类似。n ODBCODBC(Open Database Connectivity)是一组访问数据库的标准接口。DM ODBC 遵照Microsoft ODBC3.0 规范设计与开发,实现了 ODBC 应用程序与 DM 的互连接口。用户可以直接调用 DM ODBC3.0 接口函数访问 DM,也可以使用可视化编程工具如 C+ Builder、PowerBuilder 等利用 DM ODBC3.0 访问 DM 数据库。n OLEDBOLEDB(Object Linking and Embedding, Database)是微软为以统一方式访问不同类型的数据存储而设计的一种应用程序开发接口,是一组用组件对象模型(COM)实现的接口,而与对象连接与嵌入(OLE)无关。DM OLEDB 符合 OLEDB 规范,用户可以使用 DM OLEDB 建立数据库连接,执行命令并进行结果处理。n JDBCJDBC(Java Database Connectivity)是 Java 应用程序与数据库的接口规范,旨在让各数据库开发商为 Java 程序员提供标准的数据库应用程序编程接口(API)。JDBC 定义了一个跨数据库、跨平台的通用 SQL 数据库 API。DM JDBC 驱动程序是 DM 数据库的 JDBC 驱动程序,支持 JDBC4.0 标准,支持一般的 SQL数据库接口和分布式事务 XA,提供 SQL、PL/SQL 数据类型到 Java 数据类型的转换。n PRO*CPRO*C 是 Oracle 提供的应用程序专用开发工具,它以 C 语言为宿主语言,能在 C 程序中嵌入 SQL 语言,进行数据库操作。这种嵌入式的 SQL 语言容易掌握,适合初学者。DM PRO*C 是参照 Oracle PRO*C 的接口标准,结合自身的特点,为开发人员提供兼容Oracle 功能的一款接口产品。n .NET Data Provider.NET Data Provider 是.NET Framework 编程环境下的数据库用户访问数据库的编程接口,DM 提供了符合接口规范的 DM .NET Data Provider,用户可以使用此接口连接到数据库、执行命令和检索结果。n PHPPHP(Hypertext Preprocessor)是一种开源的通用计算机脚本语言,尤其是用于网络开发并可嵌入 HTML 中使用。DM PHP 是在 PHP 开放源码的基础上开发的一个动态扩展库,接口的实现参考了 MySQL的 PHP 扩展。PHP 应用程序可通过 DM PHP 扩展接口库访问 DM 数据库服务器。n DCIOCI(Oracle Call Interface)是 Oracle 公司开发的一个应用程序开发接口,它支持 SQL 所有的数据定义、数据操作、查询、事务管理等操作,支持 C 和 C+的数据类型、调用、语法和语义。DM DCI 是参照 OCI 的接口标准,结合自身的特点,为开发人员提供 Oracel 兼容功能的一款接口产品。n FLDRFLDR(Fast Loader)是 DM 数据库提供的能够快速将文本数据载入或导出 DM 数据库的一种接口。用户通过使用 FLDR 接口能把按照一定格式排序的文本数据以最简单、快速、高效的方式载入到达梦数据库中。n PythonPython 是一种面向对象、只译试计算机编程语言,具有近二十年的发展历史,成熟且稳定。Python 提供一套数据库访问接口,供程序员使用。DM PYTHON 利用原生 Python 语言实现了这套接口,使得程序员使用 Python 接口操作DM 数据库更加快速、高效。第 2 章 数据查询与操作本章主要介绍如何浏览 DM 数据库中的各种对象,如何对表数据进行增、删、改和查询操作,以及如何使用事务来管理数据库操作。本章包含以下内容:n 浏览数据库对象与表数据n 使用查询访问数据n 增加、修改和删除数据n 使用提交、回滚和保存点进行事务控制2.1 浏览数据库对象DM 数据库对象包含模式对象、用户、角色、表空间等,其中模式对象构成了整个数据库对数据的存储、查询以及操纵的基础。2.1.1 模式对象的类型DM 数据库支持多模式结构,用户可以根据自己的需求创建不同的模式,方便对模式进行分类管理,以及提供安全性保障。DM 的模式对象类型包括表、视图、存储过程函数、触发器、包、外部表、类、物化视图、同义词、域等。其中表、视图、外部表、物化视图、同义词、域等提供了用户查询数据的形式多样化,无论本地还是远程数据,都可以创建相关定义来方便查询操作,存储过程函数、包等则给用户提供了一种过程化语言,用户可以按照需求创建能完成特定功能的对象。用户可以使用 SQL 查询语句查询 DM 的数据字典或系统视图来查看模式对象,但更直观的方式当然是使用 Manager 图形管理工具,通过简单点击鼠标即可直观地查看某个模式中各种类型的对象。通过 Manager 连接 DM 服务器后,点击要查看的具体模式对象,如PERSON,则显示如下可以看到 DM 提供了表、外部表、视图等多种模式对象。ü 表是数据库中最基本的单元,用户可以访问的数据都是保存在表中的。ü 视图是从一个或多个表或视图导出的虚表。数据库中仅仅存放视图的定义,而不实际存放数据。ü 外部表是为访问远程数据库某一对象而定义的一种表。ü 物化视图是从一个或几个基表导出的表,同视图相比,它存储了导出表的真实数据。ü 存储过程是存储在数据库中可以执行的PL/SQL 程序对象。ü 存储函数类似存储过程,与其不同的是存储函数必须返回一个值。而存储过程没有返回值。ü 包是包含了多种存储过程或函数的对象总集。ü 触发器为当某些与数据库有关的事件发生时,数据库应该采取的操作。DM 触发器可以是在对数据增删改之前或之后触发,也可以在某些特定系统时间发生时触发或在某个指定的时间触发。ü 序列用来自动生成唯一的整数值。ü 类是一种扩展型的数据库类型结构,可以包含多种基础的数据库类型(INT、VARCHAR等),或者用户自定义类型。ü 同义词是为表或视图等对象重新定义的别名,可以通过访问这个别名来达到访问该数据库对象的目的。ü 域是一个可允许值的集合。要查看某类模式对象具体有哪些对象,只需要继续点击想查看的对象类型,如希望查看有哪些具体的表对象,可双击“表”图标或点击图标之前的“+”。图标下方将展开显示模式中所有的表,包括一个“系统表”子目录图标和所有属于该模式的用户自定义表的表名。2.1.2 浏览表数据表是保存用户数据的对象,每个表都是一个二维对象,包含若干行记录,每个记录又包含若干列,每个列可以为不同的数据类型。n 使用 DISQL 命令行工具浏览表数据SELECT * FROM PERSON.PERSON;在 DISQL 命令行工具的提示符 SQL>后输入查询数据的 SQL 语句,然后回车即可,简单的查询语句如下例所示。DISQL 会以简单的报表形式在查询语句下方显示查询结果,如下图所示为查询结果的部分显示,可以使用 DISQL 命令对显示格式进行调整。n 使用 Manager 浏览数据在 2.1.1 中我们已经能够看到模式下的表,双击选中的表或点击表前的“+”,可以查看表的列、键、约束、触发器和索引等信息。若要浏览表数据,可以在选中的表上右击鼠标,弹出右键菜单,选择菜单中的“浏览数据”,在右边的工作区面板中会以表格方式显示全表的所有数据,下图为部分结果的截图。2.2 使用查询访问数据数据库查询使用户可以从数据库中保存的大量数据中选取自己感兴趣的部分数据进行查看,是数据库的核心操作。SELECT 查询语句从一个或多个基本表(表和视图)对象中选取数据,还可以把一个查询嵌套在另一个查询中,称为子查询。DM 语言提供了功能丰富的查询方式,查询 SQL 语法形式多样,且可以在 SQL 语句中对数据进行一些列的运算操作,如加减乘运算、聚集函数运算等。2.2.1 从表中查询数据SELECT PERSONID, NAME, SEX FROM PERSON.PERSON;从数据库表中查询数据,最简单的查询 SQL 语句类似于:其中 PERSON.PERSON 为表名 PERSONID, NAME, SEX 为表中的列名。可以在 DISQL 命令行工具的提示符 SQL>后输入查询语句,然后回车执行。Manager 工具也支持执行 SQL 语句:ü 点击工具栏中的“新建查询”ü 在右边新增的空白面板中输入查询表数据的语句ü 点击工具栏的执行按钮,语句执行的消息和返回结果集会显示在下方面板中2.2.2 使用列别名显示查询结果时,每个列的默认列头是列名。如 2.2.1 节中的查询语句的结果显示时列名为:如果想在结果显示时对列名进行重命名,可以在查询语句中使用列别名,只需在 SELECT语句的原列名后紧跟想要命名的列别名就行了。SELECT PERSONID ID, NAME, SEX FROM PERSON.PERSON;例 2-1 使用列别名,如想要将上例中的 PERSONID 列重命名为 ID,SQL 语句可以这样写:运行后显示的查询结果的第一列的列名就变为了 ID。需要注意的是,列别名仅在此查询语句有效,数据库中保存的列名并没有被改变。2.2.3 使用条件过滤数据在 SELECT 语句中加入过滤条件,可以查询出满足指定条件的数据。过滤条件通过在 SELECT 语句中增加WHERE 子句实现。WHERE 子句常用的查询条件由谓词和逻辑运算符组成。谓词指明了一个条件,该条件求解后,结果为一个布尔值:真、假或未知。逻辑算符有: AND,OR,NOT。可以在 WHERE 条件中使用的谓词有:谓词备注=等于!=, <>不等于>大于>=大于等于<小于<=小于等于BETWEEN AND两值之间的范围LIKE匹配字符串,可以使用通配符%和_IN()匹配一些特定列表中的数据NOT IN()匹配不在列表中的数据IS NULL数据为NULLIS NOT NULL数据不为NULL通过将谓词和逻辑算符进行各种组合,可以写出较为复杂的过滤条件,下面举几个简单的例子。例 2-2 演示了如何限定某一列为固定的一个值;例 2-3 则通过 AND 算符将两个条件组合起来;例 2-4 说明了如何使用 LIKE 谓词,例 2-5 则说明了如何使用 IN 谓词。SELECT * FROM PERSON.PERSON WHERE SEX='M'例 2-2 在 PERSON.PERSON 表中选择所有的男性信息。查询结果为PERSONIDSEXNAMEEMAILPHONE2M王刚027875845623M李勇027825854626M黄非133551730128M张平134551730129M张红13555173012SELECT NAME, AUTHOR, PUBLISHER, NOWPRICE FROM PRODUCTION.PRODUCTWHERE NOWPRICE>=10 AND NOWPRICE<=20;例 2-3 给出当前销售价格在 1020 元之间的所有图书的名字、作者、出版社和当前价格。查询结果为NAMEAUTHORPUBLISHERNOWPRICE红楼梦曹雪芹,高鹗中华书局15.2000水浒传施耐庵,罗贯中中华书局14.3000鲁迅文集(小说、散文、杂文)全两册鲁迅20.0000工作中无小事陈满麒机械工业出版社11.4000突破英文基础词汇刘毅外语教学与研究出版社11.1000SELECT ADDRESSID, ADDRESS1, CITY, POSTALCODE FROM PERSON.ADDRESSWHERE ADDRESS1 LIKE '关山%202'例 2-4 查询第一通讯地址中第四个字开始为“关山”且以 202 结尾的地址。查询结果为ADDRESSIDADDRESS1CITYPOSTALCODE13洪山区关山春晓 55-1-202武汉市洪山区43007314洪山区关山春晓 10-1-202武汉市洪山区43007315洪山区关山春晓 11-1-202武汉市洪山区430073<列名> LIKE <匹配字符串常数>由上例可看出,LIKE 谓词的一般使用格式为:其中,<列名>必须是可以转化为字符类型的数据类型的列。对于一个给定的目标行,如果指定列值与由<匹配字符串常数>给出的内容一致,则谓词结果为真。<匹配字符串常数>中的字符可以是一个完整的字符串,也可以是百分号“%”和下划线“_”,“%”和“_”称通配符。 “%”代表任意字符串(也可以是空串);“_”代表任何一个字符。SELECT NAME, AUTHOR FROM PRODUCTION.PRODUCTWHERE PUBLISHER IN ('中华书局', '人民文学出版社');例 2-5 查询出版社为中华书局或人民文学出版社出版的图书名称与作者信息。查询结果为NAMEAUTHOR红楼梦曹雪芹, 高鹗水浒传施耐庵, 罗贯中长征王树增假设现在需要查询性别为男性的员工的姓名与职务,我们发现可以在 PERION.PERSON表中查询到员工的性别和姓名,而员工的职务信息则在表 RESOURCES.EMPLOYEE 中。为了完成这个查询,要同时从两个表中获取数据,需要使用表连接操作。DM 的连接查询方式包括:交叉连接(cross join)、内连接、自然连接、外连接和哈希连接。SELECT T1.NAME, T2.TITLEFROM PERSON.PERSON T1, RESOURCES.EMPLOYEE T2 WHERE T1.PERSONID = T2.PERSONID AND T1.SEX = 'M'例 2-6 使用连接查询,我们可以使用交叉连接加 WHERE 过滤条件来实现上面的查询需求查询结果为NAMETITLE王刚销售经理李勇采购经理黄非采购代表张平系统管理员SELECT NAME, TITLEFROM PERSON.PERSON T1, RESOURCES.EMPLOYEE T2 WHERE T1.PERSONID = T2.PERSONID AND SEX = 'M'在上述 SELECT 语句中,我们在 FROM 子句里分别为两张表定义了表别名 T1 和 T2,并且在引用表的列名时在前面加上了表别名作为限定,如“T1.NAME”。这是因为在两张表中都有 PERSONID 这个列,如果不指定列所属的表,则 WHERE 条件“T1.PERSONID = T2.PERSONID”就变为了“PERSONID = PERSONID”,语句将不能通过语法分析。对于两个表中不相同的列名,可以省略前面的表限定,上面的语句也可以写为2.2.4 模糊匹配查询REGEXP 函数是根据符合 POSIX 标准的正则表达式进行字符串匹配操作的系统函数,是字符串处理函数的一种扩展。DM 支持的 REGEXP 函数包括:REGEXP_COUNT、REGEXP_LIKE、 REGEXP_INSTR 、REGEXP_SUBSTR、REGEXP_REPLACE。SELECT EMPLOYEEID, PERSONID, TITLE, MANAGERID, BIRTHDATEFROM RESOURCES.EMPLOYEE WHERE REGEXP_LIKE(TITLE, '(售代|经)','i');例 2-7 选择 TITLE 为销售相关的人员的部分信息,使用 REGEXP_LIKE 函数,由于可能是销售代表或销售经理,因此正则表达式为“(售代|经)”。查询结果为EMPLOYEEIDPERSONIDTITLEMANAGERIDBIRTHDATE22销售经理11980-08-0544销售代表21982-08-0555销售代表21983-08-05例 2-8 将生日日期中 4 位数字的年份替换为空串,使用 REGEXP_REPLACE 函数。例子中为SELECT EMPLOYEEID, BIRTHDATE,REGEXP_REPLACE(BIRTHDATE,'(:digit:4)-','') NEW_BIRTHDATE FROM RESOURCES.EMPLOYEE;REGEXP_REPLACE(BIRTHDATE,'(:digit:4)-','')定义了一个列别名 NEW_BIRTHDATE。查询结果为EMPLOYEEIDBIRTHDATENEW_BIRTHDATE11979-08-0508-0521980-08-0508-0531981-08-0508-0541982-08-0508-0551983-08-0508-0561984-08-0508-0571977-08-0508-0581980-08-0708-07SELECT ADDRESSID,ADDRESS1, REGEXP_SUBSTR(ADDRESS1,'*+区') NEW_ADDRESSFROM PERSON.ADDRESS;例 2-9 获取地址信息中的区相关信息,使用 REGEXP_SUBSTR 函数。查询结果为:ADDRESSIDADDRESS1NEW_ADDRESS1洪山区 369 号金地太阳城 56-1-202洪山区2洪山区 369 号金地太阳城 57-2-302洪山区3青山区青翠苑 1 号青山区4武昌区武船新村 115 号武昌区5汉阳大道熊家湾 15 号null6洪山区保利花园 50-1-304洪山区7洪山区保利花园 51-1-702洪山区8洪山区关山春晓 51-1-702洪山区9江汉区发展大道 561 号江汉区10江汉区发展大道 555 号江汉区11武昌区武船新村 1 号武昌区12江汉区发展大道 423 号江汉区13洪山区关山春晓 55-1-202洪山区14洪山区关山春晓 10-1-202洪山区15洪山区关山春晓 11-1-202洪山区16洪山区光谷软件园C1_501洪山区SELECT NAME,NOWPRICE,PUBLISHTIME FROM PRODUCTION.PRODUCTWHERE REGEXP_COUNT(PUBLISHTIME,'-01',1)=2;例 2-10 获取 1 月 1 号出版的图书的名称,使用 REGEXP_COUNT 函数。查询结果为:NAMENOWPRICEPUBLISHTIME工作中无小事11.40002006-01-01噼里啪啦丛书(全 7 册)42.00001901-01-012.2.5 对数