本章节主要介绍在 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;
输出结果如下图所示:
正确示例语句如下所示:
SELECT *
FROM (SELECT employee_id emid, email emna, salary sal FROM dmhr.employee)
WHERE sal > 10000;
输出结果如下图所示:
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';
输出结果如下图所示:
字符串连接符 || 也可以改成 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;
输出结果如下图所示:
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
文件夹下。如有其他问题,请在社区内咨询。