国产达梦数据库常用SQL语句(上)

江山十日雪,雪深江雾浓。开时刻的牵绊,邀阳光作伴,约清风同行,收拾起行囊,咱们去亲近草原吧,去亲近辽阔无边的草原。

DM8是达梦公司在总结DM系列产品研发与应用经验的基础上,坚持开放创新、简洁实用的理念,历经五年匠心打磨,推出的新一代自研数据库。

DM8吸收借鉴当前先进新技术思想与主流数据库产品的优点,融合了分布式、弹性计算与云计算的优势,对灵活性、易用性、可靠性、高安全性等方面进行了大规模改进,多样化架构充分满足不同场景需求,支持超大规模并发事务处理和事务-分析混合型业务处理,动态分配计算资源,实现更精细化的资源利用、更低成本的投入。一个数据库,满足用户多种需求,让用户能更加专注于业务发展。

单表查询

SELECT 语句仅从一个表/视图中检索数据,称单表查询。 即<FORM字句>中<普通表>使用的是[<模式名>.]<基表名|视图名>

简单查询

查询所有图书的名字、作者及当前销售价格,并消去重复。

SELECT DISTINCT NAME, AUTHOR, NOWPRICE FROM PRODUCTION .PRODUCT;

其中, DISTINCT 保证重复的行将从结果中去除。若允许有重复的元组,改用 ALL 来替换 DISTINCT,或直接去掉 DISTINCT 即可。基本与MySQL查询语句相同。

带条件查询

带条件查询是指在指定表中查询出满足条件的元组。该功能是在查询语句中使用WHERE 子句实现的。 WHERE 子句常用的查询条件由谓词和逻辑运算符组成。谓词指明了一个条件,该条件求解后,结果为一个布尔值:真、假或未知。

逻辑算符有: AND, OR, NOT。
谓词包括比较谓词(=、>、<、>=、<=、<> ), BETWEEN 谓词、 IN 谓词、 LIKE谓词、 NULL 谓词、 EXISTS 谓词。

1.使用比较谓词的查询

当使用比较谓词时,数值数据根据它们代数值的大小进行比较,字符串的比较则按序对同一顺序位置的字符逐一进行比较。若两字符串长度不同,短的一方应在其后增加空格,使两串长度相同后再作比较。
给出当前销售价格在 10~20 元之间的所有图书的名字、作者、出版社和当前价格。

SELECT NAME, AUTHOR, PUBLISHER, NOWPRICE FROM PRODUCTION.PRODUCTWHERE NOWPRICE>=10 AND NOWPRICE<=20;
2. 使用 BETWEEN 谓词的查询

给出当前销售价格在 10~20 元之间的所有图书的名字、作者、 出版社和当前价格。

SELECT NAME, AUTHOR, PUBLISHER, NOWPRICE FROM PRODUCTION.PRODUCTWHERE NOWPRICE BETWEEN 10 AND 20;

此例查询与上例完全等价,在 BETWEEN 谓词前面可以使用 NOT,以表示否定。

3.使用 IN 谓词的查询

谓词 IN 可用来查询某列值属于指定集合的元组。

SELECT NAME, AUTHOR FROM PRODUCTION.PRODUCTWHERE PUBLISHER IN ('中华书局', '人民文学出版社');

在 IN 谓词前面也可用 NOT 表示否定。

4.使用 LIKE 谓词的查询

LIKE 谓词一般用来进行字符串的匹配。我们先用实例来说明 LIKE 谓词的使用方法。

查询第一通讯地址中第四个字开始为“关山”且以 202 结尾的地址。

SELECT ADDRESSID, ADDRESS1, CITY, POSTALCODE FROM PERSON.ADDRESS WHERE ADDRESS1 LIKE '___关山%202';
5.使用.ROW 进行 LIKE 谓词的查询

LIKE 谓词除支持使用列的计算外,还支持通过 ROW 保留字对表或视图进行 LIKE 计算。该查询依次对表或视图中所有字符类型的列进行 LIKE 计算,只要有一列符合条件,则返回TRUE。

其语法的一般格式为:

<表名>.ROW LIKE <匹配字符串> [ ESCAPE <转义字符>]

例 查询评论中哪些与曹雪芹有关:

SELECT * FROM PRODUCTION. PRODUCT_REVIEW WHERE PRODUCT_REVIEW.ROW LIKE '%曹雪芹%';

该语句等价于:

SELECT * FROM PRODUCTION. PRODUCT_REVIEW WHERE NAME LIKE '%曹雪芹%' OR EMAIL LIKE '%曹雪芹%' OR COMMENTS LIKE '%曹雪芹%';
6.使用 NULL 谓词的查询

空值是未知的值。当列的类型为数值类型时, NULL 并不表示 0;当列的类型为字符串类型时, NULL 也并不表示空串。因为 0 和空串也是确定值。 NULL 只能是一种标识,表示它在当前行中的相应列值还未确定或未知,对它的查询也就不能使用比较谓词而须使用NULL 谓词。

查询哪些人员的 EMAIL 地址为 NULL。

SELECT NAME, SEX, PHONE FROM PERSON.PERSON WHERE EMAIL IS NULL;

在 NULL 谓词前,可加 NOT 表示否定。

7. 组合逻辑

可以用逻辑算符(AND, OR, NOT)与各种谓词相组合生成较复杂的条件查询。

例 查询当前销售价格低于 15 元且折扣低于 7 或出版社为人民文学出版社的图书名称和作者。

SELECT NAME, AUTHOR FROM PRODUCTION.PRODUCT WHERE NOWPRICE < 15 AND DISCOUNT < 7 OR PUBLISHER='人民文学出版社';

多表联合查询

如果一个查询包含多个表(>=2),则称这种方式的查询为连接查询。 即<FROM 子句>中使用的是<连接表>。DM 的连接查询方式包括:交叉连接(cross join)、自然连接( natural join)、 内连接(inner)、 外连接(outer)。下面分别举例说明。

1. 自然连接(NATURAL JOIN)

把两张连接表中的同名列作为连接条件,进行等值连接,我们称这样的连接为自然连接。
自然连接具有以下特点:
1. 连接表中存在同名列;
2. 如果有多个同名列,则会产生多个等值连接条件;
3. 如果连接表中的同名列类型不匹配,则报错处理。

查询销售人员的入职时间和去年销售总额。

SELECT T1.HAIRDATE, T2.SALESLASTYEAR FROM RESOURCES.EMPLOYEE T1 NATURAL JOIN SALES.SALESPERSON T2;
2. JOIN … USING

这是自然连接的另一种写法, JOIN 关键字指定连接的两张表, USING 指明连接列。要求 USING 中的列存在于两张连接表中。

查询销售人员的入职时间和去年销售总额。

SELECT HAIRDATE, SALESLASTYEAR FROM RESOURCES.EMPLOYEE JOIN SALES.SALESPERSON USING(EMPLOYEEID);
3. JOIN…ON

这是一种连接查询的常用写法,说明是一个连接查询。 JOIN 关键字指定连接的两张表,ON 子句指定连接条件表达式,其中不允许出现 ROWNUM。具体采用何种连接方式,由数据库内部分析确定。

查询销售人员的入职时间和去年销售总额。

SELECT T1.HAIRDATE,T2.SALESLASTYEAR FROM RESOURCES.EMPLOYEE T1 JOIN SALES.SALESPERSON T2 ON T1.EMPLOYEEID=T2.EMPLOYEEID;
4. 自连接

数据表与自身进行连接,我们称这种连接为自连接。自连接查询至少要对一张表起别名,否则,服务器无法识别要处理的是哪张表。

对 PURCHASING.VENDOR 表进行自连接查询

SELECT T1.NAME, T2.NAME, T1.ACTIVEFLAG FROM PURCHASING.VENDOR T1, PURCHASING.VENDOR T2 WHERE T1.NAME = T2.NAME;
5. 内连接(INNER JOIN)

根据连接条件,结果集仅包含满足全部连接条件的记录,我们称这样的连接为内连接。

从 PRODUCT_CATEGORY、PRODUCT_SUBCATEGORY 中查询图书的目录名称和子目录名称。

SELECT T1.NAME, T2.NAME FROM PRODUCTION.PRODUCT_CATEGORY T1 INNER JOIN PRODUCTION.PRODUCT_SUBCATEGORY T2 ON T1.PRODUCT_CATEGORYID = T2.PRODUCT_CATEGORYID;
6. 外连接(OUTER JOIN)

外连接对结果集进行了扩展,会返回一张表的所有记录,对于另一张表无法匹配的字段用 NULL 填充返回。 DM 数据库支持三种方式的外连接:左外连接、右外连接、全外连接。外连接中常用到的术语:左表、右表。根据表所在外连接中的位置来确定,位于左侧的表,称为左表;位于右侧的表,称为右表。例如 SELECT * FROM T1 LEFT JOIN T2 ONT1.C1=T2.D1, T1 表为左表, T2 表为右表。返回所有记录的表根据外连接的方式而定。

  1. 左外连接:返回左表所有记录;
  2. 右外连接:返回右表所有记录;
  3. 全外连接:返回两张表所有记录。处理过程为分别对两张表进行左外连接和右外连接,然后合并结果集。在左外连接和右外连接中,如果需要对未能匹配的缺失数据进行填充,可以使用分区外连接(PARTITION OUTER JOIN),分区外连接通常用于处理稀疏数据以得到分析报表。

下面举例说明:

从 PRODUCT_CATEGORY、PRODUCT_SUBCATEGORY 中查询图书的所有目录名称和子目录名称,包括没有子目录的目录。

SELECT T1.NAME, T2.NAME FROM PRODUCTION.PRODUCT_CATEGORY T1 LEFT OUTER JOIN PRODUCTION.PRODUCT_SUBCATEGORY T2 ON T1.PRODUCT_CATEGORYID = T2.PRODUCT_CATEGORYID;

从 PRODUCT_CATEGORY、PRODUCT_SUBCATEGORY 中查询图书的目录名称和所有子目录名称,包括没有目录的子目录。

SELECT T1.NAME, T2.NAME FROM PRODUCTION.PRODUCT_CATEGORY T1 RIGHT OUTER JOIN PRODUCTION.PRODUCT_SUBCATEGORY T2
ON T1.PRODUCT_CATEGORYID = T2.PRODUCT_CATEGORYID;

外连接还有一种写法,在连接条件或 WHERE 条件中,在列后面增加(+)指示左外连接或者右外连接。如果表 A 和表 B 连接,连接条件或者 where 条件中, A 的列带有(+)后缀,则认为是 B LEFT JOIN A。如果用户的(+)指示引起了外连接环,则报错。下面举例说明:

从 PRODUCT_CATEGORY、PRODUCT_SUBCATEGORY 中查询图书的目录名称和所有子目录名称,包括没有目录的子目录。

SELECT T1.NAME, T2.NAME FROM PRODUCTION.PRODUCT_CATEGORY T1, PRODUCTION.PRODUCT_SUBCATEGORY T2 WHERE T1.PRODUCT_CATEGORYID(+) = T2.PRODUCT_CATEGORYID;

本文国产达梦数据库常用SQL语句(上)到此结束。累累的创伤就是生命给你最好的礼物,因为在每个创伤上面都标志着前进的一步。小编再次感谢大家对我们的支持!

标签: SQL