达梦(DM) SQL数据及字符串操作

简介: 继续讲述DM数据库Sql操作

这里继续讲解DM数据库的操作,主要涉及插入、更新、删除操作。

数据操作

插入数据,不指定具体列的话就需要插入除自增列外的其他列,当然自增列也可以直接指定插入

INSERTINTO SYS_USER VALUES(110,'test002','test002','00',null,'13522266688',0,null,'dfhgjhsfjg','12323',0,0,null,null,'test002','2023-10-23 10:11:11',null,null,null);

执行成功后查看数据

image.png

插入多行,比如创建测试表

CREATETABLE test
ASSELECT user_id,          user_name,          login_name,          phonenumber,          dept_id
FROM sys_user
WHERE1=2;

创建成功后查询可以看到表创建成功,带WHERE 1 = 2条件的话,实测是只创建指定字段表结构,不带WHERE条件的话会携带对应字段的数据

image.png

CREATETABLE test1
ASSELECT user_id,          user_name,          login_name,          phonenumber,          dept_id
FROM sys_user;

执行结果

image.png

批量插入test表数据

insertinto test VALUES(1,'test','test','13511122211',1),(2,'test1','test1','13511122222',1),(3,'test2','test2','13511122233',1);

执行成功后

image.png

可以按指定列插入行,未指定值的列上若定义了默认值,则插入默认值。没有指定默认值,为 NULL,则插入 NULL 值

insertinto test (user_id,login_name)VALUES(4,'test3'),(5,'test4');

执行结果如图

image.png

如需快速复制表结构且不需要数据,如需表机构和数据的话 WHERE 1 = 1; 或者不要WHERE条件

CREATETABLE test2 ASSELECT*FROM test WHERE1=0;

查询表数据库看到

image.png

使用 SP_TABLEDEF 过程查看 test2 的结构,所有定义在 test 列上的约束均没有被新表继承。

为表语句添加约束条件

ALTERTABLE test  ADD PRIMARY KEY (user_id);ALTERTABLE test  ALTER COLUMN user_name SET DEFAULT 'dm2020';ALTERTABLE test  ALTER COLUMN login_name SETNOTNULL;ALTERTABLE test  ALTER COLUMN phonenumber SET DEFAULT '13511122255';

使用 MERGE INTO 语法可合并 UPDATE 和 INSERT 语句,使用 MERGE 可以实现记录“存在则 update,不存在则 insert”的逻辑。

通过 group by + having 子句分组查询的方式,查找员工名称相同的记录

select user_name,count(*)FROM TEST groupby USER_NAME HAVINGcount(*)>1;

查询结果如图

image.png

查询重复数据,通过 group by + rowid 的方式,查找员工名称重复的记录

select*from test where ROWID notin(select max(ROWID)from test groupby user_name);

查找到重复记录后直接删除

deletefrom test where ROWID notin(select max(ROWID)from test groupby user_name);

执行完再查询发现重复的1 2 3 4 已经删除了

image.png

字符串操作

使用函数 regexp_count、regexp_replace 或 translate 统计字符串个数

创建视图

CREATEOR REPLACE VIEW v ASSELECT'STUDENT,TEACHER,TEAM'AS str FROM DUAL;select*from V;

看到创建成功的视图

image.png

使用函数 regexp_count 统计子串个数

SELECT regexp_count(str,',')+1as cnt FROM v;

执行结果如图

image.png

使用 regexp_replace 迂回求值统计子串个数

SELECT length(regexp_replace(str,'[^,]'))+1as cnt FROM v;

使用 translate 统计子串个数

SELECT length(translate(str,','|| str,','))+1AS cnt FROM v;

使用 translate 或者 regexp_replace 在某个字段中去掉不需要的字符,先创建视图

CREATEOR REPLACE VIEW v
ASSELECT'CLARK' ename FROM DUAL
UNION ALL
SELECT'MILLER'FROM DUAL
UNION ALL
SELECT'KING'FROM DUAL;

创建成功如图

image.png

去掉ename中的元音字母

SELECT ename,translate(ename,'1AEIOU','1') stripped1 FROM v;

可以看到元音字母已经去掉了

image.png

使用正则函数 regexp_replace [] 内列举的字符替换为空

SELECT ename,regexp_replace(ename,'[AEIOU]')AS stripped FROM v;

使用 regexp_replace 正则表达式实现字符串中字符与数字分离,创建测试视图

CREATEOR REPLACE VIEW v
ASSELECT'CLARK10' data FROM DUAL
UNION ALL
SELECT'MILLER20'FROM DUAL
UNION ALL
SELECT'KING30'FROM DUAL;

查询结果如图

image.png

使用 regexp_replace 正则表达式

SELECT REGEXP_REPLACE (data,'[0-9]','') dname,       REGEXP_REPLACE (data,'[^0-9]','') deptno
FROM v;

执行结果如图

image.png

使用 regexp_like 实现查询只包含字母或者数字型的数据,创建测试视图

CREATEOR REPLACE VIEW v
ASSELECT'123'AS data FROM DUAL
UNION ALL
SELECT'abc'FROM DUAL
UNION ALL
SELECT'123abc'FROM DUAL
UNION ALL
SELECT'abc123'FROM DUAL
UNION ALL
SELECT'a1b2c3'FROM DUAL
UNION ALL
SELECT'a1b2c3#'FROM DUAL
UNION ALL
SELECT'3$'FROM DUAL
UNION ALL
SELECT'a 2'FROM DUAL;

查询执行结果如图

image.png

在上面的语句中,有些数据包含了空格、逗号、$ 等字符。现在要求只返回其中只有字母及数字的行,使用 regexp_like 语句

SELECT data FROM v WHERE REGEXP_LIKE (data,'^[0-9a-zA-Z]+$');

查询结果如图

image.png

注意下方内容

image.png

通过正则表达式或者 translate 函数实现按字符串中的数值排序,创建视图

CREATEOR REPLACE VIEW v
ASSELECT'ACCOUNTING 10 NEW YORK' data FROM DUAL
UNION ALL
SELECT'OPEARTINGS 40 BOSTON'FROM DUAL
UNION ALL
SELECT'RESEARCH 20 DALLAS'FROM DUAL
UNION ALL
SELECT'SALES 30 CHICAGO'FROM DUAL;

执行后查询结果如图

image.png

用正则表达式替换非数字字符

SELECT data, TO_NUMBER (REGEXP_REPLACE (data,'[^0-9]',''))AS deptno FROM V ORDERBY2;

执行结果如图

image.png

使用 translate 函数,直接替换掉非数字字符

SELECT data,TO_NUMBER (TRANSLATE (data,'0123456789'|| data,'0123456789'))AS deptno FROM V ORDERBY2;

通过 listagg 分析函数实现多行字段的合并显示,创建视图

CREATEOR REPLACE VIEW v
ASSELECT'10' deptno,'CLARK' name,'800' sal FROM DUAL
UNION ALL
SELECT'10','KING','900'FROM DUAL
UNION ALL
SELECT'20','JAMES','1000'FROM DUAL
UNION ALL
SELECT'20','KATE','2000'FROM DUAL
UNION ALL
SELECT'30','JONES','1150'FROM DUAL;

执行结果如图

image.png

使用 listagg 分析函数实现合并显示

SELECT deptno,SUM (sal)AS total_sal,LISTAGG (name,',') WITHIN GROUP(ORDERBY name)AS total_name FROM v GROUPBY deptno;

执行结果如图

image.png

同 sum 一样,listagg 函数也起到汇总结果作用。sum 将数值结果累计求和,而 listagg 是把字符串的结果连在一起。

通过 regexp_substr 实现第 n 个子串的分割,创建测试视图

CREATEOR REPLACE VIEW v ASSELECT'CLARK,KATE,JAMES''CLARK,KATE,JAMES'AS name;

执行结果如图

image.png

使用 regexp_substr 分割子串

SELECT REGEXP_SUBSTR (v.name,'[^,]+',1,2)AS 子串 FROM v;

执行结果如图

image.png

说明:

参数 1:“^”在方括号里表示否的意思,+ 表示匹配 1 次以上。第二个参数表示匹配不包含逗号的多个字符。

参数 2:“1”表示从第一个字符开始。

参数 3:“2”表示第二个能匹配目标的字符串,也就是 KATE。


使用 regexp_substr 实现字符串拆分。比如将 IP 地址“192.168.1.111”中的各段取出来

SELECT REGEXP_SUBSTR (v.ip,'[^.]+',1,1)a,       REGEXP_SUBSTR (v.ip,'[^.]+',1,2)b,       REGEXP_SUBSTR (v.ip,'[^.]+',1,3)c,       REGEXP_SUBSTR (v.ip,'[^.]+',1,4)d
FROM(SELECT'192.168.1.111'AS ip FROM DUAL) v;

执行结果如图

image.png

到这里数据新增,修改,删除的操作以及字符串的相关操作就介绍完了。

相关文章
|
3月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
简介:本文整理自阿里云高级技术专家李麟在Flink Forward Asia 2025新加坡站的分享,介绍了Flink 2.1 SQL在实时数据处理与AI融合方面的关键进展,包括AI函数集成、Join优化及未来发展方向,助力构建高效实时AI管道。
787 43
|
3月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
本文整理自阿里云的高级技术专家、Apache Flink PMC 成员李麟老师在 Flink Forward Asia 2025 新加坡[1]站 —— 实时 AI 专场中的分享。将带来关于 Flink 2.1 版本中 SQL 在实时数据处理和 AI 方面进展的话题。
283 0
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
|
4月前
|
SQL
SQL如何只让特定列中只显示一行数据
SQL如何只让特定列中只显示一行数据
|
8月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
226 4
|
7月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != ''`与`name != null and name != ' '`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1030 0
|
4月前
|
SQL
SQL中如何删除指定查询出来的数据
SQL中如何删除指定查询出来的数据
|
4月前
|
SQL 关系型数据库 MySQL
SQL如何对不同表的数据进行更新
本文介绍了如何将表A的Col1数据更新到表B的Col1中,分别提供了Microsoft SQL和MySQL的实现方法,并探讨了多表合并后更新的优化方式,如使用MERGE语句提升效率。适用于数据库数据同步与批量更新场景。
|
6月前
|
SQL 数据挖掘 关系型数据库
【SQL 周周练】一千条数据需要做一天,怎么用 SQL 处理电表数据(如何动态构造自然月)
题目来自于某位发帖人在某 Excel 论坛的求助,他需要将电表缴费数据按照缴费区间拆开后再按月份汇总。当时用手工处理数据,自称一千条数据就需要处理一天。我将这个问题转化为 SQL 题目。
239 12
|
5月前
|
SQL DataWorks 数据管理
SQL血缘分析实战!数据人必会的3大救命场景
1. 开源工具:Apache Atlas(元数据管理)、Spline(血缘追踪) 2. 企业级方案:阿里DataWorks血缘分析、腾讯云CDW血缘引擎 3. 自研技巧:在ETL脚本中植入版本水印,用注释记录业务逻辑变更 📌 重点总结:
|
6月前
|
SQL 数据采集 资源调度
【SQL 周周练】爬取短视频发现数据缺失,如何用 SQL 填充
爬虫爬取抖音和快手的短视频数据时,如果遇到数据缺失的情况,如何使用 SQL 语句完成数据的补全。
168 5