达梦数据库学习

568 阅读2分钟

常用的语句

分组函数

分组函数作用于一组数据,并对一组数据返回一个值

常见的分组函数:

AVG,COUNT, MAX, MIN, SUM.....

select department_id,job_id,sum(salary) as sal from dmhr.employee
where department_id <200 group by cube (department_id,job_id) order
by department_id;

select department_id,max(salary),min(salary),avg(salary) from dmhr.employee
group by   department_id;

CUBE 常用于统计分析

对分组列以及分区列的所有子集进行分组,输出所有分组结果

select department_id,job_id,sum(salary) as sal from dmhr.employee

where department_id <200 group by cube (department_id,job_id) order

by department_id;

ROLLUP 操作是对 GROUP BY 子句的扩展,

ROLLUP 主要用于统计分析,对分组列以及分组列的部分子集进行分组,输出用户需要的结果

select department_id,job_id,sum(salary) as sal from dmhr.employee

where department_id <200 group by rollup (department_id,job_id);

GROUPING 可以看作为集函数,用来标识某列是否为分组列;

如果是分组列,GROUPING 值为 0;否则为 1;

GROUPING 中只能包含一列

GROUPING 只能与 ROLLUP,CUBE 一起使用

SELECT department_id DEPTID, job_id JOB,

SUM(salary),GROUPING(department_id) GRP_DEPT,GROUPING(job_id)

GRP_JOB

FROM dmhr.employee

WHERE department_id < 200

GROUP BY ROLLUP(department_id, job_id);

having的注意点

分组统计中,不能使用 where 进行过滤,只能使用 having 来进行过滤,where 只能用于 group by 前面, group by 分组函数过滤只能用having.

select department_id,max(salary),min(salary),avg(salary) from  dmhr.employee
group by   department_id having avg(salary)>10000;

多表连接查询

内连接hash join

DM 数据库支持对查询强制指定连接方式,可以指定为哈希连接。哈希连接处理过程为:对一张数据表以连接列为哈希键,构造哈希表,另一张表使用连接列进行哈希探测,返回满足连接条件的记录。

SELECT employee_name, department_name from dmhr.employee e inner hash join dmhr.department d on e.department_id=d.department_id;

左外连接left join

把 left join 左边的全部显示出来,右边的只显示满足条件的,不满足条件的就用 null 代替。

SELECT employee_name, department_name from dmhr.employee e left join dmhr.department d on e.department_id=d.department_id;

右外连接 right join

把 right join 右边的全部显示,左边的只显示满足条件的,不满足条件的就用 null 代替

SELECT employee_name, department_name from dmhr.employee e right join dmhr.department d on e.department_id=d.department_id;

全外连接 full join

把 right join 右边的全部显示,左边的只显示满足条件的,不满足条件的就用 null 代替

SELECT employee_name, department_name from dmhr.employee e full join dmhr.department d on e.department_id=d.department_id;

子查询

子查询有单行子查询、多行子查询。

  • 单行子查询 运算符:= ,<,>, >=,<=, <>

    select employee_name, salary from dmhr.employee where department_id = (select department_id from dmhr.employee where employee_name = '马学铭');
    

多行子查询

运算符 含义

IN 等于列表中的任意一个

ANY 将值与子查询返回的任意一个值进行比较

ALL 将值与子查询返回的每个值进行比较

>ALL :大于最大值

<all: 小于最小值

>any: 大于最小值

<any: 小于最大值

例子

select employee_name, salary from dmhr.employee where salary >all79
(select salary from dmhr.employee where department_id=103) order
by salary desc

Exits 和 IN 的用法

select employee_name ,salary from dmhr.employee where department_id in ('101','102','103');

EXISTS 用法:用于检查行是否在子查询的结果中存在

如果在子查询的一行中发现相同的值:

内层查询的搜索工作将不在继续

状态标记为 TRUE

如果在子查询的一行中没有发现想同的值:

状态标记为 FALSE,内层查询中继续搜索

   SELECT E.EMPLOYEE_ID , E.EMPLOYEE_NAME FROM DMHR.EMPLOYEE E
   WHERE EXISTS
    ( SELECT * FROM DMHR.JOB_HISTORY JWHERE E.EMPLOYEE_ID = J.EMPLOYEE_ID );

MERGE 操作(在数据仓库应用中经常使用到)

create table test.t1(c1 int, c2 varchar(20));

create table test.t2(c3 int, c4 varchar(20));

insert into test.t1 values( 1,'t1_1');

insert into test.t1 values( 2,'t1_2');

insert into test.t1 values( 3,'t1_3');

insert into test.t2 values( 2,'t2_2');

insert into test.t2 values( 4,'t2_4');

merge into test.t1 using test.t2 on (test.t1.c1=test.t2.c3)

when MATCHED THEN update set test.t1.c2=test.t2.C4

when not MATCHED then INSERT(c1,c2) values (test.t2.c3,test.t2.c4);