达梦(DM) SQL查询及联合查询

简介: 继续讲解达梦(DM)数据库SQL查询操作

这里继续讲解DM数据库的Sql查询操作

查询结果排序

为提高查询结果可读性,我们可以对查询结果按照一定顺序排列,或者也可以将列名替换成数字,例如 ORDER BY 1 DESC,意思是按第一列进行升序排序

SELECT*FROM PY_PERIOD_CLAZZ WHERE ROWNUM <5ORDERBY ID DESC;SELECT*FROM PY_PERIOD_CLAZZ WHERE ROWNUM <5ORDERBY1DESC;

执行结果如图

image.png

如果想要进行多列排序的话,可以在 order by 后加两列,并分别标明 ASC, DESC。其中 ASC 表示升序,DESC 表示降序

SELECT*FROM PY_PERIOD_CLAZZ WHERE ROWNUM <5ORDERBY2ASC,1DESC;

执行结果如图

image.png

说明:多列排序,若前面的列有重复,后面的排序才有用。即先通过前面的列将数据分组,再按照后面的列进行排序。

如果想按照客户手机号尾号的顺序排列,缩小查询范围,可以通过如下函数实现子串排序

SELECT USER_NAME AS 姓名, SUBSTR (PHONENUMBER,-4)AS 尾号 FROM SYS_USER WHERE ROWNUM <5ORDERBY2;

查询结果如图

image.png

TRANSLATE 可实现字符替换,语法格式:TRANSLATE(expr,from_string,to_string),from_string 与 to_string 以字符为单位,对应字符逐个替换

SELECT TRANSLATE ('ab你好bcadefg','abcdefg','1234567')AS new_str FROM DUAL;

执行结果如图

image.png

如果 to_string 为空,则直接返回空值

SELECT TRANSLATE ('ab你好bcadefg','abcdefg','')AS new_str FROM DUAL;

执行结果如图

image.png

如果 to_string 对应的位置没有字符,from_string 中列出的字符将会被删除

SELECT TRANSLATE('11ab你好bcadefg','1abcdefg','1')AS new_str FROM DUAL;

查询结果如图

image.png

多表联合查询

使用 union 或者 union all 关键字合并多个结果集时,对应的列数必须一致,列的数据类型必须匹配。当其中一个结果集的列数不满足要求时,可以使用 NULL 或者 空字符串 填充

// 使用 NULL 填充
SELECT USER_ID, USER_NAME FROM SYS_USER WHERE ROWNUM <5UNION ALL
SELECT11,NULLFROM DUAL;

查询结果如图

image.png

// 使用 '' 填充
SELECT USER_ID, USER_NAME FROM SYS_USER WHERE ROWNUM <5UNION ALL
SELECT11,''FROM DUAL;

查询结果如图

image.png

注意:如果存在 order by 子句,必须添加到 union 和 union all 的最后。

union all 用于合并两个结果集,但是会出现重复数据,比如

SELECT*FROM SYS_USER WHERE USER_ID=1OR USER_NAME='若依';

or查询返回一条数据,结果正确

image.png

使用union all 合并结果集的话

SELECT*FROM SYS_USER WHERE USER_ID=1UNION ALL
SELECT*FROM SYS_USER WHERE USER_NAME='若依';

查询结果重复了

image.png

使用union的话就可以了

SELECT*FROM SYS_USER WHERE USER_ID=1UNIONSELECT*FROM SYS_USER WHERE USER_NAME='若依';

查询结果

image.png

说明:使用 union all 替换 or,执行计划更高效,出现重复行时,使用 union 去重。

EXCEPT 获取第一个结果集的数据,然后排除第二个结果集的数据,类似减法运算

CREATETABLE dept ASSELECT dept_id FROM SYS_USER;INSERTINTO dept VALUES(888),(999),(3004); COMMIT;SELECT dept_id FROM dept EXCEPT SELECT dept_id FROM SYS_USER;

查询结果如图

image.png

查询含有 null 值的行时,如果包含 IN、NOT IN 要注意两者的区别。IN 相当于 OR, 而 NOT IN 相当于 AND,比如

SELECT*FROM SYS_USER WHERE user_id IN(1,2,NULL);

查询出数据库的2条数据,

SELECT*FROM SYS_USER WHERE user_id notin(1,2,NULL);

并未查询出数据,因为 NOT IN 的逻辑是 1 AND 2 AND NULL。当 NOT IN 后面跟的子查询返回的列存在 NULL 值,可能得不到正确的结果。

内连接:完全满足连接条件的记录

SELECT*FROM SYS_USER t1,DEPT t2 WHERE t1.DEPT_ID=t2.DEPT_ID;SELECT*FROM SYS_USER t1 JOIN DEPT t2 on(t1.DEPT_ID=t2.DEPT_ID);

查询结果如图

image.png

左外连接:结果不仅包含满足条件的记录,还包含位于左表中不满足条件的记录,此时右表的记录显示为 NULL

SELECT t1.USER_NAME,t2.DEPT_IDFROM SYS_USER t1 LEFT OUTER JOIN DEPT t2 on(t1.DEPT_ID=t2.DEPT_ID);

查询结果如图

image.png

右外连接:结果不仅包含满足条件的记录,还包含位于右表中不满足条件的记录,对应的左表的记录显示为 NULL

SELECT t1.USER_NAME,t2.DEPT_IDFROM SYS_USER t1 RIGHT OUTER JOIN DEPT t2 on(t1.DEPT_ID=t2.DEPT_ID);

查询结果如图

image.png

全外连接:结果不仅包含满足条件的记录,还会包含位于两边表中所有不满足条件的记录,对应的两边表的记录显示为 NULL

SELECT t1.USER_NAME,t2.DEPT_IDFROM SYS_USER t1 FULL OUTER JOIN DEPT t2 on(t1.DEPT_ID=t2.DEPT_ID);

查询结果如图

image.png

自连接:表和自身进行连接,自连接查询至少要对一张表起别名,否则,服务器无法识别要处理的是哪张表。

相关文章
|
2月前
|
SQL 监控 关系型数据库
一键开启百倍加速!RDS DuckDB 黑科技让SQL查询速度最高提升200倍
RDS MySQL DuckDB分析实例结合事务处理与实时分析能力,显著提升SQL查询性能,最高可达200倍,兼容MySQL语法,无需额外学习成本。
|
2月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
6月前
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
494 1
|
2月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
1月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
216 0
|
3月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
283 18
|
8月前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
8月前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
3月前
|
SQL 人工智能 数据库
【三桥君】如何正确使用SQL查询语句:避免常见错误?
三桥君解析了SQL查询中的常见错误和正确用法。AI产品专家三桥君通过三个典型案例:1)属性重复比较错误,应使用IN而非AND;2)WHERE子句中非法使用聚合函数的错误,应改用HAVING;3)正确的分组查询示例。三桥君还介绍了学生、课程和选课三个关系模式,并分析了SQL查询中的属性比较、聚合函数使用和分组查询等关键概念。最后通过实战练习帮助读者巩固知识,强调掌握这些技巧对提升数据库查询效率的重要性。
147 0
|
6月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路