达梦(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

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

相关文章
|
3月前
|
SQL
开发指南057-执行SQL返回结果集
业务实践中除了返回实体类外,经常需要通过SQL语句返回结果集
|
7天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
30 9
|
27天前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
99 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
2月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
39 8
|
2月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
63 4
|
2月前
|
SQL 安全 前端开发
Web学习_SQL注入_联合查询注入
联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
64 2
|
2月前
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。
|
2月前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
165 10
|
2月前
|
SQL 关系型数据库 MySQL
|
3月前
|
SQL 数据库 开发者
功能发布-自定义SQL查询
本期主要为大家介绍ClkLog九月上线的新功能-自定义SQL查询。