单表查询

本章节主要介绍在 DM 数据库中如何进行单表查询。

一、适用场景

软件 版本
操作系统 Redhat 7 及以上版本
DM 数据库 DM 8.0 及以上版本
CPU 架构 x86、ARM、龙芯、飞腾等国内外主流 CPU

二、操作方法

2.1 查看表结构

方法一:

SELECT DBMS_METADATA.GET_DDL('TABLE','EMPLOYEE','DMHR') FROM dual;

方法二:

SP_TABLEDEF('DMHR','EMPLOYEE');

2.2 全表数据检索

如需查询所有员工信息,可使用 SQL 语句 select *,返回表中所有的列。示例语句如下所示:

SELECT * FROM dmhr.employee;

输出结果如下图所示:

全表检索

2.3 行过滤

如需按员工入职时间进行筛选,查询 2015 年 1 月 1 日后入职的员工。示例语句如下所示:

SELECT * FROM dmhr.employee WHERE hire_date > '2015-01-01';

输出结果如下图所示:

行过滤

2.4 查找空值

如需查询工资数据为空的员工,示例语句如下所示:

SELECT *  FROM dmhr.employee WHERE commission_pct IS NULL;

输出结果如下图所示:

查找空值

注意

由于测试表内没有值为 null 的数据,需先在 EMPLOYEE 表内删除 COMMISSION_PCT 数据后保存,才能显示上述结果。

2.5 空值与运算

NULL 不支持加、减、乘、除、大小、相等比较,所有查询结果都为空。

2.6 处理空值

因为 NULL 不支持加、减、乘、除、大小、相等比较,所以我们在处理空值之前,需要把空值改为有意义的值。示例语句如下所示:

SELECT employee_name, employee_id, NVL (commission_pct, 0) AS commission_pct
  FROM dmhr.employee;
注意

转换函数 (nvl),只能转换 null 值为同类型或者可以隐式转换成同类型的值。

2.7 空值与函数

函数对空值的处理方式各不一样,有些会返回空值,示例语句如下所示:

SELECT GREATEST(16,NULL) FROM dual;

输出结果如下图所示:

返回空值

有些会返回预期的值,示例语句如下所示:

SELECT REPLACE('123456',3,NULL) FROM dual;

输出结果如下图所示:

返回预期值

2.8 查找满足多个条件的行

对于需要进行多个条件组合的复杂查询,例如:需查询部门编号为 102 的员工,或者工资大于 20000 的员工,或者部门编号为 105 且工资大于 9000 的员工。示例语句如下所示:

SELECT *
  FROM dmhr.employee
 WHERE (department_id = 102
        OR salary > 20000
        OR (department_id = 105 AND salary > 9000));

输出结果如下图所示:

查找多行

2.9 使用列别名

列名通常是英文表示,所以可以给列取个别名,增强可读性。可使用 as 关键字或直接跟别名。示例语句如下所示:

SELECT employee_id AS "员工编号", employee_name AS "员工姓名"
  FROM dmhr.employee;

输出结果如下图所示:

使用列别名

2.10 检索部分列

检索部分列需要明确指定要查询的列,而不是用 * 号替代。示例语句如下所示:

SELECT employee_id, employee_name, salary FROM dmhr.employee WHERE salary > 20000;

2.11 where 子句中引用别名列

写报表时,经常会加各种条件,而直接在条件中使用别名(如 C01、C02)要更加的清晰,但是 where 条件引用别名一定要嵌套一层,因为别名是在 select 之后才有效。

错误示例语句如下所示:

SELECT employee_id emid, email emna, salary sal FROM dmhr.employee WHERE sal > 10000;

输出结果如下图所示:

where 错误用法

正确示例语句如下所示:

SELECT *
  FROM (SELECT employee_id emid, email emna, salary sal FROM dmhr.employee)
 WHERE sal > 10000;

输出结果如下图所示:

where 正确用法

2.12 列拼接

使用 || 可以把字符串拼接起来。示例语句如下所示:

SELECT employee_name || ' salary is ' || salary AS col1 FROM dmhr.employee;

输出结果如下图所示:

字符串列拼接

也可以将需要批量执行的 SQL 语句拼接起来。示例语句如下所示:

SELECT 'TRUNCATE TABLE ' || schema_name || '.' || table_name
  FROM ALL_TABLES_DIS_INFO
 WHERE schema_name = 'DMHR';

输出结果如下图所示:

SQL 语句列拼接

字符串连接符 || 也可以改成 concat 函数。示例语句如下所示:

SELECT CONCAT ('ABC','BCD','DDD','BBB') AS "OUTPUT" FROM DUAL;

输出结果如下图所示:

函数列拼接

2.13 select 语句中使用条件逻辑

为了更清楚的区分返回的信息,如按工资高低给出提示,需做如下处理:

SELECT employee_name,
       salary,
       CASE
         WHEN salary <= 4000  THEN 'low'
         WHEN salary >= 12000 THEN 'high'
         ELSE 'ok'
       END AS salary_status
FROM dmhr.employee;

输出结果如下图所示:

SQL 增加条件逻辑

2.14 如何限制返回的行数

方法一:在查询的时候并不是每次都要求返回所有的行,比如抽查的时候只要求返回 10 行,可以使用伪列 rownum 来过滤。示例语句如下所示:

SELECT *
  FROM (SELECT ROWNUM AS rn, t.*
          FROM dmhr.employee t
         WHERE ROWNUM <= 10)
 WHERE rn = 2;

输出结果如下图所示:

查找空值

方法二:使用 LIMIT 子句返回两行。示例语句如下所示:

SELECT  * FROM dmhr.employee LIMIT 2;

输出结果如下图所示:

查找空值

三、参考文档

更多 SQL 语言使用说明,请参考《DM8_SQL 语言使用手册》,手册位于数据库安装路径 /dmdbms/doc 文件夹下。如有其他问题,请在社区内咨询。

微信扫码
分享文档
扫一扫
联系客服