赞
踩
select department_id ,employee_name||'工资是:'||salary as sal from dmhr.employee;
注:||......||可以连接前后查询的两列
使用 WHERE 子句,将不满足条件的行过滤掉。
SELECT *|{[DISTINCT] column|expression [alias],...} FROM table
[WHERE condition(s)];
WHERE 子句紧随 FROM 子句
select employee_id,employee_name,salary from dmhr.employee where salary BETWEEN 25000 and 30000;
字符处理函数
ROUND:将值舍入到指定的小数位
TRUNC:将值截断到指定的小数位(不舍入)
MOD:返回除法运算的余数
注:
SP_SET_PARA_VALUES(2,’CALC_AS_DECIMAL’,1)
静态参数
0:默认值,表示整数类型的除法,整数与字符或 binary 串的所有四则运算,结果都处理成
整数。
1:表示整数类型的除法全部转换为 DEC(0,0)处理。
2:表示将整数与字符或 binary 串的所有四则运算都转换为 DEC(0,0)处理。
注:该参数只有在 use_pln_pool 为 0 或 1 时有效。当为 2,3 时,按 CALC_AS_ decimal=2 处理。
MONTHS_BETWEEN 两个日期之间的月数
ADD_MONTHS 将日历月份添加到日期中
NEXT_DAY 指定日期之后第一个星期几
LAST_DAY 月份的最后的一天
ROUND 舍入日期
TRUNC 截断日期
分组函数作用于一组数据,并对一组数据返回一个值。
常见的分组函数:
AVG 、COUNT 、MAX 、MIN 、SUM…
select department_id,max(salary) as max_sal,min(salary) as min_sal,avg(salary) as avg_sal from dmhr.employee group by department_id;
注:在分组函数中使用筛选不能使用where,需使用having
select department_id,avg(salary) as avg_sal from dmhr.employee group by department_id having avg(salary)>10000;
语法: select () from join () on ();
DMHR 关系模型图:
案例 一:显示所有街道所在城市的名称
SELECT CITY_NAME,STREET_ADDRESS FROM DMHR.LOCATION L JOIN DMHR.CITY C ON L.CITY_ID=C.CITY_ID;
案例二:显示所有员工的名称和所在部门的名称
SELECT EMPLOYEE_NAME DEPARTMENT_NAME FROM DMHR.EMPLOYEE E INNER HASH JOIN DMHR.DEPARTMENT D ON E.DEPARTMENT_ID =D.DEPARTMENT_ID;
2.外连接
(1).左外连接 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 ;
(2)右外连接 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 ;
此时发现上述(1)中的100行数据陶健消失
(3)全外连接 FULL JOIN 左外连接+右外连接
保留上述(1)(2)的设置,此时使用全外连接
SELECT EMPLOYEE_NAME,DEPARTMENT_NAME FROM DMHR.EMPLOYEE E FULL JOIN DMHR.DEPARTMENT D ON E.DEPARTMENT_ID =D.DEPARTMENT_ID ;
子查询语法
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list FROM table);
1.单行子查询
查询和马学铭相同部门的同事的姓名和薪资:
SELECT EMPLOYEE_NAME,SALARY FROM DMHR.EMPLOYEE WHERE DEPARTMENT_ID=(SELECT DEPARTMENT_ID FROM DMHR.EMPLOYEE WHERE EMPLOYEE_NAME=' 马学铭');
2.多行子查询
运算符 含义
IN 等于列表中的任意一个
ANY 将值与子查询返回的任意一个值进行比较
ALL 将值与子查询返回的每个值进行比较
IN:
SELECT EMPLOYEE_NAME,SALARY,DEPARTMENT_ID FROM DMHR.EMPLOYEE WHERE DEPARTMENT_ID IN (101,102,103);
ALL:
>any: 大于最小值
<any:小于最大值
当出现>=或<=符号时,对应的将会出现收集信息里最大的或最小的值对应的数据。
部门编号为103的员工工资:
SELECT SALARY FROM DMHR.EMPLOYEE WHERE DEPARTMENT_ID=103;
大于所有部门编号为103的员工工资的人的姓名,工资和部门编号:
SELECT EMPLOYEE_NAME,SALARY,DEPARTMENT_ID FROM DMHR.EMPLOYEE WHERE SALARY > ALL(SELECT SALARY FROM DMHR.EMPLOYEE WHERE DEPARTMENT_ID=103);
小于所有部门编号为103的员工工资的人的姓名,工资和部门编号:
SELECT EMPLOYEE_NAME,SALARY,DEPARTMENT_ID FROM DMHR.EMPLOYEE WHERE SALARY < ALL(SELECT SALARY FROM DMHR.EMPLOYEE WHERE DEPARTMENT_ID=103);
ANY:
小于任何部门编号为103的员工工资的部门员工姓名,工资和部门编号:(小于工资最大值)
SELECT EMPLOYEE_NAME,SALARY,DEPARTMENT_ID FROM DMHR.EMPLOYEE WHERE SALARY < ANY(SELECT SALARY FROM DMHR.EMPLOYEE WHERE DEPARTMENT_ID=103);
EXISTS的用法:
EXISTS 操作符用于检查行是否在子查询的结果中存在
如果在子查询的一行中发现相同的值:
内层查询的搜索工作将不在继续
状态标记为 TRUE
如果在子查询的一行中没有发现想同的值:
状态标记为 FALSE
内层查询中继续搜索
查询已离职员工但员工表数据暂未删除的员工姓名和员工编号:
SELECT E.EMPLOYEE_ID,E.EMPLOYEE_NAME FROM DMHR.EMPLOYEE E WHERE EXISTS (SELECT * FROM DMHR.JOB_HISTORY J WHERE E.EMPLOYEE_ID=J.EMPLOYEE_ID);
更多达梦相关材料可以参考达梦数据库官方适配中心https://eco.dameng.com/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。