常用的语句
分组函数
分组函数作用于一组数据,并对一组数据返回一个值
常见的分组函数:
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);